Docker环境下Jenkins容器SSH连接CentOS7容器失败求助
解决Jenkins容器SSH连接CentOS7远程容器的问题
问题梳理
你在Docker练习中遇到两个核心连接问题:
- 使用服务名/容器名连接时,提示
ssh: Could not resolve hostname remote_host: Name or service not known - 使用IP连接时,提示
ssh: connect to host 172.17.0.2 port 22: Connection refused - 发现Dockerfile中指定的
/usr/sbin/sshd路径可能不存在
分步解决方案
1. 修复容器DNS解析问题
Docker Compose自定义网络中,容器默认通过服务名实现DNS解析,而非容器名。你的docker-compose.yml里CentOS7容器的服务名是remote_host,因此在Jenkins容器内必须使用:
ssh remote_user@remote_host
不要用容器名remote-host,自定义网络不会为容器名生成DNS记录。
2. 修复sshd启动问题(核心)
你发现的/usr/sbin/sshd不存在是关键故障点,大概率是openssh-server安装不完整导致,以下是修正后的Dockerfile:
FROM centos:7 # 清理缓存+更新源,确保依赖安装完整 RUN yum clean all && yum -y update && \ yum -y install openssh-server passwd initscripts mysql && \ yum clean all RUN useradd remote_user && \ echo "1234" | passwd remote_user --stdin && \ mkdir /home/remote_user/.ssh && \ chmod 700 /home/remote_user/.ssh COPY remote-key.pub /home/remote_user/.ssh/authorized_keys RUN chown remote_user:remote_user -R /home/remote_user && \ chmod 400 /home/remote_user/.ssh/authorized_keys # 生成SSH主机密钥,必须在openssh-server安装完成后执行 RUN ssh-keygen -A # 使用exec形式CMD,确保sshd作为PID1运行,能正确接收停止信号 CMD ["/usr/sbin/sshd", "-D"]
修正说明:
- 添加
yum clean all && yum -y update避免源缓存导致的安装不完整问题 - 合并yum命令减少镜像层数,同时清理缓存缩小镜像体积
- 改用
["/usr/sbin/sshd", "-D"]的exec格式CMD,替代原shell格式,保证容器信号传递正常 - 若仍怀疑路径问题,可临时添加
RUN which sshd查看sshd实际安装路径,调试完成后删除该命令
3. 重新构建并启动容器
修改Dockerfile后,执行以下命令更新容器:
docker-compose down docker-compose build --no-cache docker-compose up -d
--no-cache参数确保完全重新构建镜像,避免旧缓存干扰。
4. 验证连接步骤
- 进入Jenkins容器:
docker exec -it romantic_dhawan bash - 确保Jenkins容器内已安装SSH客户端(Jenkins镜像基于Debian/Ubuntu,执行以下命令安装):
apt-get update && apt-get install -y openssh-client - 使用服务名连接远程容器:
首次连接会提示确认主机指纹,输入ssh remote_user@remote_hostyes后即可登录(密码为你设置的1234,或通过密钥直接登录)
额外排查点
- 若仍提示连接拒绝,进入CentOS7容器检查sshd运行状态:
若未运行,启动调试模式查看错误日志:docker exec -it remote-host bash ps aux | grep sshd/usr/sbin/sshd -d - 检查CentOS7容器的22端口是否正常监听:
docker exec -it remote-host netstat -tulpn | grep 22
内容的提问来源于stack exchange,提问作者Konostaulo
相关产品推荐
相关产品推荐

