Docker 容器间通过容器名通信如何配

作者:袖梨 2026-09-03

关键是在同一自定义bridge网络中运行容器,Docker内置DNS仅在此类网络中生效,支持通过容器名(如ping db)直接通信;默认bridge网络不支持名称解析。

要让 Docker 容器间通过容器名(比如 ping dbcurl http://web:80)直接通信,关键不是改配置文件,而是让它们处于同一个自定义 bridge 网络中。Docker 内置 DNS 服务只在用户创建的 bridge 网络里生效,原生默认 bridge 网络(bridge)不支持名称解析。

必须用自定义 bridge 网络

默认的 bridge 网络虽然能让容器互通,但容器之间只能靠 IP 地址访问,无法通过名字自动解析。只有你手动创建的 bridge 网络,Docker 才会启动内置 DNS,并把容器名注册进去。

  1. 创建网络:docker network create mynet
  2. 启动容器时指定该网络:docker run -d --name web --network mynet nginx
  3. 另一个容器也加入同一网络:docker run -d --name db --network mynet mysql
  4. 此时在 web 容器里执行 ping db 就能通,无需查 IP

别漏掉网络名称一致性

所有需要互访的容器,必须使用 完全相同的网络名称(比如都用 mynet),不能一个用 mynet、另一个用 default 或没指定网络。Docker 不会在不同网络之间做 DNS 转发。

  1. 检查容器是否真在同一个网络:docker inspect <容器名> | grep NetworkMode 或看 NetworkSettings.Networks 字段
  2. 如果已有运行中的容器,可以用 docker network connect mynet <容器名> 动态加入
  3. 注意:容器名必须是合法 DNS 主机名(小写字母、数字、短横线,不能以短横线开头或结尾)

Docker Compose 自动搞定

如果你用 docker-compose.yml 启动多个服务,只要不显式指定网络 driver 为 bridge 并禁用 DNS,它默认就会创建一个专属 bridge 网络,并把所有 service 名作为可解析主机名。

  1. 示例片段:
  2. services:
  3. api:
  4. image: my-api
  5. db:
  6. image: postgres
  7. 启动后,api 容器里可以直接 ping db 或连接 postgresql://db:5432

常见失败原因和验证方法

如果 ping 不通名字,先别急着改 DNS 配置,按顺序排查这几项:

  1. 确认两个容器都在同一个自定义网络里(docker network inspect mynet 查看 Containers 列表)
  2. 进容器执行 nslookup dbgetent hosts db,看能否解析出 IP
  3. 确认目标容器监听的是 0.0.0.0(不是 127.0.0.1),否则其他容器连不上
  4. 检查目标容器端口是否真的在监听:docker exec db ss -tlnp | grep :5432

相关文章

精彩推荐