默认 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 可能通。
这是最直接、推荐的做法。Docker 的自定义 bridge 网络自动启用 DNS 解析,容器名即服务名,无需额外配置。
docker network create app-net
docker run -d --name api --network app-net my-api 和 docker run -d --name web --network app-net nginx
web 容器里执行 curl http://api:8080 就能正常通信别只看“都用了 --network”,要验证实际归属:
docker inspect api | grep -A 5 Networks
docker network inspect app-net
docker network connect app-net web 补上DNS 解析通了,不代表服务真能被访问。很多应用默认只监听 127.0.0.1,这在容器内等于“只给自己听”。
netstat -tuln | grep :8080,确认显示的是 0.0.0.0:8080 而非 127.0.0.1:8080
server.address=0.0.0.0;Node.js 改 app.listen(3000, '0.0.0.0')
进入一个容器,用内置工具确认解析是否走对了 Docker DNS:
nslookup api,应返回 api.app-net 对应的 IP/etc/resolv.conf,nameserver 应为 127.0.0.11(Docker 内置 DNS)curl http://$(nslookup api | awk '/Address/ {print $2}' | tail -1):8080 绕过 DNS 直连 IP,判断是 DNS 还是服务问题