插件窝 干货文章 docker容器间不能互访怎么办

docker容器间不能互访怎么办

容器 Docker network bash 831    来源:    2025-04-27

Docker容器间无法互访问题排查与解决方案

常见原因及排查步骤

1. 检查网络配置

  • 确认容器是否在同一网络bash docker network ls docker network inspect [网络名] 如果容器不在同一网络,需要创建网络并连接容器: bash docker network create my_network docker network connect my_network container1 docker network connect my_network container2

2. 检查容器IP和连通性

  • 查看容器IP地址bash docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名
  • 测试容器间连通性bash docker exec -it 容器1 ping 容器2的IP

3. 检查防火墙设置

  • 查看防火墙规则bash iptables -L -n
  • 临时关闭防火墙测试bash systemctl stop firewalld # CentOS/RHEL ufw disable # Ubuntu

4. 检查DNS解析

  • 测试容器间通过名称访问bash docker exec -it 容器1 ping 容器2 如果无法解析,确保使用正确的容器名称或配置了正确的DNS。

5. 检查应用配置

  • 确认应用程序绑定到0.0.0.0而不是127.0.0.1
  • 检查应用程序是否监听正确的端口

解决方案

方案1:使用Docker默认桥接网络

# 运行容器时使用--link参数(已不推荐)
docker run --name container1 --link container2:alias ...

# 或使用默认桥接网络
docker run --network bridge ...

方案2:创建自定义网络(推荐)

# 创建自定义网络
docker network create my_app_net

# 运行容器并加入该网络
docker run -d --name container1 --network my_app_net ...
docker run -d --name container2 --network my_app_net ...

# 现在容器可以通过名称互相访问
docker exec -it container1 ping container2

方案3:使用主机网络模式

docker run --network host ...

注意:这会共享主机网络栈,可能有安全隐患

方案4:配置端口映射

docker run -p 8080:80 ...

高级排查工具

  1. 使用tcpdump抓包

    docker run --net=container:容器名 nicolaka/netshoot tcpdump -i eth0
    
  2. 使用netshoot工具

    docker run -it --net container:容器名 nicolaka/netshoot
    
  3. 检查路由表

    docker exec 容器名 ip route
    

如果问题仍未解决,请提供以下信息以便进一步诊断: - docker version - docker info - 容器启动命令 - docker network inspect输出 - 相关容器的日志信息