准备工作
- Jenkins 环境
- Jenkins 服务器能够连接的 Docker 环境
- Dockerfile 文件
创建连接 Docker 的证书
Jenkins 的 Docker 插件只能通过 TCP 方式进行连接,安全起见,我们需要创建用来连接 Docker 的证书,我已经被黑了 3 次了,受够了!
# 创建根证书 RSA 私钥: 此处需要两次输入密码,请务必记住该密码,在后面步骤会用到
openssl genrsa -aes256 -out docker-ca-key.pem 4096
# 创建 CA 证书,以上一步生成的私钥创建证书,也就是自签证书,也可从第三方 CA 机构签发
# 输入国家代码,州,市,组织名称,组织单位,你的名字,邮箱地址
openssl req -new -x509 -days 3650 -key docker-ca-key.pem -sha256 -out docker-ca.pem
# 创建服务端私钥:
openssl genrsa -out server-key.pem 4096
# 创建服务端签名请求证书文件: 其中的 IP 地址为自己服务器IP地址
openssl req -subj "/CN=192.168.10.38" -sha256 -new -key server-key.pem -out server.csr
# 创建 extfile.cnf 的配置文件: 其中 IP 地址改为自己服务器IP地址
echo subjectAltName = IP:192.168.10.38,IP:0.0.0.0 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
# 创建签名生效的服务端证书文件:
openssl x509 -req -days 3650 -sha256 -in server.csr -CA docker-ca.pem -CAkey docker-ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
# 创建客户端私钥:
openssl genrsa -out client-key.pem 4096
# 创建客户端签名请求证书文件:
openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr
# extfile.cnf 文件中增加配置:
echo extendedKeyUsage = clientAuth >> extfile.cnf
# 创建签名生效的客户端证书文件:
openssl x509 -req -days 3650 -sha256 -in client.csr -CA docker-ca.pem -CAkey docker-ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile.cnf
# 删除无用文件:
rm -v client.csr server.csr
# 为证书文件授权:
chmod -v 0400 docker-ca-key.pem server-key.pem client-key.pem
chmod -v 0444 docker-ca.pem server-cert.pem client-cert.pem
# 查看证书有效期
openssl x509 -in docker-ca.pem -noout -dates
# 创建存放证书的目录,并将所需的证书文件拷进去
mkdir /etc/docker/cert
cp docker-ca.pem /etc/docker/cert/
cp server-cert.pem /etc/docker/cert/
cp server-key.pem /etc/docker/cert/
以上 docker-ca.pem
server-cert.pem
server-key.pem
这三个是我们客户端调用所需的证书文件
配置 Docker 支持 TLS 连接
编辑 docker.service 配置文件
vim /lib/systemd/system/docker.service
将原 ExecStart=
行注释,添加一行:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/etc/docker/cert/docker-ca.pem --tlscert=/etc/docker/cert/server-cert.pem --tlskey=/etc/docker/cert/server-key.pem --containerd=/run/containerd/containerd.sock
此处设置 docker 远程端口为 2375,可根据需要修改
刷新配置,重启 Docker
systemctl daemon-reload && systemctl restart docker
Jenkins 配置 Docker 集群
- 进入
Dashbord
->系统管理
->节点管理
->Configure Clouds
配置集群界面 Add a new cloud
选择 Docker- 点击
Docker Cloud details...
按钮- 设置 Docker 集群名称
- 设置
Docker Host URI
:tcp://192.168.10.38:2375
此处 ip 为此 Jenkins 服务器能够连接到的 Docker 服务器 ip 地址
- 设置
Server credentials
添加
连接 Docker 集群的凭证- 选择
全局凭证
- 类型选择
X.509 Client Certificate
- 范围选择
全局
- Client Key 点击添加,将上面生成的
server-key.pem
文本内容粘贴进去 - Client Certificate 将上面生成的
server-cert.pem
文本内容粘贴进去 - Server CA Certificate 将上面生成的
docker-ca.pem
文本内容粘贴进去 - ID 设置为容易辨认的凭证名称
docker-38-cert
,避免混淆
- 选择
- 选择上面添加的凭证
docker-38-cert
- 勾选
Enabled
选项
Jenkins 配置构建步骤
构建镜像
在项目配置中的构建
步骤中添加 Build / Publish Docker Image
:
运行镜像
继续添加构建步骤 执行 shell
:
# 删除中间镜像
docker rmi -f $(docker images | grep "^<none>" | awk '{print $3}')
# 删除此项目正在运行的 Docker 容器
cid=$(docker ps | grep $CONTAINER_NAME |awk '{print $1}')
if [ x"$cid" != x ]
then
docker rm -f $cid
fi
# 启动 Docker 容器
docker run -itd --name $CONTAINER_NAME -p $API_PORT:80 --restart always $IMAGE_NAME