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 中可见 webapi 容器

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) 练习#

  1. 使用 demo2 添加一个 db 服务,仅加入 app-net,并从 web 访问 db 首页。
  2. 创建一个 shared-net,让两个独立 Compose 项目互访,验证服务名解析。
  3. demo3be 服务从 backend 移除,验证网关访问失败并解释原因。