您的位置:首页 > 运维架构 > Docker

使用Docker构建持续集成与自动部署的Docker集群

2016-11-21 14:54 891 查看
为什么使用Docker



从我个人使用的角度讲的话部署来的更方便

只要构建过一次环境推送到镜像仓库迁移起来也是分分钟的事情

虚拟化让集群的管理和控制部署都更方便

hub.docker.com里面的镜像也很方便节约了很多自己生成镜像的时间

相当于提高了复用率


安装Docker



我这里使用Ubuntu14.04系统上安装

?

1
curl-shttps:
//get
.docker.io
/ubuntu/
|
sudo
sh


Ubuntu其他版本可能需要先升级一下内核

详细可参考这里



构建持续集成环境(Java)

下来开始我们今天的主题构建持续集成与自动部署的Docker集群



持续集成的目的

让我们每次更新了代码提交到git仓库后就自动运行测试构建新版本自动部署到测试或集群从来提高生产效率告别重复的劳动


持续集成和部署的原理



我们用到的所有基础设施我们都将使用Docker部署

1.推送到git仓库

2.jenkinepullgit代码运行编译镜像进行编译

3.打包生成的代码生成一个新版本的镜像推送到仓库删除当前容器重新运行新版本镜像

4.监控系统

5dockerlog集中管理LEK

本文使用的是Java的构建方式除了第三步以外其他工程也都是一样的


构建Gitlab



Gitlab作为代码仓库是我们环节的第一步(如果使用github或oscgit可以跳过这个步骤)

为了方便构建我们先安装一下docker编配工具Docker-compose

?

1

2

3
#使用python包管理工具pip安装


apt-get
install
python-pippython-dev


pip
install
-Udocker-compose


一般构建依赖关系比较复杂的容器都可以用docker-compose来配置

使用说明可以看一下这里

我们使用hub.docker.com的sameersbn/gitlab镜像来快速构建

docker-compose.yml文件如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25
gitlab:


image:sameersbn
/gitlab


ports:


-
"22:22"


-
"80:80"


links:


-gitlab-redis:redisio


-gitlab-postgresql:postgresql


environment:


-GITLAB_PORT=80


-GITLAB_SSH_PORT=22


-GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string


restart:always


gitlab-redis:


image:sameersbn
/redis


restart:always


gitlab-postgresql:


image:sameersbn
/postgresql
:9.4-12


environment:


-DB_NAME=gitlabhq_production


-DB_USER=gitlab


-DB_PASS=password


restart:always


?

1

2
#执行如下命令就可以构建gitlab了


docker-composeup-d


运行dockerps查看一下可以看到已经启动成功了





访问一下启动主机的你映射的端口即可访问我这里是80


构建Docker私有仓库



同样我们还需要一个Docker仓库来存放我们发布的镜像版本(使用公有仓库如dockerhub可以跳过此步骤)

我们采用官方镜像registry运行

运行如下命令即可

?

1

2
dockerrun-d--restart=always--nameregistry\


-
v
/mnt/docker/registry
:
/tmp/registry
-p5000:5000registry


运行dockerps即可查看运行情况

相应命令

?

1

2
dockerpull仓库ip:仓库端口/项目名拉取镜像


dockerpush仓库ip:仓库端口/项目名推送镜像


问题

docker私有仓库拉取/推送失败提示不能使用http连接

方法1设置仓库https证书即可推荐详情可见

方法2在docker启动参数里面添加–-insecure-registry0.0.0.0/0然后重启docker



构建Jenkins



我们使用jenkins来持续集成

构建同样十分简单我们使用的是hub.docker.com的jayqqaa12/jenkins镜像

执行命令

?

1

2

3
dockerrundockerrun-d-p8080:8080\


--namejenkins--restart=always-
v
/mnt/jenkins_home
:
/var/jenkins_home
\


-
v
/var/run/docker
.sock:
/var/run/docker
.sockjayqqaa12
/jenkins


参数说明:

?

1

2
-
v
/mnt/jenkins_home
:
/var/jenkins_home


#映射到本地磁盘


?

1

2
-
v
/var/run/docker
.sock:
/var/run/docker
.sock


#映射主机的docker到容器里面这样在容器里面就可以使用主机安装的docker了


然后访问8080端口就可以了

默认用户密码adminadmin


Docker-Swarm集群



我们使用Docker-Swarm来部署docker集群

部署同样十分简单

?

1

2

3

4

5

6

7

8

9

10
#运行这个这个命令后会返回一个token来替换下面命令的<token>


dockerrun--
rm
swarmcreate




#运行节点管理集群swarm来管理所有节点


dockerrun-d--nameswarm-manage--restart=always-p\


2376:2375swarmmanagetoken:
//
<token>




#在节点服务器上运行添加节点到集群中


dockerrun-d--restart=always--nameswarm-agentswarm\


join
--addr=当前服务器的ip:2375token:
//
<token>


?

1

2

3
#查看集群的节点信息


docker-H管理节点的ip:2376info


如图可见当前集群有一个节点





在集群运行容器

同理只要在添加-H管理节点的ip:2376就可以在集群上运行容器了

?

1

2
docker-H管理节点的ip:2376runxxx
#运行容器


docker-H管理节点的ip:2376
ps
xxx
#查看集群容器运行情况




HelloWorld



基础的设施我们已经搭建好了下面我们就可以开始测试一下

1)这里我新建了一个javaEEmaven项目很简单写了一个index.html





2)在gitlab新建一个docker-hello-world项目仓库





3)编写打包镜像的Dockerfile和部署到集群的脚本(放在当前项目里面就可以了)

Dockerfile

很简单的步骤把编译好的war放入镜像就可以了

这里使用的是官方tomcat镜像

?

1

2

3
FROMtomcat:8-jre8


RUN
rm
-rf
/usr/local/tomcat/webapps


ADD.
/target/ROOT
.war
/usr/local/tomcat/webapps/ROOT
.war


build.sh部署使用的脚本

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31
#!/bin/bash


#buildinjenkins


#你的docker仓库的地址


REG_URL=XXX


#你的swarmmanage节点的地址


SWARM_MANAGE_URL=xx:2376


#根据时间生成版本号


TAG=$REG_URL/$JOB_NAME:`
date
+%y%m%d-%H-%M`


#使用maven镜像进行编译打包出war文件(其他语言这里换成其他编译镜像)


dockerrun--
rm
--namemvn-
v
/mnt/maven
:
/root/
.m2\


-
v
/mnt/jenkins_home/workspace/
$JOB_NAME:
/usr/src/mvn
-w
/usr/src/mvn/
\


maven:3.3.3-jdk-8mvnclean
install
-Dmaven.
test
.skip=
true




#使用我们刚才写好的放在项目下面的Dockerfile文件打包


dockerbuild-t$TAG$WORKSPACE/.


dockerpush$TAG


dockerrmi$TAG


#如果有以前运行的版本就删了


if
docker-H$SWARM_MANAGE_URL
ps
-a|
grep
-i$JOB_NAME;
then


docker-H$SWARM_MANAGE_URL
rm
-f$JOB_NAME


fi


#运行到集群


docker-H$SWARM_MANAGE_URLrun-d-p80:8080--name$JOB_NAME$TAG


4)在jenkins上新建一个docker-hello-world项目

选择自由风格即可





设置一下git仓库地址





设置一下触发器为了方便起见这里设置每分钟拉取一下也可以设置一下gitlabhook

同时设置一下构建要执行的脚本就执行我们刚才写好的脚本即可





5)那么开始推送到我们的仓库

然后查看jenkinsconsole就可以看到执行的过程了已经看到已经执行成功了





访问一下已经部署到集群了(关于集群的负载均衡部署这里就不讲了)





6)更新版本

修改一下index.html然后再次推送





等待2~3分钟后我们就可以看到已经重新部署成功了就是怎么简单





问题1为什么要把war包打包进容器而不是挂载新的war包

解答:docker的理念是一个整体一个整体的运行环境而不是单纯的war包更适合整体迁移

问题2:这样镜像不会很大么下载会不会很不方便

解答:因为docker的镜像是多层依赖的所以除了第一次下载慢一点以后都会复用之前相同的层

所以下载的是不同的部分在本实例中只是war包的部分



Docker管理监控系统



如何管理容器查看容器运行情况日志等都不太方便我们需要搭建一个监控平台

这里我们采用csphere的docker管理平台、

在管理节点执行以下命令就可以安装了管理程序

?

1

2
curl-SsL-o
/tmp/csphere-install
.shhttps:
//csphere
.cn
/static/csphere-install-v2
.sh


sudo
env
ROLE=controllerCSPHERE_VERSION=1.0.1
/bin/sh
/tmp/csphere-install
.sh


在集群的节点安装Agent

访问controllerA主机的1016端口点击左侧的“主机”菜单,进入主机列表页面,

点击添加主机并复制脚本,在Agent主机安装Agent程序

然后就可以查看和管理docker容器了具体查看文档这里就不多提了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  docker
相关文章推荐