最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Docker 容器间通过容器名通信如何配
时间:2026-09-03 20:22:47 编辑:袖梨 来源:一聚教程网
关键是在同一自定义bridge网络中运行容器,Docker内置DNS仅在此类网络中生效,支持通过容器名(如ping db)直接通信;默认bridge网络不支持名称解析。
要让 Docker 容器间通过容器名(比如 ping db 或 curl http://web:80)直接通信,关键不是改配置文件,而是让它们处于同一个自定义 bridge 网络中。Docker 内置 DNS 服务只在用户创建的 bridge 网络里生效,原生默认 bridge 网络(bridge)不支持名称解析。
必须用自定义 bridge 网络
默认的 bridge 网络虽然能让容器互通,但容器之间只能靠 IP 地址访问,无法通过名字自动解析。只有你手动创建的 bridge 网络,Docker 才会启动内置 DNS,并把容器名注册进去。
- 创建网络:
docker network create mynet - 启动容器时指定该网络:
docker run -d --name web --network mynet nginx - 另一个容器也加入同一网络:
docker run -d --name db --network mynet mysql - 此时在
web容器里执行ping db就能通,无需查 IP
别漏掉网络名称一致性
所有需要互访的容器,必须使用 完全相同的网络名称(比如都用 mynet),不能一个用 mynet、另一个用 default 或没指定网络。Docker 不会在不同网络之间做 DNS 转发。
- 检查容器是否真在同一个网络:
docker inspect <容器名> | grep NetworkMode或看NetworkSettings.Networks字段 - 如果已有运行中的容器,可以用
docker network connect mynet <容器名>动态加入 - 注意:容器名必须是合法 DNS 主机名(小写字母、数字、短横线,不能以短横线开头或结尾)
Docker Compose 自动搞定
如果你用 docker-compose.yml 启动多个服务,只要不显式指定网络 driver 为 bridge 并禁用 DNS,它默认就会创建一个专属 bridge 网络,并把所有 service 名作为可解析主机名。
- 示例片段:
services:api:image: my-apidb:image: postgres- 启动后,
api容器里可以直接ping db或连接postgresql://db:5432
常见失败原因和验证方法
如果 ping 不通名字,先别急着改 DNS 配置,按顺序排查这几项:
- 确认两个容器都在同一个自定义网络里(
docker network inspect mynet查看Containers列表) - 进容器执行
nslookup db或getent hosts db,看能否解析出 IP - 确认目标容器监听的是
0.0.0.0(不是127.0.0.1),否则其他容器连不上 - 检查目标容器端口是否真的在监听:
docker exec db ss -tlnp | grep :5432