当前位置:首页 > 技术 > 正文内容

Jenkins借助Docker API自签证书实现远程部署

访客 技术 2026年6月29日 1

生成自签TLS证书

首先创建证书存放目录:

mkdir -p /etc/docker/certs
cd /etc/docker/certs

执行以下命令序列生成CA证书、服务端证书和客户端证书:

# 生成CA私钥和证书
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem

# 生成服务端证书
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=server" -sha256 -new -key server-key.pem -out server.csr

# 创建扩展配置文件并签署服务端证书
echo subjectAltName = DNS:223.5.5.5,IP:106.14.114.xx,IP:172.22.xx.xx,IP:127.0.0.1 > extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf

# 生成客户端证书
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf

# 清理临时文件并设置权限
rm -f client.csr server.csr extfile.cnf extfile-client.cnf
chmod 0400 ca-key.pem key.pem server-key.pem
chmod 0444 ca.pem server-cert.pem cert.pem

注意替换extfile.cnf中的IP为实际内外网地址。

配置Docker守护进程

编辑Docker systemd服务单元文件:

vim /lib/systemd/system/docker.service

[Service]段修改为:

ExecStart=
ExecStart=/usr/bin/dockerd --tlsverify \
  --tlscacert=/etc/docker/certs/ca.pem \
  --tlscert=/etc/docker/certs/server-cert.pem \
  --tlskey=/etc/docker/certs/server-key.pem \
  -H fd:// -H tcp://0.0.0.0:2376

重新加载并启动Docker服务:

systemctl enable docker.service
systemctl daemon-reload
systemctl start docker.service
systemctl status docker.service

验证API端口监听状态:

netstat -lntp | grep dockerd

Jenkins证书配置

  1. 在Jenkins凭据管理中,添加类型为Certificate的凭据,分别上传ca.pemcert.pemkey.pem三个文件,并命名如docker-cert
  2. 在系统设置中配置Docker Cloud,启用TLS验证,选择刚创建的证书凭据,设置Docker主机URL为tcp://你的服务器IP:2376

Jenkins证书配置

创建Pipeline任务

  • 新建任务,选择"流水线"类型。
  • 在"流水线"定义中选择"Pipeline script from SCM"。
  • SCM选择Git,填写仓库地址和凭据,指定Jenkinsfile路径,并取消"轻量级检出"选项。

Jenkinsfile示例

stage('Deploy to Docker') {
    environment {
        // 引用客户端证书凭据,对应Jenkins中创建的凭据ID
        DOCKER_CERT_PATH = credentials('docker-cert')
    }
    steps {
        script {
            def containerPort = params.container_port ?: 80
            def portMapping = containerPort ? " -p ${containerPort}:80 " : ""
            def dockerRemotes = params.docker_remotes?.split(',') ?: []

            dockerRemotes.each { remote ->
                sh """
                    export DOCKER_TLS_VERIFY=1
                    export DOCKER_HOST=tcp://${remote}:2377
                    docker rm -f ${DOMAIN_NAME} || true
                    docker run -d --name ${DOMAIN_NAME} --restart=always \
                        -e TZ='Asia/Shanghai' \
                        -e CONTAINER_PORT=${containerPort} \
                        -m ${params.LIMIT_MEMORY}M \
                        ${portMapping} \
                        -v /etc/localtime:/etc/localtime:ro \
                        ${DOCKER_IMAGE}
                    echo "清理旧镜像"
                    docker images ${IMAGE_NAME} -q --filter before=${DOCKER_IMAGE} | xargs --no-run-if-empty docker rmi
                """
            }
        }
    }
}

部署说明

  • 任务参数container_port指定容器内部端口(默认80),docker_remotes为逗号分隔的远程Docker主机IP列表。
  • 环境变量DOCKER_CERT_PATH由Jenkins自动注入,指向包含三个证书文件的临时目录。
  • 若不需要TLS验证,可移除DOCKER_TLS_VERIFY=1及相关证书配置,但不建议在生产环境这样做。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。