docker服务器:connect to host cdh04 port 22: No route to host 分析并解决
🔍 一、排查思路总览
- 确认目标主机(cdh04)是否运行正常
- 确认目标主机的 Docker 容器是否运行并绑定了 SSH 端口
- 确认网络配置是否通
- 确认 SSH 服务是否正常监听并运行
- 确认防火墙和安全组设置
🧪 二、详细排查步骤
✅ 1. Ping 主机名是否能通(DNS or Hosts 问题)
ping cdh04
-
如果提示:
ping: unknown host cdh04
-
说明主机名无法解析,检查
/etc/hosts
或 DNS。
-
说明主机名无法解析,检查
-
如果提示:
Destination Host Unreachable
- 说明网络层面有问题,继续往下查。
✅ 2. 确认是否为 Docker 容器内部主机
如果你是用 Docker 模拟 CDH 集群,那么 cdh04
可能是某个容器的别名。可通过以下命令确认:
docker ps -a | grep cdh04
如果找不到:
- 容器可能没有启动;
- 容器网络未配置正确;
- 或者该容器已崩溃。
可用以下命令查看网络:
docker network ls docker network inspect <网络名>
✅ 3. 检查容器是否监听 22 端口
进入宿主机,检查容器绑定端口:
docker inspect cdh04 | grep -A 5 "PortBindings"
确认是否有:
"22/tcp": [ { "HostPort": "2222" } ]
表示你需要用 ssh -p 2222 用户名@宿主机IP
才能访问,而不是直接 ssh cdh04
。
✅ 4. 检查 SSH 服务是否运行
进入容器:
docker exec -it cdh04 bash
确认:
ps -ef | grep sshd
如果没有:
service ssh start
或者:
/etc/init.d/ssh start
还可以查看日志:
cat /var/log/auth.log
✅ 5. 容器网络是否正常(重要)
查看容器网络是否被桥接成功:
docker network inspect bridge
容器是否有 IP:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cdh04
从宿主机 ping 容器 IP:
ping <容器IP>
如果 ping 不通,可以尝试重启容器网络:
systemctl restart docker
或使用:
docker network rm <网络名> # 慎用,确认后使用 docker network create ...
✅ 6. 防火墙与安全设置
查看 iptables(或 firewalld)是否阻拦了:
iptables -L -n | grep 22
或者:
systemctl status firewalld
临时关闭测试:
systemctl stop firewalld iptables -F
💡 三、常见问题与建议
问题 | 原因 | 解决方式 |
---|---|---|
No route to host | 宿主机到容器路由不通 | 检查容器网络、端口映射 |
Connection refused | 容器未运行 SSH 服务或未监听 22 端口 | 启动 ssh 服务,检查监听端口 |
ping 不通容器 | Docker 网络异常 | 重建 docker 网络或检查 bridge 网络配置 |
容器无法被主机名访问 | /etc/hosts 缺失或 DNS 配置错误 | 添加主机映射或使用容器 IP |