Compose 网络的自动管理

Compose 网络的自动管理

自动创建默认网络

当你在 docker-compose.yml 中不指定任何网络配置时,Compose 会自动创建一个默认网络:

# 最简单的 Compose 文件
services:
  app:
    image: myapp
  db:
    image: postgres

Compose 会自动:
1. 创建一个名为 {project}_default 的 bridge 网络
2. 将所有服务都连接到这个网络
3. 服务间可以通过服务名互相通信

# 查看自动创建的网络
docker network ls | grep myproject
# myproject_default    bridge    local

服务发现自动配置

Compose 自动为默认网络提供了 DNS 解析,服务名直接解析为对应的容器 IP:

services:
  app:
    image: myapp
    environment:
      - DB_URL=postgres://db:5432/mydb
    # app 容器可以通过 "db" 直接访问数据库

  db:
    image: postgres
    # 无需额外网络配置
# 验证服务发现
docker compose exec app ping db
# PING db (172.18.0.2) 56(84) bytes of data.

自定义网络自动管理

声明式网络定义

services:
  web:
    image: nginx
    networks:
      - frontend
      - backend

  app:
    image: myapp
    networks:
      - backend

  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

这里 frontendbackend 网络由 Compose 自动创建和管理。

网络生命周期

# 启动项目时自动创建网络
docker compose up -d

# 网络创建(如果不存在)
docker network ls | grep "myproject"
# myproject_frontend    bridge    local
# myproject_backend     bridge    local

# 停止并删除时自动清理网络
docker compose down
# 网络被自动删除

网络隔离

Compose 可以通过不同的网络配置实现服务隔离:

services:
  # 对外暴露的服务
  gateway:
    image: nginx
    networks:
      - public
      - private

  # 内部服务
  api:
    image: myapi
    networks:
      - private
      - data

  # 数据库(仅内部访问)
  db:
    image: postgres
    networks:
      - data

networks:
  public:
    driver: bridge
  private:
    driver: bridge
  data:
    driver: bridge
    internal: true   # 禁止外部访问

在这个配置中:
gateway 可以被外部访问(连接 public 网络)
api 不能直接被外部访问,但可通过 gateway 通信
db 在 data 网络中,external: true 阻止了外部容器访问

外部网络引用

使用已有的网络

services:
  web:
    image: nginx
    networks:
      - existing-network

networks:
  existing-network:
    external: true
# 必须先创建外部网络
docker network create existing-network

# 然后启动 Compose
docker compose up -d

指定外部网络名称

networks:
  monitoring:
    external: true
    name: monitoring-network

网络配置选项

networks:
  # 基本桥接网络
  default:
    driver: bridge

  # 带 IPAM 配置
  custom:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/16
          gateway: 172.20.0.1
          ip_range: 172.20.5.0/24

  # Overlay 网络(Swarm 模式)
  overlay-net:
    driver: overlay
    attachable: true

  # 启用 IPv6
  ipv6-net:
    driver: bridge
    enable_ipv6: true
    ipam:
      config:
        - subnet: 2001:db8::/64

多 Compose 项目的网络共享

方案一:共享外部网络

# project-a/docker-compose.yml
services:
  web:
    image: nginx
    networks:
      - shared

networks:
  shared:
    external: true
    name: app-network

# project-b/docker-compose.yml
services:
  worker:
    image: myworker
    networks:
      - shared

networks:
  shared:
    external: true
    name: app-network

方案二:使用默认网络的别名

# 先创建共享网络
docker network create shared-network

# 两个项目都使用这个外部网络

网络调试

# 查看 Compose 项目的网络
docker compose ps --services
docker compose network ls

# 检查特定服务的网络配置
docker compose exec web ip addr

# 测试网络连通性
docker compose exec web ping db

# 查看 DNS 解析
docker compose exec web getent hosts db

# 检查网络详情
docker network inspect myproject_default

面试常考

Q:Compose 创建的默认网络有什么用?

A:默认网络自动将所有服务连接起来,并启用基于服务名的 DNS 解析。服务之间可以直接通过服务名通信,无需手动配置 IP 或连接。

Q:external: true 的网络和普通网络有什么区别?

A:external: true 表示引用一个已经存在的网络,Compose 不会尝试创建它。适用于多个 Compose 项目之间共享网络,或使用预定义的基础设施网络。

Q:docker compose down 时网络会被删除吗?

A:默认情况下,Compose 自动创建的网络会被删除。但是如果网络标记为 external: true,则不会被删除。

Q:如何让多个 Compose 项目中的服务互相通信?

A:创建共享的外部网络,所有项目都引用同一个外部网络。或者使用 Docker 的内置 DNS 服务进行跨项目服务发现。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容