如何用容器名实现 Docker 容器之间的互访(ping/连接)?

把容器接入同一个用户自定义网络(docker network create + docker run --network),即可用容器名互相 ping 和连接,Docker 内置 DNS 自动解析;默认 bridge 网络不支持名称解析。

最佳实践
如何用容器名实现 Docker 容器之间的互访(ping/连接)?封面

核心:Docker 的内置 DNS 只在用户自定义网络上生效。创建网络 docker network create mynet,容器启动时 --network mynet --name api 加入,同网络的其他容器就能直接用 ping apicurl http://api:8080 访问它,无需查 IP。默认 bridge 网络上的容器只能用 IP 互访。

完整步骤

# 1. 创建自定义网络
docker network create mynet

# 2. 容器启动时加入(必须显式 --name)
docker run -d --name web --network mynet nginx
docker run -d --name api --network mynet myapi

# 3. 互访验证
docker exec web ping -c2 api
docker exec web curl -s http://api:8080/health

运行中的容器也能补接入:

docker network connect mynet existing-container

compose 项目天然自带

同一 compose 文件的服务默认接入项目自建网络,直接用服务名互访:

services:
  web:
    image: nginx
  api:
    build: .

web 里 curl http://api:3000 即可,连 ports 映射都不用给 api 配(内部端口直接可达)。

注意事项

  1. 名称解析的是容器名/服务名/网络别名--name 必须显式指定;还可用 --network-alias 加别名
  2. --link 已废弃,不要再学
  3. 跨 compose 项目互访:把一方接入另一方的网络,或建一个外部共享网络(external: true
  4. ping 只是连通性验证,实际应用走 TCP 连接——nc -zv api 8080 更贴近真实

观测云对照

服务间调用质量可视化。 容器间互访通了只是第一步,调用耗时、错误率、依赖拓扑用观测云 APM 呈现,网络层问题与应用层问题在调用链上一眼分开。

常见问题(FAQ)

Q:默认 bridge 上真的不能按名字访问吗?
A:不能。默认 bridge 没内嵌 DNS,只有自定义网络有——这也是自定义网络被广泛推荐的原因之一。

Q:一个容器能同时进多个网络吗?
A:可以,docker network connect 接多个,常用于前后端分层隔离。

Q:ping 通但连不上端口?
A:DNS 和网络都正常,查对端容器内应用是否监听该端口:docker exec api ss -ltn

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台