如何从不同GCP虚拟机上的主Jenkins容器SSH连接到子Jenkins容器
GCP跨VM Docker容器SSH连接实现方案
以下是3种可落地的实现方案,按配置复杂度从低到高排序:
方案1:端口映射+防火墙放行(最常用)
- 操作步骤:
- 先配置子Jenkins容器的SSH能力:在子Jenkins的Dockerfile中加入openssh-server安装和初始化配置,参考配置:
FROM jenkins/jenkins:lts USER root RUN apt-get update && apt-get install -y openssh-server \ && mkdir /var/run/sshd \ # 配置jenkins用户的密码或者注入公钥 && echo 'jenkins:自定义密码' | chpasswd \ && sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config EXPOSE 22 CMD ["/usr/sbin/sshd", "-D", "&&", "/usr/local/bin/jenkins.sh"] - 启动子Jenkins容器时添加端口映射参数,将容器22端口映射到VM-B的自定义端口,比如
10022:docker run -d -p 8080:8080 -p 10022:22 --name jenkins-slave 你的镜像名 - 配置GCP VPC防火墙规则:放行源为VM-A内网IP、目标为VM-B内网IP、端口为
10022的TCP入站流量,同时确认VM-B的系统防火墙(firewalld/ufw)也放行该端口。 - 主Jenkins容器内直接执行SSH命令连接即可:
ssh jenkins@<VM-B的内网IP> -p 10022
- 先配置子Jenkins容器的SSH能力:在子Jenkins的Dockerfile中加入openssh-server安装和初始化配置,参考配置:
- 优缺点:配置门槛低,不需要修改现有网络架构;缺点是端口暴露到宿主机层面,需要严格配置防火墙规则避免安全风险。
方案2:Host网络模式
- 操作步骤:
- 同方案1第一步先配置子Jenkins容器的SSH能力,注意如果VM-B本身的sshd服务占用了22端口,需要修改容器内sshd的监听端口为其他未占用端口,比如
2022。 - 启动子Jenkins容器时指定使用Host网络模式,容器直接复用VM-B的网络栈:
docker run -d --network host --name jenkins-slave 你的镜像名 - 配置GCP防火墙和VM-B系统防火墙,放行对应SSH端口的入站流量,源地址限制为VM-A的内网IP。
- 主Jenkins容器直接连接VM-B内网IP加对应SSH端口即可。
- 同方案1第一步先配置子Jenkins容器的SSH能力,注意如果VM-B本身的sshd服务占用了22端口,需要修改容器内sshd的监听端口为其他未占用端口,比如
- 优缺点:网络性能无损耗,不需要做端口映射;缺点是容器和宿主机网络完全打通,隔离性差,存在端口冲突风险。
方案3:跨节点Overlay网络(安全性最高)
- 操作步骤:
- 在VM-A和VM-B上搭建Docker Swarm集群,或者部署Consul作为服务发现组件,创建跨节点的Overlay网络,两个Jenkins容器都加入该Overlay网络。
- 子Jenkins容器配置好SSH能力后,不需要做端口映射也不需要用Host网络。
- 主Jenkins容器可以直接通过子Jenkins容器的名称,或者Overlay网络分配的内部IP,直接访问22端口完成SSH连接。
- 优缺点:容器网络完全隔离,不需要暴露端口到宿主机,安全性最高;缺点是配置复杂度高,需要额外维护Overlay网络组件。
通用安全建议
- 所有SSH连接优先使用密钥认证,不要用密码认证,密钥存储在Jenkins内置的凭证管理中,不要明文写在脚本或配置里。
- 所有防火墙规则只放行必要的源IP和端口,禁止开放0.0.0.0/0的入站权限。
- 子Jenkins容器的sshd配置禁止root用户登录,仅开放权限最小的业务用户用于SSH连接。
内容的提问来源于stack exchange,提问作者Faisal Shani
相关产品推荐
相关产品推荐

