概述
基于Jenkins、Gitlab构建持续集成、持续交付的Docker容器集群。
准备
环境
- Linux系统(以ubuntu示例)
- Docker运行环境
- docker-compose编排工具
安装Docker
安装Docker执行以下命令:
注:升级内核
安装docker-compose
默认的[官方文档][]安装命令如下:
搭建基础服务
CI、CD涉及的基础服务有:
- 代码仓库(以Gitlab示例)
- 镜像仓库(以搭建私有镜像仓库示例)
- 代码构建(以Jenkins示例)
- 容器集群(以swarm示例)
代码仓库(构建Gitlab服务)
GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目;类似于Github。
选一台主机以docker化的方式来搭建Gitlab服务。(已有私有Gitlab仓库或使用Github,可跳过此步骤)
我们选择Docker Hub上的sameersbn/gitlab镜像来快速构建Gitlab服务。
根据sameersbn/docker-gitlab给出的文档,我们需要启动三个容器组件.
Docker cli启动方式
- 启动postgresql容器(可使用外部数据、也可使用mqsql存储,具体参见文档)
|
|
启动redis容器
123docker run --name gitlab-redis -d \--volume /srv/docker/gitlab/redis:/var/lib/redis \sameersbn/redis:latest启动gitlab容器
1234567891011docker run --name gitlab -d \--link gitlab-postgresql:postgresql --link gitlab-redis:redisio \--publish 10022:22 --publish 10080:80 \--env 'GITLAB_PORT=10080' \--env 'GITLAB_SSH_PORT=10022' \--env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \--env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \--env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \--volume /srv/docker/gitlab/gitlab:/home/git/data \sameersbn/gitlab:latest
docker-compose启动方式
通常处理复杂容器之间的配置依赖关系可以使用docker-compose工具来管理,用法参见docker-compose文档。
使用docker-compose的启动方式,需要docker-compose.yml文件,内容如下:
执行以下命令,构建gitlab服务
测试
执行docker ps命令查看:
访问\
镜像仓库(构建Docker私有仓库)
镜像管理是Docker容器的核心,Docker官方在Github上有一个项目docker-registry, 专门用于自建Docker的私有镜像库。
在CI、CD中,需要一个Docker镜像仓库来存放每次构建的镜像(使用公有镜像仓库如Docker Hub可以自行跳过)。
从镜像的安全、可靠、访问速度等因素考虑,搭建一个私有的镜像仓库,对企业级开发和实践是很有必要的。
Docker cli构建方式
最简便的创建方式:
docker-compose构建方式
编写docker-compose.yml文件,内容如下:
执行docker-compose up -d命令
测试
- 执行docker ps 可查看registry容器运行状态。
- 测试推送/拉取 12docker pull 镜像仓库ip:端口/<命名空间>/项目名称 # 拉取镜像docker push 镜像仓库ip:端口/<命名空间>/项目名称 # 推送镜像
注:docker私有镜像仓库 拉取/推送 失败,提示不能使用http连接。解决方法:
1、设置https访问,参见企业级的Docker Registry搭建。
2、在docker启动参数里添加–insecure-registry \
镜像构建(搭建Jenkins服务)
Jenkins是基于Java开发的一种开源持续集成工具,监控并触发持续重复的工作,具有开源,支持多平台和插件扩展,安装简单,界面化管理等特点。Jenkins使用job来描述每一步工作,节点是用来执行项目的环境。Master节点是Jenkins job的默认执行环境,也是Jenkins应用本身的安装环境
使用官方的Jenkins镜像来构建我们的Jenkins服务。
Docker cli构建方式
执行以下命令:
参数说明:
docker-compose构建方式
编写docker-compose.yml文件,内容如下:
执行docker-compose up -d命令
测试
- 执行docker ps 查看jenkins容器运行情况
- 在浏览器中,打开http://\
:8080,进入jenkins,默认用户/密码(admin/admin)
容器集群(构建Docker Swarm集群)
容器集群管理工具主要有k8s、mesos、swarm,以及从Docker1.12版本出现的swarmkit。这里以swarm示例容器集群的简单操作。
Swarm是Docker官方发布的一套较为简单的容器集群管理工具,它将一群Docker宿主机变成一个单一的虚拟主机。Swarm使用标准的Docker API接口,因此能可以很方便地和docker的标准API进行集成。
下面,使用Docker-Swarm来创建一个docker容器集群
|
|
|
|
查看当前集群信息,只有一个节点:
|
|
以上是使用swarm集群运行、查看容器,更多swarm集群操作详见swarm文档。
注:节点发现无法连接,则需要在Docker daemon添加启动参数:
Demo: 基于Docker构建持续集成(CI)、持续部署(CD)的Flask项目
以上,我们搭建了基于Docker的CI、CD的基础服务,下面我们创建一个Flask项目的Demo来测试下:
- 在gitlab创建python-hello-world项目仓库
- clone项目,本地开发
- 配置jenkins
- 触发构建
gitlab上新建项目
在gitlab创建python-hello-world项目仓库。
本地开发
编写Flask应用
创建app.py
创建requirements.txt:
编写Dockerfile
创建Dockerfile
创建构建部署脚本
创建build_deploy.sh
配置Jenkins
在Jenkins上创建一个python-hello-world项目,选择自由风格即可:
设置git:
设置构建触发器,这里设置每分钟拉取一次,也可设置gitlab hook:
设置构建需要执行的脚本,这里设置成build_deploy.sh:
触发CI、CD
推送到代码到gitlab的master分支,然后查看jenkins console,就可以查看到构建集成和部署的过程。
访问测试
访问浏览器,已经部署到swarm集群(关于集群的负载均衡,请自行查阅。)
更新代码版本,并推送到代码仓库gilab:
等待2分钟,可以在jenkins查看到新的构建是否成功,访问浏览器:
容器监控
关于采集容器运行信息数据、查看容器运行情况、日志等,通过命令行的方式是很不方便的,因此我们需要搭建一个容器监控平台,开源的工具有
如何管理容器 查看容器运行情况 日志等都不太方便 我们需要搭建一个监控平台cAdvisor等。(这里不再叙述)