Docker Compose 网络通信
🚀 1. 默认网络(bridge)
每次运行 docker-compose up,Compose 会自动创建一个默认的桥接网络,名称规则是:
<项目目录名>_default
✅ 容器间通信方式
在这个默认网络中,每个服务可以直接通过服务名通信:
services:
backend:
build: ./backend
depends_on:
- db
db:
image: postgres
在 backend 容器中可以通过 db:5432 访问 PostgreSQL。
🧭 2. 自定义网络(推荐)
使用 networks 明确指定网络,可以让多个服务加入同一网络,控制更细:
services:
web:
build: ./web
networks:
- mynet
api:
build: ./api
networks:
- mynet
networks:
mynet:
这样 web 和 api 可以互相通过服务名通信。
🧱 3. 网络别名(alias)
你可以给某个服务设置多个别名:
services:
service-a:
image: myimage
networks:
mynet:
aliases:
- alias1
- alias2
networks:
mynet:
现在其他容器可以通过 service-a、alias1、alias2 任意名称访问该服务。
🌐 4. 跨 Compose 项目通信
不同的 docker-compose.yml 项目之间,默认是隔离的。如果你希望它们通信,需要:
- 使用 外部网络
- 保证网络名称一致
示例:
先创建一个共享网络:
docker network create shared-net
然后两个项目的 Compose 文件中都引用这个网络:
networks:
default:
external:
name: shared-net
这样两个项目中的服务就能互相通信了。
🔍 5. 查看网络信息与调试
查看现有网络:
docker network ls
查看网络详细结构:
docker network inspect myapp_default
查看某个容器的网络连接:
docker inspect <container_id>
🧪 示例:测试网络通信
version: '3.8'
services:
ping:
image: alpine
command: sh -c "apk add curl && curl redis:6379"
depends_on:
- redis
networks:
- test-net
redis:
image: redis
networks:
- test-net
networks:
test-net:
运行后 ping 会尝试连接 redis 服务,通过服务名直接通信。
📌 总结表格
| 功能类型 | 描述 |
|---|---|
| 默认网络 | 每个 Compose 项目自动生成 <项目名>_default 网络 |
| 服务名通信 | Compose 网络中服务可以直接通过服务名访问 |
| 自定义网络 | 使用 networks 指定网络,支持多个服务连接相同网络 |
| 外部网络 | 允许多个 Compose 项目通信,需事先 docker network create |
| 网络别名 | 为服务添加多个访问名称 |

浙公网安备 33010602011771号