如何在没有反向代理容器的情况下使用 docker-compose 部署启用 HTTPS 的 Jenkins 容器?
How do I deploy HTTPS enabled Jenkins container using docker-compose WITHOUT a reverse proxy container?
我需要使用 docker-compose 部署启用 https 的 Jenkins 容器,而不使用像 Nginx 这样的反向代理,我该如何完成?
我已阅读 this post, this blog post, and this blog post 所有 要求我使用 java 参数部署 .war 文件,例如 --httpPort
和 --httpsPort
.
我应该把这些选项放在 docker-compose 文件的什么地方?我还有一个 Dockerfile,其中我 运行 安装了一些命令 post,是否可以将这些选项放在那里?
这是我当前的 docker-compose 文件,可以使用。请注意,我并没有尝试调整此文件中的 http 或 https 端口:
version: '3.7'
services:
jenkins:
#image: jenkins/jenkins:lts
build:
context: ./
dockerfile: jenkins.Dockerfile
privileged: true
user: root
expose:
- 8080
ports:
- 50000:50000
container_name: jenkins
volumes:
- ./jenkins_data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
environment:
DOCKER_SOCKET: /var/run/docker.sock
privileged: true
networks:
- jenkins_nw
restart: unless-stopped
networks:
jenkins_nw:
driver: bridge
这是我的 jenkins.Dockerfile:
FROM jenkins/jenkins:lts
ENV http_proxy http://our.proxy.com:2222
ENV https_proxy http://our.proxy.com:2222
USER root
COPY ["./certs/ourrootchain.cer", "/var/jenkins_home"]
RUN \
cd /tmp \
&& keytool -keystore /opt/java/openjdk/lib/security/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias ourrootchain -file /var/jenkins_home/ourrootchain.cer
RUN apt-get update && apt-get install tcpdump procps net-tools -y
疑难解答
- 我安装了 procps 并检查了 java 命令是 运行 在 conatiner 中启动 jenkins。输出如下。我还没有弄清楚如何调整此命令 运行s 的参数,有什么办法吗?
java -Duser.home=/var/jenkins_home -Djenkins.model.Jenkins.slaveAgentPort=50000 -jar /usr/share/jenkins/jenkins.war
- 我尝试在 docker-compose 文件的
environment:
部分中使用 JAVA_OPTS: "--httpsPort:8443"
和 https_port: 8443
。使用 JAVA_OPTS: --httpsPort:8443
给出了错误,并且由于无法识别命令而存在容器。 https_port: 8443
什么也没做,部署后容器内部的 netstat 显示服务器没有在 https 上侦听,java 命令也没有从 ps -aux
上的 grep 更改。
我认为我需要将我的 pkcs12 文件导入密钥库。我在网上阅读的所有指南都指出我需要创建一个新的密钥库。是否可以将我的 pkcs12 导入现有的密钥库?
有什么地方可以定义 运行 中的 java 命令吗?
更新:
我不是 java 专家,所以我不知道“-D”用于虚拟机选项。我现在将“JAVA_OPTS”调整为如下所示
JAVA_OPTS: "-DhttpsPort=8443 -DhttpsCertificate=/var/jenkins_certs/jenkins.crt -DhttpsPrivateKey=/var/jenkins_certs/jenkins.key
。我还调整了我的 Dockerfile 以创建 /var/jenkins_certs 目录,并复制实际的证书和私钥。容器部署成功,使用 ps -aux | grep java
我可以看到我的选项实际上正在被使用。然而 netstat -tulpn
仍然显示只有“8080”是开放的。为什么Jenkins容器拒绝使用HTTPS或者不开放我配置的HTTPS端口?
我找到了 this docker hub image jenkins-ssl
查看 the github 我发现他们如何配置他们的证书并添加“JENKINS_OPTS”语句来实际更改我需要的参数。
我在 Dockerfile 中编辑了以下几行,以使用我的自定义证书使其最终运行!
#Commenting this out
#ENV JENKINS_OPTS --httpPort=-1 --httpsPort=8443 --httpsCertificate="$CERT_FOLDER/jenkins.pem" --httpsPrivateKey="$CERT_FOLDER/jenkins.key"
#Copy over custom certs change permissions to jenkins:jenkins
COPY ["./certs/", "/var/jenkins_certs"]
RUN chown -R jenkins:jenkins "/var/jenkins_certs"
#Update root ca with custom trust chain (For web only)
RUN cp /var/jenkins_certs/attrootchain.cer /usr/local/share/ca-certificates && update-ca-certificates
#Update root ca with custom trust chain (for java env)
RUN keytool -keystore /opt/java/openjdk/lib/security/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias ourrootchain -file /var/jenkins_certs/ourrootchain.cer
#run Jenkins options using the custom cert and key
ENV JENKINS_OPTS --httpPort=-1 --httpsPort=8443 --httpsCertificate="/var/jenkins_certs/jenkins.crt" --httpsPrivateKey="/var/jenkins_certs/jenkins.key"
然后运行docker build -t jenkins-ssl ./
现在我可以在我的 docker-compose 文件中使用此图像。或者 运行 作为一个简单的 docker 运行 语句,如下所示:
docker run --name jenkins-ssl -p 443:8443 -p 50000:50000 jenkins-ssl
我需要使用 docker-compose 部署启用 https 的 Jenkins 容器,而不使用像 Nginx 这样的反向代理,我该如何完成?
我已阅读 this post, this blog post, and this blog post 所有 要求我使用 java 参数部署 .war 文件,例如 --httpPort
和 --httpsPort
.
我应该把这些选项放在 docker-compose 文件的什么地方?我还有一个 Dockerfile,其中我 运行 安装了一些命令 post,是否可以将这些选项放在那里?
这是我当前的 docker-compose 文件,可以使用。请注意,我并没有尝试调整此文件中的 http 或 https 端口:
version: '3.7'
services:
jenkins:
#image: jenkins/jenkins:lts
build:
context: ./
dockerfile: jenkins.Dockerfile
privileged: true
user: root
expose:
- 8080
ports:
- 50000:50000
container_name: jenkins
volumes:
- ./jenkins_data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
environment:
DOCKER_SOCKET: /var/run/docker.sock
privileged: true
networks:
- jenkins_nw
restart: unless-stopped
networks:
jenkins_nw:
driver: bridge
这是我的 jenkins.Dockerfile:
FROM jenkins/jenkins:lts
ENV http_proxy http://our.proxy.com:2222
ENV https_proxy http://our.proxy.com:2222
USER root
COPY ["./certs/ourrootchain.cer", "/var/jenkins_home"]
RUN \
cd /tmp \
&& keytool -keystore /opt/java/openjdk/lib/security/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias ourrootchain -file /var/jenkins_home/ourrootchain.cer
RUN apt-get update && apt-get install tcpdump procps net-tools -y
疑难解答
- 我安装了 procps 并检查了 java 命令是 运行 在 conatiner 中启动 jenkins。输出如下。我还没有弄清楚如何调整此命令 运行s 的参数,有什么办法吗?
java -Duser.home=/var/jenkins_home -Djenkins.model.Jenkins.slaveAgentPort=50000 -jar /usr/share/jenkins/jenkins.war
- 我尝试在 docker-compose 文件的
environment:
部分中使用JAVA_OPTS: "--httpsPort:8443"
和https_port: 8443
。使用JAVA_OPTS: --httpsPort:8443
给出了错误,并且由于无法识别命令而存在容器。https_port: 8443
什么也没做,部署后容器内部的 netstat 显示服务器没有在 https 上侦听,java 命令也没有从ps -aux
上的 grep 更改。
我认为我需要将我的 pkcs12 文件导入密钥库。我在网上阅读的所有指南都指出我需要创建一个新的密钥库。是否可以将我的 pkcs12 导入现有的密钥库?
有什么地方可以定义 运行 中的 java 命令吗?
更新:
我不是 java 专家,所以我不知道“-D”用于虚拟机选项。我现在将“JAVA_OPTS”调整为如下所示
JAVA_OPTS: "-DhttpsPort=8443 -DhttpsCertificate=/var/jenkins_certs/jenkins.crt -DhttpsPrivateKey=/var/jenkins_certs/jenkins.key
。我还调整了我的 Dockerfile 以创建 /var/jenkins_certs 目录,并复制实际的证书和私钥。容器部署成功,使用 ps -aux | grep java
我可以看到我的选项实际上正在被使用。然而 netstat -tulpn
仍然显示只有“8080”是开放的。为什么Jenkins容器拒绝使用HTTPS或者不开放我配置的HTTPS端口?
我找到了 this docker hub image jenkins-ssl 查看 the github 我发现他们如何配置他们的证书并添加“JENKINS_OPTS”语句来实际更改我需要的参数。 我在 Dockerfile 中编辑了以下几行,以使用我的自定义证书使其最终运行!
#Commenting this out
#ENV JENKINS_OPTS --httpPort=-1 --httpsPort=8443 --httpsCertificate="$CERT_FOLDER/jenkins.pem" --httpsPrivateKey="$CERT_FOLDER/jenkins.key"
#Copy over custom certs change permissions to jenkins:jenkins
COPY ["./certs/", "/var/jenkins_certs"]
RUN chown -R jenkins:jenkins "/var/jenkins_certs"
#Update root ca with custom trust chain (For web only)
RUN cp /var/jenkins_certs/attrootchain.cer /usr/local/share/ca-certificates && update-ca-certificates
#Update root ca with custom trust chain (for java env)
RUN keytool -keystore /opt/java/openjdk/lib/security/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias ourrootchain -file /var/jenkins_certs/ourrootchain.cer
#run Jenkins options using the custom cert and key
ENV JENKINS_OPTS --httpPort=-1 --httpsPort=8443 --httpsCertificate="/var/jenkins_certs/jenkins.crt" --httpsPrivateKey="/var/jenkins_certs/jenkins.key"
然后运行docker build -t jenkins-ssl ./
现在我可以在我的 docker-compose 文件中使用此图像。或者 运行 作为一个简单的 docker 运行 语句,如下所示:
docker run --name jenkins-ssl -p 443:8443 -p 50000:50000 jenkins-ssl