docker会用了?不来了解一下全自动构建部署吗

docker+github+shell实现自动部署

Posted by LY on December 20, 2018

前言

  1. hello,我如约来了,今天给大家说一说以下几点。
    1. 如何使用github实现自动构建镜像?
    2. 如何手动推送(push)拉取(pull)镜像?
    3. 如何使用github+docker hub(官方)+shell定时任务实现项目自动构建、部署。
  2. 上面的三点呢,都是我亲手去验证过的,完全没有问题的一种方式。当然如果大家有什么更好的方式,可以在评论或者是私信告诉我,保持一颗求知的心!!!
  3. 同时呢也希望大家关注、支持我!!!

docker配合github实现镜像自动构建

  1. 登陆docker hub创建自己的账户,并且创建一个镜像仓库,那这里值得说一句的是,每一个docker账户都可以免费拥有一个私有的docker仓库。当然,如果你觉得少的话也可以花钱购买价格也并不是很高。那我们就来创建一个仓库。

    屏幕快照 2018-12-20 下午3.40.05 (https://ws2.sinaimg.cn/large/006tNbRwly1fyd9aflbd0j31hc0u0tcu.jpg)

  2. 我这里创建过一个私有的仓库了,所以这里选择了共有仓库。

  3. 同时呢我们在下方配置自动构建,与github相关联。如果你的github仓库有所变动,他会自动从你的github仓库中拉取文件以及Dockerfile然后构建成相应的镜像到仓库中。

  4. 详细的自动构建配置如下

    WeChat3c02c07b61939e4b6c633553a17140db

  5. 接下来就是创建一个git本地仓库,新建Dockerfile

    from hub.c.163.com/library/tomcat
    # 把测试war包放入tomcat镜像中的webapps文件夹中
    COPY test.war /usr/local/tomcat/webapps
    
  6. git仓库如下

    WeChat4d4eba967086c5337b4065ac311b339c

  7. 那紧接着把我们的仓库推送到github

    $ cd test
    $ git add .
    $ git commit -m "push test docker auto"
    $ git push
    
  8. 当我们推送完成后,docker hub中会有对饮过的标记

    WeChatebe90bc2944fc38d60655e28b431c4a0

  9. 过一段时间呢会变成这样WeChat1c79f7d4b752e74af56866cfbcf6383f

  10. 着呢就是在自动构建镜像,构建的时间会相对比较久。完成后呢会变成这样WeChat88d42f8a9cfddfccc66538f45246284d

  11. 这样呢代表构建完毕,在docker仓库里面呢会有对应标签的镜像生成WeChat017d327675a26442861013f2c855b088

  12. 这样就算是完事了,可见你只要了解dockerfile,在你的开发环境无需安装docker即可在远程仓库实现镜像的自动构建。我觉得是非常方便一种方式。

docker手动拉取(pull)、推送(push)

  1. 刚才说了通过github实现自动构建,非常的方便快捷,但是可能有些人还是想要了解一下如何手动的构建镜像并推送到doceker hub或者是从docker hub拉取镜像。

  2. 构建我们之前的文章有提到,这里就不再赘述,简单的列出命令

    $ docker build -t dockerUserName/test:test .
    
  3. 推送命令

    $ docker push dockerUserName/test:test
    
  4. 拉取命令

    $ docker pull dockerUserName/test:test
    

docker配合github、shell脚本、定时任务实现全自动部署

说明

  1. 上面已经做过了,我们配置好了github和docker hub,他会自动构建docker镜像,我们需要做的只是在服务器配置拉取镜像,启动镜像。
  2. 首先我们来说一下思路。
    1. 镜像已经构建好了,那我们只需要在服务器把镜像拉取下来。
    2. 启动定时任务,定时执行拉取动作。
    3. 如果拉取结果中有更新则停止镜像,删除对应的容器。
    4. 拉取完毕后启动更新后的镜像即可完成部署。
  3. 在这里呢我也提前说明一下问题:因为当前我只知道通过docker容器的id停止和删除容器,而且他的id每次启动都不相同。所以目前只是实现了停止所有运行中的容器并删除所有非运行状态的容器,这是一个弊端,需要改进。

实现

  1. 首先我们添加启动定时任务

    # 编辑crontab任务列表
    $ vim /etc/crontab
    # 在文件的最后一行加入 
    */1 *   * * *   root    bash /root/shell.sh
    # 意为每分钟以root身份执行一次shell.sh脚本
    
  2. 编写我们的shell.sh脚本

    # 执行 docker pull docker用户名/test:test 并将返回值赋给result
    result=`docker pull docker用户名/test:test`
    # 获取当前时间
    time=$(date "+%Y%m%d-%H%M%S")
    # 将当前时间打印到日志文件
    echo $time >> log.log
    # 打印 docker pull的返回值
    echo $result >> log.log
    # 用作判断
    sureresult="Pull complete"
    # 判断result中是否包含有sureresult。若包含"Pull complete"则代表镜像有更新,则执行如下命令
    if [[ ${result} == *${sureresult}* ]]
    then
        # 停止所有正在运行中的容器,并删除
        stop=`docker stop $(docker ps -q) & docker rm $(docker ps -aq)`
        # 启动更新后的镜像
        start=`docker run -d -p 80:8080 docker用户名/test:test`
        # 打印日志
        echo $stop >> log.log
        echo $start >> log.log
    else
        echo "没有更新" >> log.log
    fi
    

结束语

  1. 这样呢,我们的自动构建、自动部署算是完成了,之后你只需要推送github即可享受一步到位的服务。
  2. 当然,还是存在很多的问题,接下来的目标:
    1. 实现只停止和删除有更新的镜像对应容器,而不影响其他容器的正常运行。
    2. 优化日志打印。
    3. 优化脚本
  3. 最后呢感谢大家的关注和阅读,希望文章对大家有所增益。
  4. 学习更多知识,下跳更多。