Docker:使用Jenkins构建Docker镜像  

一、介绍Jenkins

Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时Jenkins能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。并且Jenkins提供了大量的插件,能够完成各种任务。

今天我需要使用Jenkins构建一个Docker镜像,然后自动push到docker registry中。到了docker registry中,后面测试人员就可以把镜像发布到测试环境,测试如果没有问题就可以发布到线上环境,大概流程如下图:

Docker:使用Jenkins构建Docker镜像
 

上图就是我生产使用方式,其中Jenkins master使用docker的好处就是方便后面迁移,而Jenkins slave不适用docker的原因就是在docker中再次安装docker进行镜像构建太麻烦了,索性直接使用主机。而registry部分有两个节点,他们之间的数据使用DRBD同步,外借助于haproxy+keepalived实现registry的高可用。

下面先介绍Jenkins构建docker镜像,在使用Jenkins构建Docker镜像之前,最好先看一下Docker:使用Dockerfile构建Nginx镜像。更有助于理解。

二、安装Jenkins

1. 添加Jenkins的源(repository)

 
1
2
.repo
.key

2. 安装JDK

 
1
y
 
1
2
3
4
version
)
)

3. 安装Jenkins

 
1
y
 
1
2
Version
2.38

到此,Jenkins就安装完成了。然后就可以启动Jenkins。

 
1
jenkins

Jenkins默认监控端口8080。

 
1
2
3
4
nplt
)
name    
java

启动如果出现错误:”Starting Jenkins -bash: /usr/bin/Java: No such file or directory”,表示Jenkins找不到java。这时就需要编译配置文件/etc/init.d/jenkins,把java路径加上即可。

三、Jenkins文件说明

/usr/lib/jenkins/:jenkins安装目录,WAR包会放在这里。

 
1
2
3
/
66980
.war

 /etc/sysconfig/jenkins:jenkins配置文件,其”端口”,”JENKINS_HOME”等都可以在这里配置。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

/var/lib/jenkins/:默认的JENKINS_HOME。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/
32
.xml
.xml
.enc
.state
jobs
logs
.xml
nodes
plugins
.bak
.key
secret
secrets
updates
userContent
users

/var/lib/jenkins/jobs/${project_name}/workspace/:Jenkins项目的工作空间,存储从Git或SVN下载的内容,${project_name}就是其项目名称。

/var/log/jenkins/jenkins.log:Jenkins日志文件。

四、配置Jenkins构建镜像

如果没有特别配置端口,使用http://<ip address>:8080/登录Jenkins,并进行相关配置(插件安装、权限配置、View/Job创建等等)。

第一次登陆Jenkins时需要解锁,把如下秘钥填写进去即可。

 
1
2
initialAdminPassword
a737ebbbfece4e6991cf70d45a299ed5

Docker:使用Jenkins构建Docker镜像
 

然后设置一下用户密码,就正式进入到了Jenkins配置界面。

首先,需要安装一些必要的插件SCM Sync Configuration Plugin ,GitHub plugin ,GIT plugin ,GIT client plugin,在系统管理->插件管理里面安装,安装结束后重启jenkins即可。

然后创建一个项目为nginx。

Docker:使用Jenkins构建Docker镜像
 

然后配置一下源码管理,Git地址:https://github.com/dongwenpeng/nginx

就下面几个文件,主要是dockerfile,然后提供了一些nginx配置文件以及web文件。

 
1
2
3
4
5
.conf
dockerfile
.conf
web
.zip

如下配置,也可以使用你本地的Git仓库:

Docker:使用Jenkins构建Docker镜像
 

主要就是构建脚本了。

Docker:使用Jenkins构建Docker镜像
 

脚本内容

 
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
#
`
 
.log
 
)
 
then
1
fi

配置结束后,保存。

五、配置jenkins用户

此时还不能立即构建,因为jenkins触发脚本并不是root用户,因此需要将jenkins免密码,并将用户加入到docker组。

 
1
2
3
jenkins
requiretty
ALL

第一行表示仅jenkins用户不需要控制终端,不然在Jenkins脚本中无法使用sudo。

 
1
jenkins

六、开始构建镜像

在jenkins的build记录中可以看到输出,由于jenkins会自动把github上的文件给下载下来放在workspace目录中。因此,触发脚本后,直接开始构建nginx镜像。

 
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
admin
workspace
# timeout=10
repository
# timeout=10
nginx
# timeout=10
*
# timeout=10
# timeout=10
)
# timeout=10
c0148c6714be8a64710d87e2ebc3395573dfcb0f
# timeout=10
.sh
kB
MB
MB
MB
MB
MB
 
nginx
nginx
2a07a07e5bbf62e7b583cbb5257357c7e0ba1a8e9650e8fa76d999a60968530f
latest
19146d5729dc
dkey
cache
715cd864289f
nginx
cache
919de987c861
nginx
cache
12bb383d0cdc
web
cache
69561736d70e
nginx
cache
c9be367631c7
p
cache
137c4decd554
nginx
cache
4262ffbc2a5c
web
ac936a598dc4
1efe9556276a
.conf
2b6f7ab35d9f
12b1066d8808
.conf
619fc14e58bf
362067e9bbce
80
ace973e663f0
7982205f27dd
ace973e663f0
892e45827ff4
63375850b045
892e45827ff4
63375850b045
SUCCESS

构建完成后,可以去Jenkins主机看看镜像是否完成。

 
1
2
3
4
images
SIZE
MB
MB

可以看到已经构建完成了,下面直接启动此镜像。

 
1
nginx_12272051
 
1
2
3
ps
NAMES
nginx

七、推送到远程仓库

现在使用Jenkins构建Docker镜像已经没有问题了,下面就可以把Jenkins构建完的镜像直接推送到远程的registry中。关于构建私有docker registry可以看Docker:搭建私有仓库(Registry 2.4)

当远程仓库搞定后,其实Jenkins这边做的并不是太多,只需要把构建脚本修改一下,在构建完成后直接推送到远程仓库就OK了。