续我的上篇博文:https://mp.csdn.net/postedit/89260300。即test项目已经配置好
本篇博文配置的自动化部署之推送docker镜像是在上篇博文的hello项目构建成功之后,才触发的。
git——>gitlab——>jenkins——>docker build images——>docker engine ——>container
在实验之前,先进行设置,使得虚拟机可以上网(因为本次实验需要在安装有Jenkins软件的虚拟机server2上下载有关docker的软件)
##物理机
[root@foundation83 Desktop]# iptables -t nat -I POSTROUTING -s 172.25.83.0/24 -j MASQUERADE
##server2
[root@server2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.25.83.2
PREFIX=24
GATEWAY=172.25.83.83 #设置网关地址
DNS1=114.114.114.114 #设置DNS域名解析
[root@server2 ~]# ping www.baidu.com #测试网络是否ok
PING www.a.shifen.com (220.181.112.244) 56(84) bytes of data.
64 bytes from 220.181.112.244 (220.181.112.244): icmp_seq=1 ttl=50 time=23.0 ms
64 bytes from 220.181.112.244 (220.181.112.244): icmp_seq=2 ttl=50 time=23.7 ms
64 bytes from 220.181.112.244 (220.181.112.244): icmp_seq=3 ttl=50 time=35.0 ms
^C
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 23.070/27.307/35.090/5.513 ms
一、实验环境(rhel7.3版本)
1、selinux和firewalld状态为disabled
2、各主机信息如下:
主机 | ip |
---|---|
server1(git) | 172.25.83.1 |
server2(git,jdk,jenkins) | 172.25.83.2 |
二、基于Gitlab和Jenkins的自动化部署实例—构建docker镜像,并利用构建的镜像运行容器
1、在server2端:进入jenkins界面:在jenkins上创建一个新的自由风格的项目(项目的名字随意给,我这里给的名字是docker)
点击“新建任务”
配置界面如下图:(1)在任务名称这栏中填入“docker”;(2)选择“构建一个自有风格的软件项目”
点击确定
就这样,一个自由风格的项目(docker)就创建好了。
“点击”最上面一行的“Jenkins”,回到主界面
2、在jenkins下载有关docker的插件(Docker,CloudBees Docker Build and Publish)
系统管理—>管理插件—>可选插件
可以在过滤选择框内搜索docker,在搜索结果中选择“Docker”,和“CloudBees Docker Build and Publish”
点击“直接安装”,安装选中的这两个插件
下面的图片是插件安装成功之后的界面图
3、在server2端:安装docker的相关软件,启动docker服务,导入registry和nginx镜像,并利用registry镜像建立一个本地仓库服务。
[root@foundation83 docker]# yum install * -y
[root@server2 docker]# systemctl start docker
[root@server2 ~]# ls
docker nginx.tar registry.tar
[root@server2 ~]# docker load -i nginx.tar
[root@server2 ~]# docker load -i registry.tar
[root@server2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e548f1a579cf 13 months ago 109MB
registry 2.3.1 83139345d017 3 years ago 166MB
[root@server2 ~]# mkdir /opt/registry
[root@server2 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry/:/var/lib/registry registry:2.3.1
[root@server2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
010759261e68 registry:2.3.1 "/bin/registry /etc/…" 4 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp registry
[root@server2 ~]# netstat -antulpe | grep 5000
tcp6 0 0 :::5000 :::* LISTEN 0 31191 2596/docker-proxy
4、修改上篇博文配置好的hello项目中的配置(因为下面配置的docker项目是在hello项目构建好的基础上才触发的)
<1>配置“源码管理“——上上篇博文已经做过,不用进行修改
<2>配置构建触发器——上篇博文已经做过,不用进行修改
<3>配置“构建”
[root@server2 ~]# ll -d /var/run/docker.sock
srw-rw---- 1 root docker 0 Apr 15 11:37 /var/run/docker.sock
[root@server2 ~]# chmod 777 /var/run/docker.sock #修改docker启动时对应的套接字文件(docker.socket)的权限,使得其对jenkins用户有读写的权限
添加“增加构建步骤”中的“Docker Build and Publish”
删除之前添加的“执行shell脚本”的构建步骤
在该构建步骤中,写入如下的内容
点击“高级”,并在其中进行配置,配置图如下:
点击“保存”
就这样想要的hello项目就配置好了。
5、在创建好的docker项目中进行设定,使得该项目能够自动推送docker镜像
<1>配置“源码管理“:其配置图如下:
<2>配置“构建触发器“:其配置图如下:
<3>配置“构建“
[root@server2 ~]# vim /etc/sudoers #编辑/etc/sudoer文件,赋予jenkins用户全部的权限。并输入":wq!"强制保存退出
91 root ALL=(ALL) ALL
92 jenkins ALL=(ALL) NOPASSWD: ALL #新添加的内荣
在“构建“中的“增加构建步骤”的下拉菜单中选择“执行shell”
在命令这栏写入想要执行的shell命令
点击“保存”
就这样想要的docker项目就配置好了。
6、在server2端编写Dockerfile,进行测试,以保证Dockerfile的编写是正确的。
[root@server2 ~]# mkdir test
[root@server2 ~]# cd test/
[root@server2 test]# vim Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html
[root@server2 test]# vim index.html
xin
[root@server2 test]# docker build -t nginx:v1 .
[root@server2 test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 5c0bec80cba3 10 seconds ago 109MB
nginx latest e548f1a579cf 13 months ago 109MB
registry 2.3.1 83139345d017 3 years ago 166MB
[root@server2 test]# docker run -d --name vm1 -p 80:80 nginx:v1
[root@server2 test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c37471f8bbb6 nginx:v1 "nginx -g 'daemon of…" 8 seconds ago Up 7 seconds 0.0.0.0:80->80/tcp vm1
010759261e68 registry:2.3.1 "/bin/registry /etc/…" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp registry
[root@server2 test]# curl localhost
xin
[root@server2 test]# docker rm -f vm1
[root@server2 test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
010759261e68 registry:2.3.1 "/bin/registry /etc/…" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp registry
7、将server2端编写的Dockerfile文件以及所需要的index.html(覆盖server1之前推送的index.html文件)发送到server1端的Gitlab对应的目录(test目录)下。
[root@server2 test]# ls
Dockerfile index.html
[root@server2 test]# scp * server1:/root/test
root@server1's password:
Dockerfile 100% 49 0.1KB/s 00:00
index.html 100% 4 0.0KB/s 00:00
[root@server1 test]# pwd
/root/test
[root@server1 test]# ls
Dockerfile file1 file2 index.html README.md
[root@server1 test]# cat index.html
xin
8、在server1端:向Gitlab远程仓库推送Dockerfile文件和index.html文件
[root@server1 test]# git add Dockerfile
[root@server1 test]# git commit -m "add Dockerfile"
[root@server1 test]# git add index.html
[root@server1 test]# git commit -m "add index.html"
[root@server1 test]# git push -u origin master
9、测试:
<1>测试一:
点击“返回面板”,查看可以hello工程和docker是否已经配置好。s下面的球显示蓝色的,即表示构建成功
<2>测试二:
点击“hello”,进入hello工程的构建历史的主界面,点击“#5“左边”蓝色的球“,查看控制台输出,如果有输出,则表示hello工程已经配置好
点击“返回面板”——>“docker”,进入docker工程的构建历史的主界面,查看控制台输出,如果有输出,则表示可以docker工程已经配置好
<3>测试三:
进入Jenkins的工作目录,查看是否有Gitlab上test项目中的内容,如果有,则表示hello工程和docker工程已经配置好
[root@server2 hello]# pwd
/var/lib/jenkins/workspace/hello
[root@server2 hello]# ll
total 20
-rw-r--r-- 1 jenkins jenkins 49 Apr 15 17:07 Dockerfile
-rw-r--r-- 1 jenkins jenkins 8 Apr 15 17:00 file1
-rw-r--r-- 1 jenkins jenkins 3 Apr 15 17:03 file2
-rw-r--r-- 1 jenkins jenkins 4 Apr 15 16:57 index.html
-rw-r--r-- 1 jenkins jenkins 8 Apr 15 16:57 README.md
<4>测试四:
在server2端查看对应的tag为5的镜像是否构建成功,查看webserver容器是否在运行,并访问webserver容器。如果镜像构建成功,容器在运行并且访问成功,则表示hello工程和docker工程已经配置好
[root@server2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:5000/nginx 5 94cbfc629e0a 8 minutes ago 109MB
localhost:5000/nginx latest 94cbfc629e0a 8 minutes ago 109MB
nginx latest 344960c969db 26 minutes ago 109MB
nginx v1 5c0bec80cba3 3 hours ago 109MB
nginx <none> bb776ce48575 4 days ago 109MB
registry 2.3.1 83139345d017 3 years ago 166MB
[root@server2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75fb8c1692c8 localhost:5000/nginx "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 80/tcp webserver
010759261e68 registry:2.3.1 "/bin/registry /etc/…" 6 hours ago Up 6 hours 0.0.0.0:5000->5000/tcp registry
[root@server2 ~]# docker inspect webserver | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
[root@server2 ~]# curl 172.17.0.3
xin
值的注意的是:
1、因为在构建hello工程时,选中了“Skip Push”,即相当于没有将构建好的镜像上传到registry私有仓库中,所以/opt/registry目录中应该是没有内容的。
[root@server2 ~]# ls /opt/registry/
[root@server2 ~]#
2、我们会发现一个问题:如果修改了index.html文件的内容,重新推送到Gitlab,那么就会触发hello工程(构建docker镜像),hello工程构建成功之后,就会触发docker工程,而docker工程主要的作用就是利用新构建的镜像运行容器webserver。那如果webserver容器已经在运行,那么在构建docker工程时,就会报错,这该如何解决呢?请看我的下篇博文。