Docker:使用Jenkins构建Docker镜像
一、介绍Jenkins
Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时Jenkins能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。并且Jenkins提供了大量的插件,能够完成各种任务。
今天我需要使用Jenkins构建一个Docker镜像,然后自动push到docker registry中。到了docker registry中,后面测试人员就可以把镜像发布到测试环境,测试如果没有问题就可以发布到线上环境,大概流程如下图:
上图就是我生产使用方式,其中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
|
然后设置一下用户密码,就正式进入到了Jenkins配置界面。
首先,需要安装一些必要的插件SCM Sync Configuration Plugin ,GitHub plugin ,GIT plugin ,GIT client plugin,在系统管理->插件管理里面安装,安装结束后重启jenkins即可。
然后创建一个项目为nginx。
然后配置一下源码管理,Git地址:https://github.com/dongwenpeng/nginx
就下面几个文件,主要是dockerfile,然后提供了一些nginx配置文件以及web文件。
1
2
3
4
5
|
.conf
dockerfile
.conf
web
.zip
|
如下配置,也可以使用你本地的Git仓库:
主要就是构建脚本了。
脚本内容
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了。