Linux下基于Gitlab和Jenkins的自动化部署实例(二)—构建docker镜像,并利用构建的镜像运行容器

续我的上篇博文: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版本)

1selinux和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工程时,就会报错,这该如何解决呢?请看我的下篇博文。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值