推荐使用用户自定义桥接网络实现跨容器通信,它支持dns解析、ip隔离和端口隔离;创建命令为docker network create --driver bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 my-bridge-net;容器需加入同一网络才能通过服务名通信。

在 Docker 中,桥接网络(Bridge Network)是默认的网络模式,但默认的 bridge 网络不支持容器间通过服务名通信,也不支持自定义子网、DNS 或高级网络策略。要实现稳定、可管理的跨容器通信,推荐使用 用户自定义桥接网络(User-defined Bridge Network) —— 它天然支持容器 DNS 解析、IP 隔离、端口隔离,并且是跨容器通信最常用、最可靠的方式。
创建用户自定义桥接网络
这是实现跨容器通信的基础步骤。Docker 会自动为该网络分配子网、网关,并启用内置 DNS 服务:
- 运行命令创建网络(可指定子网、网关等):
docker network create --driver bridge \ --subnet=172.20.0.0/16 \ --gateway=172.20.0.1 \ my-bridge-net
-
--driver bridge明确指定驱动(虽是默认值,建议显式写出) -
--subnet避免与宿主机或其他 Docker 网络冲突;推荐使用172.16.0.0/12范围内的私有网段 - 创建后可通过
docker network ls和docker network inspect my-bridge-net查看详情
让容器加入同一桥接网络
只有处于同一用户自定义桥接网络中的容器,才能通过容器名或别名互相解析和通信:
- 启动容器时用
--network指定网络:
docker run -d --name web-app --network my-bridge-net nginx docker run -d --name db-server --network my-bridge-net postgres:15
- 也可将已运行的容器连接到网络:
docker network connect my-bridge-net container-name - 容器启动后,
web-app可直接用ping db-server或curl http://db-server:5432(若应用层支持)通信 - Docker 内置 DNS 会自动将容器名解析为对应 IPv4 地址(无需额外配置 /etc/hosts)
验证跨容器通信是否生效
进入任一容器内部,测试连通性和服务可达性:
- 进入容器:
docker exec -it web-app sh(或bash) - 测试 DNS 解析:
nslookup db-server或getent hosts db-server - 测试 TCP 连通:
telnet db-server 5432(PostgreSQL 默认端口)或nc -zv db-server 5432 - 若应用层协议支持,还可直接用 curl、psql、redis-cli 等工具访问对端服务
常见问题与注意事项
避免踩坑,提升配置成功率:
-
不要混用默认 bridge 和自定义 bridge:默认
bridge网络不支持容器名解析,跨容器需用 IP,且不推荐手动管理 IP -
端口无需映射(-p)也能通信:容器间通信走的是 Docker 内部虚拟网桥,不经过宿主机 iptables,因此即使没做
-p 5432:5432,web-app仍能直连db-server:5432 -
多个网络可同时附加:一个容器可加入多个网络(如同时连
my-bridge-net和public-net),用于分场景访问 -
避免子网重叠:若宿主机已有
172.20.0.0/16网段,应换用其他 CIDR,否则会导致路由异常










