15.8.4 网络与多服务通信(bridge、external)
网络与多服务通信(bridge、external)#
在 Compose 中,服务间通信依赖 Docker 网络。默认会创建 {project}_default 的 bridge 网络,服务可用服务名互访。若需跨项目通信或网络隔离,应显式声明自定义或 external 网络。
原理草图(默认与 external)
1) 默认 bridge 网络与服务名解析#
示例:默认网络内互通
# 文件:/opt/compose/demo1/docker-compose.yml
version: "3.9"
services:
web:
image: nginx:1.25
ports:
- "8080:80"
api:
image: nginx:1.25
command: ["/bin/sh","-c","echo api-ok >/usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
启动与验证
cd /opt/compose/demo1
docker compose up -d
# 查看自动创建网络
docker network ls | grep demo1
# 进入 web 容器访问 api
docker exec -it demo1-web-1 /bin/sh -c "apk add --no-cache curl >/dev/null 2>&1 || true; curl -s http://api:80"
预期效果
- curl 输出 api-ok
- docker network inspect demo1_default 中可见 web 与 api 容器
2) 自定义 bridge 网络与别名#
示例:显式声明网络并设置别名
# 文件:/opt/compose/demo2/docker-compose.yml
version: "3.9"
services:
web:
image: nginx:1.25
networks:
app-net:
aliases:
- web.local
api:
image: nginx:1.25
command: ["/bin/sh","-c","echo api-v2 >/usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
networks:
- app-net
networks:
app-net:
driver: bridge
验证别名解析
cd /opt/compose/demo2
docker compose up -d
docker exec -it demo2-web-1 /bin/sh -c "apk add --no-cache curl >/dev/null 2>&1 || true; curl -s http://web.local"
命令解释
- aliases:为服务提供同网络内 DNS 别名
- driver: bridge:显式使用 bridge 驱动,便于与其他网络区分
3) external 网络用于跨项目通信#
前置:创建共享网络
docker network create shared-net
项目 A:加入 external 网络
# 文件:/opt/compose/projectA/docker-compose.yml
version: "3.9"
services:
app:
image: nginx:1.25
networks:
- shared-net
networks:
shared-net:
external: true
项目 B:加入同一个 external 网络
# 文件:/opt/compose/projectB/docker-compose.yml
version: "3.9"
services:
admin:
image: nginx:1.25
command: ["/bin/sh","-c","echo admin-ok >/usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
networks:
- shared-net
networks:
shared-net:
external: true
验证跨项目通信
cd /opt/compose/projectA && docker compose up -d
cd /opt/compose/projectB && docker compose up -d
# 从 app 访问 admin
docker exec -it projectA-app-1 /bin/sh -c "apk add --no-cache curl >/dev/null 2>&1 || true; curl -s http://admin"
预期效果
- curl 输出 admin-ok
- external 网络生命周期由管理员管理
4) 多网络绑定与内外网隔离#
示例:网关双网卡
# 文件:/opt/compose/demo3/docker-compose.yml
version: "3.9"
services:
gateway:
image: nginx:1.25
networks:
- frontend
- backend
fe:
image: nginx:1.25
networks:
- frontend
be:
image: nginx:1.25
command: ["/bin/sh","-c","echo backend-ok >/usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
networks:
- backend
networks:
frontend:
backend:
验证访问
cd /opt/compose/demo3 && docker compose up -d
# 网关同时可访问前后端
docker exec -it demo3-gateway-1 /bin/sh -c "apk add --no-cache curl >/dev/null 2>&1 || true; curl -s http://be"
5) 关键命令与排错清单#
网络与容器检查
# 查看网络详情与容器成员
docker network inspect demo1_default
# 查看容器加入的网络
docker inspect demo1-web-1 | grep -A 3 Networks
常见问题与处理
- DNS 解析失败
处理:确认容器在同一网络;执行 docker network inspect 查看成员
- 使用 localhost 访问其他容器
处理:改用服务名 http://service:port
- 端口可达但服务无响应
处理:检查容器内部监听地址是否为 0.0.0.0
6) 练习#
- 使用
demo2添加一个db服务,仅加入app-net,并从web访问db首页。 - 创建一个
shared-net,让两个独立 Compose 项目互访,验证服务名解析。 - 将
demo3的be服务从backend移除,验证网关访问失败并解释原因。