续我的上篇博文: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>配置“源码管理“——上上篇博文已经做过&#xff0c;不用进行修改
<2>配置构建触发器——上篇博文已经做过&#xff0c;不用进行修改
<3>配置“构建”
[root&#64;server2 ~]# ll -d /var/run/docker.sock
srw-rw---- 1 root docker 0 Apr 15 11:37 /var/run/docker.sock
[root&#64;server2 ~]# chmod 777 /var/run/docker.sock #修改docker启动时对应的套接字文件(docker.socket)的权限,使得其对jenkins用户有读写的权限
添加“增加构建步骤”中的“Docker Build and Publish”
删除之前添加的“执行shell脚本”的构建步骤
在该构建步骤中&#xff0c;写入如下的内容
点击“高级”&#xff0c;并在其中进行配置&#xff0c;配置图如下&#xff1a;
点击“保存”
就这样想要的hello项目就配置好了。
5、在创建好的docker项目中进行设定&#xff0c;使得该项目能够自动推送docker镜像
<1>配置“源码管理“&#xff1a;其配置图如下&#xff1a;
<2>配置“构建触发器“&#xff1a;其配置图如下&#xff1a;
<3>配置“构建“
[root&#64;server2 ~]# vim /etc/sudoers #编辑/etc/sudoer文件,赋予jenkins用户全部的权限。并输入":wq!"强制保存退出
91 root ALL&#61;(ALL) ALL
92 jenkins ALL&#61;(ALL) NOPASSWD: ALL #新添加的内荣
在“构建“中的“增加构建步骤”的下拉菜单中选择“执行shell”
在命令这栏写入想要执行的shell命令
点击“保存”
就这样想要的docker项目就配置好了。
6、在server2端编写Dockerfile&#xff0c;进行测试&#xff0c;以保证Dockerfile的编写是正确的。
[root&#64;server2 ~]# mkdir test
[root&#64;server2 ~]# cd test/
[root&#64;server2 test]# vim Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html
[root&#64;server2 test]# vim index.html
xin
[root&#64;server2 test]# docker build -t nginx:v1 .
[root&#64;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&#64;server2 test]# docker run -d --name vm1 -p 80:80 nginx:v1
[root&#64;server2 test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c37471f8bbb6 nginx:v1 "nginx -g &#39;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&#64;server2 test]# curl localhost
xin
[root&#64;server2 test]# docker rm -f vm1
[root&#64;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&#64;server2 test]# ls
Dockerfile index.html
[root&#64;server2 test]# scp * server1:/root/test
root&#64;server1&#39;s password:
Dockerfile 100% 49 0.1KB/s 00:00
index.html 100% 4 0.0KB/s 00:00
[root&#64;server1 test]# pwd
/root/test
[root&#64;server1 test]# ls
Dockerfile file1 file2 index.html README.md
[root&#64;server1 test]# cat index.html
xin
8、在server1端&#xff1a;向Gitlab远程仓库推送Dockerfile文件和index.html文件
[root&#64;server1 test]# git add Dockerfile
[root&#64;server1 test]# git commit -m "add Dockerfile"
[root&#64;server1 test]# git add index.html
[root&#64;server1 test]# git commit -m "add index.html"
[root&#64;server1 test]# git push -u origin master
9、测试&#xff1a;
<1>测试一&#xff1a;
点击“返回面板”&#xff0c;查看可以hello工程和docker是否已经配置好。s下面的球显示蓝色的&#xff0c;即表示构建成功
<2>测试二&#xff1a;
点击“hello”&#xff0c;进入hello工程的构建历史的主界面&#xff0c;点击“#5“左边”蓝色的球“&#xff0c;查看控制台输出&#xff0c;如果有输出&#xff0c;则表示hello工程已经配置好
点击“返回面板”——>“docker”&#xff0c;进入docker工程的构建历史的主界面&#xff0c;查看控制台输出&#xff0c;如果有输出&#xff0c;则表示可以docker工程已经配置好
<3>测试三&#xff1a;
进入Jenkins的工作目录&#xff0c;查看是否有Gitlab上test项目中的内容&#xff0c;如果有&#xff0c;则表示hello工程和docker工程已经配置好
[root&#64;server2 hello]# pwd
/var/lib/jenkins/workspace/hello
[root&#64;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>测试四&#xff1a;
在server2端查看对应的tag为5的镜像是否构建成功&#xff0c;查看webserver容器是否在运行&#xff0c;并访问webserver容器。如果镜像构建成功&#xff0c;容器在运行并且访问成功&#xff0c;则表示hello工程和docker工程已经配置好
[root&#64;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 bb776ce48575 4 days ago 109MB
registry 2.3.1 83139345d017 3 years ago 166MB
[root&#64;server2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75fb8c1692c8 localhost:5000/nginx "nginx -g &#39;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&#64;server2 ~]# docker inspect webserver | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
[root&#64;server2 ~]# curl 172.17.0.3
xin
值的注意的是&#xff1a;
1、因为在构建hello工程时&#xff0c;选中了“Skip Push”&#xff0c;即相当于没有将构建好的镜像上传到registry私有仓库中&#xff0c;所以/opt/registry目录中应该是没有内容的。
[root&#64;server2 ~]# ls /opt/registry/
[root&#64;server2 ~]#
2、我们会发现一个问题&#xff1a;如果修改了index.html文件的内容&#xff0c;重新推送到Gitlab&#xff0c;那么就会触发hello工程(构建docker镜像)&#xff0c;hello工程构建成功之后&#xff0c;就会触发docker工程&#xff0c;而docker工程主要的作用就是利用新构建的镜像运行容器webserver。那如果webserver容器已经在运行&#xff0c;那么在构建docker工程时&#xff0c;就会报错&#xff0c;这该如何解决呢&#xff1f;请看我的下篇博文。