devops 基于 Docker 的 CI/CD 流水线实践

点点点在乎 · 2017年07月07日 · 最后由 Neo Chen 回复于 2018年12月05日 · 2147 次阅读

该篇内容主要讲解如何借助开源工具结合 CI/CD 的场景,将 Docker 融入到部署单元中去,进行持续集成、测试到最终的持续部署,开发人员最终只需要去关注业务的访问入口就可以知道业务是否正常,并可以通过一系列的监控工具去及时发现业务异常。
在整个 DevOps 部署流水线中需要以下几个部分:CI 部分、CD 部分、服务调度(治理)部分、监控部分、日志部分。本篇文章将通过一个简单的 go-web 应用去进行基于 Docker 的 CI/CD 流水线的测试。
一个完整的流程:用户(也就是开发人员)将包含 Dockerfile 的源码从本地 push 到 Git 服务器上,然后触发 Jenkins 进行构建源码,源码构建完成后紧接着进行 Docker image 的构建,一切构建完成之后,顺带将构建成功的 image 上传到企业内部的镜像仓库,到此刻为止,其实一个基本的 CI(持续集成)已经算是结束,剩下的部分就是持续部署或者进行持续的交付开发产物了。
在以前传统的软件发布模式中,持续集成的产物是编译打包好的代码,如果想要发布程序,发布系统需要在持续集成的制品库中去获得对应的代码,然后根据一系列的环境检查来准备应用的运行时环境,而在此过程中往往会涉及到比较多的基本组件依赖,所以在整体的发布周期内来看,还是有一些问题的。
在 Docker 或者容器时代,我们将容器的镜像构建部分融入到持续集成(CI)环节,最终持续集成的产出物是一些已经处理好依赖关系,基本不需要人工进行二次干预的 Docker image,而在 CD 环节,发布系统只需要设置和管理很少的信息就能够很快将 image 运行起来,快速地将业务发布出去。
在上面整个环节中,其实无非就是增加了 Docker 的那一层处理,但其实在整个软件开发的生命周期中,它是产生了极大的影响的。
首先,部署系统不需要为统一的部署框架去做更多逻辑抽象,业务研发在开发代码的过程中选择自己依赖的 base image 即可,最终运行起来的业务也就是你当时提供的 base image 的模样;其次,由于 base image 已经处理好了相关的依赖,所以当发布系统拿到业务的 image 的时候,发布操作将会变得异常迅速,这对于互联网时代可谓是非常重要的;最后一点,也是我感受最深的,就是研发构建好的 image 可以在任何的 Docker 环境中 run 起来,研发人员不需要再关系环境一致性的问题,他们在自己本地的测试环境能够运行起来的应用,那么到生成环境也一定可以。
为什么第三点我感触比较深呢?因为以前经常有研发兄弟跑过来跟我们讲,我们代码在本地运行一切顺利,代码给你们上到生产就各种问题。所以如果在整个流程中使用 Docker image 来讲所有的环境固化,从此 mm 就再也不用担心和研发兄弟扯皮环境不一致的问题啦。
基于 Docker 的 CI/CD 的开源方案实现
一、自助式 Git 管理工具 Gogs 的部署安装
Gogs 部署在 10.0.0.1 主机上,映射到宿主机端口为 32770
$ docker run -itd -p 32770:3000 -v /export/CI-CD/mygit:/data --name jdjr-gogs gogs:17-04-25
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4dd6c6719c7 10.0.0.3:5001/gogs:17-04-25 "/app/gogs/docker/sta" 2 days ago Up 2 days 0.0.0.0:10022->22/tcp, 0.0.0.0:32770->3000/tcp jdjr-gogs

MySQL 部署在 10.0.0.2 上,映射到宿主机端口为 32771
$ docker run -itd -p 32771:3306 --name jdjr-mysql pandora-mysql
由于该 mysql 只是一个中间件,并不带有业务属性,因此需要进去进行配置数据库。
$ docker exec -it jdjr-mysql bash
bash-4.1# mysqladmin -u root -p password 123456
Enter password:
bash-4.1# mysql -uroot -p123456
mysql> create database gogs;
mysql> create user 'root'@'10.0.0.1' IDENTIFIED BY '123456';
mysql> grant all on gogs.* to 'root'@'%';

上面两步没有问题之后就可以直接访问:ip:32770(也就是 Gogs 暴露的端口)进行相关的配置。
配置数据库相关:

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞

你这样每次新开容器还要去内部改数据库配置挺麻烦的,如果不保存到镜像,容器没了又得启动镜像再改一次。还不如将配置文件挂载到宿主机,或者是在 Dockerfile 的 Entrypoint 或者 CMD 入口点修改 mysql 的配置文件。

建议排一下版

李雷雷 回复

容器内应用的配置可以通过脚本或者启动参数来进行配置,就不用每次运行容器之后还需要手动配置

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册