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项目demo配置
gitlab配置默认情况下gitlab不允许在本地调用,因此我们需要设置本地调用:
再针对项目进行设置,点击项目 --> demo —> webhook:、
2.将harbor仓库部署在server3 (172.25.63.3)上。
3.需要在jenkins安装docker的插 件并连接harbor
添加认证如下:
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的更新:
可以看到构建成功:
添加构建后的动作。接下来我们新建一个项目docker:
配置项目docker:设置在demo构建稳定后执行触发:
其动作为使用刚刚创建的镜像构建一个容器
流程是 用户通过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进行配置:
其中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)。
在网页端添加:
之后保存。使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系统配置:
添加认证信息:
接下来进行docker项目的配置: