server1 172.25.63.1 gitlab主机,git
server2 172.25.63.2 jenkins+docker主机 git
server3 172.25.63.3 harbor仓库主机 docker
server4 172.25.63.4 docker主机

一、jenkins调用本机docker

1、配置jenkins + gitlab自动触发更新

安装gitlab插件

首先需要在jenkins安装gitlab插件:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_docker

jenkins项目demo配置

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_git_02


jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_git_03

gitlab配置默认情况下gitlab不允许在本地调用,因此我们需要设置本地调用:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_git_04

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_IP_05

再针对项目进行设置,点击项目 --> demo —> webhook:、

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_IP_06

2.将harbor仓库部署在server3 (172.25.63.3)上。

3.需要在jenkins安装docker的插 件并连接harbor

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_docker_07

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_IP_08

添加认证如下:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_docker_09

4.在server2上安装daocker和git,

需要更改docker.sock的权限(jenkins使用的是普通用户jenkins,因此需要添加权限):

[root@server2 ~]# chmod 777 /run/docker.sock

同时确保server2可以连接上server3部署的harbor仓库(证书,解析,daemon。json都需要做)。

可以先在server2拉取nginx节省以后的时间。

5.接下来需要进行测试,在git仓库主机server1创建Dockerfile:

vim Dockerfile

FROM nginx
EXPOSE  80
COPY index.html /usr/share/nginx/html


git add Dockerfile
git commit -m "add dockerfile"
git push -u origin master

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_git_10

这个变更就会触发jenkins的更新:

可以看到构建成功:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_IP_11

添加构建后的动作。接下来我们新建一个项目docker:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_docker_12

配置项目docker:设置在demo构建稳定后执行触发:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_git_13

其动作为使用刚刚创建的镜像构建一个容器

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_git_14

流程是 用户通过git将代码提交到gitlab,gitlab通过其配置的webhook方式触发jenkins,jenkins调用docker build 插件通过dockerfile创建镜像然后推送到harbor仓库上,之后触发jenkins 里的项目docker执行docker run命令,创建容器。

二、Jenkins调用远程docker主机上传镜像到harbor

我们在上个实验中设置的Docker Host URI为本地主机 unix:///…,这里的主机指的是jenkins本地的docker引擎,接下来我们实现远程主机的docker调用:

首先准备虚拟机 server4(172.25.63.4),并安装docker,
开启docker后默认不会打开对外的接口,我们需要打开这个端口,打开时我们需要进行tls加密:

生成key和ca证书:

[root@server4 ~]# openssl genrsa -aes256 -out ca-key.pem 4096
Generating RSA private key, 4096 bit long modulus
.........................++
.............++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:			#这里输入密码
Verifying - Enter pass phrase for ca-key.pem:
[root@server4 ~]# openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
Enter pass phrase for ca-key.pem:			#输入刚才的密码
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:**
State or Province Name (full name) []:***
Locality Name (eg, city) [Default City]:**
Organization Name (eg, company) [Default Company Ltd]:**
Organizational Unit Name (eg, section) []:**
Common Name (eg, your name or your server's hostname) []:server4		#这里写上主机名。
Email Address []:test@11.com

生成server-key和csr文件(server4为dcker主机名):

[root@server4 ~]# openssl genrsa -out server-key.pem 4096
[root@server4 ~]# openssl req -subj "/CN=server4" -sha256 -new -key server-key.pem -out server.csr

可以使用ip地址方式进行tls连接:

[root@server4 ~]# openssl req -subj "/CN=server4" -sha256 -new -key server-key.pem -out server.csr
[root@server4 ~]# echo subjectAltName = DNS:server4,IP:172.25.63.4,IP:127.0.0.1 >> extfile.cnf
[root@server4 ~]# echo extendedKeyUsage = serverAuth >> extfile.cnf
[root@server4 ~]# 
[root@server4 ~]# cat extfile.cnf
subjectAltName = DNS:server4,IP:172.25.63.4,IP:127.0.0.1
extendedKeyUsage = serverAuth
[root@server4 ~]# 
[root@server4 ~]# openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem   -CAcreateserial -out server-cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=server4
Getting CA Private Key
Enter pass phrase for ca-key.pem:			#输入刚才的密码

接下来安装docker证书:

[root@server4 ~]# cp ca.pem server-cert.pem server-key.pem /etc/docker/
[root@server4 ~]# cp /usr/lib/systemd/system/docker.service /etc/systemd/system/
[root@server4 ~]# vim /etc/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376

重启docker:

[root@server4 ~]# systemctl daemon-reload 
[root@server4 ~]# systemctl restart docker
[root@server4 ~]# netstat -antlp | grep 2376
tcp6       0      0 :::2376                 :::*                    LISTEN      4032/dockerd

可以看到2376端口已经打开说明远程主机的docker已经可以使用。

接下来进行jenkins的配置。

对项目demo进行配置:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_docker_15

其中server credentials中添加的信息需要客户端的认证:

[root@server4 ~]# openssl genrsa -out key.pem 4096
[root@server4 ~]# openssl req -subj '/CN=client' -new -key key.pem -out client.csr
[root@server4 ~]# echo extendedKeyUsage = clientAuth >> extfile.cnf
[root@server4 ~]# openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem   -CAcreateserial -out cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem:			#输入刚才的密码

此时就生成了客户端的证书(cert.pem)和key(key.pem)。

在网页端添加:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_git_16

之后保存。使server4能够连接harbor仓库,需要做解析和复制证书。

root@server4 ~]# cd /etc/docker/certs.d/reg.westos.org/
[root@server4 reg.westos.org]# ls
ca.crt
[root@server4 docker]# vim /etc/hosts
[root@server4 docker]# cat /etc/hosts

172.25.63.3     server3 reg.westos.org

在docker重启后将/var/run/docker.sock的权限设置为777

三、使用ssh插件远程控制主机

我们之前在docker项目中都是在docker主机的本地启动容器,现在我们尝试使用ssh的方式远程控制主机使用shell启动容器。

这里将server4设置为远程ssh主机,也可以再开启一个主机(需要安装配置docker)。

首先安装ssh插件:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_IP_17

进行jenkins系统配置:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_docker_18

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_git_19

添加认证信息:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_docker_20

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_git_21


接下来进行docker项目的配置:

jenkins获取harbor最近5个镜像版本tag jenkins harbor 插件_docker_22