一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Bridge 网络如何处理容器无法通过服务名互相访问

时间:2026-09-02 18:31:47 编辑:袖梨 来源:一聚教程网

默认 bridge 网络不支持容器名 DNS 解析,必须使用自定义 bridge 网络(如 docker network create app-net)才能实现容器名自动解析为 IP,且需确保服务监听 0.0.0.0 并验证 /etc/resolv.conf 中 nameserver 为 127.0.0.11。

Bridge 网络本身不支持容器名解析,这是设计使然——默认 bridge 网络只分配 IP 地址,不启用内置 DNS 服务。所以即使两个容器都在 bridge 下,ping service-a 会报 Name or service not known,但 ping 172.17.0.x 可能通。

改用自定义 bridge 网络

这是最直接、推荐的做法。Docker 的自定义 bridge 网络自动启用 DNS 解析,容器名即服务名,无需额外配置。

  1. 创建网络:docker network create app-net
  2. 启动容器时指定网络:docker run -d --name api --network app-net my-apidocker run -d --name web --network app-net nginx
  3. 此时在 web 容器里执行 curl http://api:8080 就能正常通信

确认容器已接入同一网络

别只看“都用了 --network”,要验证实际归属:

  1. 查容器网络归属:docker inspect api | grep -A 5 Networks
  2. 查网络内有哪些容器:docker network inspect app-net
  3. 如果某个容器漏掉了,用 docker network connect app-net web 补上

检查监听地址是否允许跨容器访问

DNS 解析通了,不代表服务真能被访问。很多应用默认只监听 127.0.0.1,这在容器内等于“只给自己听”。

  1. 进容器查监听情况:netstat -tuln | grep :8080,确认显示的是 0.0.0.0:8080 而非 127.0.0.1:8080
  2. Spring Boot 加 server.address=0.0.0.0;Node.js 改 app.listen(3000, '0.0.0.0')
  3. 镜像启动时可通过环境变量传入监听地址,比硬编码更灵活

验证 DNS 是否生效

进入一个容器,用内置工具确认解析是否走对了 Docker DNS:

  1. 运行 nslookup api,应返回 api.app-net 对应的 IP
  2. 检查 /etc/resolv.conf,nameserver 应为 127.0.0.11(Docker 内置 DNS)
  3. 若失败,先试 curl http://$(nslookup api | awk '/Address/ {print $2}' | tail -1):8080 绕过 DNS 直连 IP,判断是 DNS 还是服务问题

热门栏目