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
这里 frontend 和 backend 网络由 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 服务进行跨项目服务发现。


暂无评论内容