3.4 Compose 网络与数据管理
Docker Compose 除了可以编排多容器服务部署,还能灵活管理服务间网络通信与数据持久化。掌握 Compose 的网络与数据卷高级用法,有助于提升微服务架构的健壮性、安全性和易维护性。
一、自定义网络
1. Compose 默认网络行为
- 每个 Compose 项目(即 yml 文件所在目录)自动生成一个默认网络(名称为
<项目名>_default
)。 - 所有服务自动加入该网络,服务间可通过服务名直接通信(内置 DNS)。
2. 自定义网络的优势
- 可细粒度控制服务间能否互通(实现隔离/分区)
- 能设置网络类型(如 bridge、overlay)、驱动参数、子网等
- 方便与宿主机/外部网络集成
3. 配置自定义网络
version: "3.9"
services:
web:
image: nginx
networks:
- frontend
api:
image: myapi
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
- 多个网络可同时定义,服务可加入一个或多个网络。
- 默认驱动为
bridge
,Swarm/分布式可用overlay
。
4. 网络参数扩展
可指定子网、网关、外部网络等:
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
external_net:
external: true
二、多服务间互通
1. 服务发现
- Compose 网络自动启用 DNS 服务发现。
- 同一网络下,服务可直接用服务名(如
db
)访问彼此,无需硬编码 IP。
# web 服务连接 db 服务数据库
environment:
DB_HOST: db
2. 网络隔离与互通举例
- web 和 api 通过 frontend 网络互通,但 web 不能直接访问 db,提升安全性。
- api 同时在 frontend、backend 网络上,既能被 web 访问,又能连 db。
3. 跨项目网络互通
- 通过
external
网络字段,实现不同 Compose 项目间服务通信。
networks:
shared_net:
external: true
然后在另一个项目引用同名网络。
三、持久化数据卷的高级用法
1. 命名卷(Named Volumes)
- 在 Compose 中声明卷,数据由 Docker 管理,生命周期独立于容器。
volumes:
dbdata: # 声明卷
services:
db:
image: mysql
volumes:
- dbdata:/var/lib/mysql
2. 绑定挂载(Bind Mount)
- 挂载宿主机目录,适合开发调试、配置或日志导出。
services:
web:
volumes:
- ./webdata:/usr/share/nginx/html:ro
3. 高级卷用法
a) 卷驱动与参数
- 可指定驱动(如 local、nfs、cloud)和参数(如容量、选项)。
volumes:
nfsdata:
driver: local
driver_opts:
type: "nfs"
o: "addr=192.168.100.10,rw"
device: ":/path/to/nfs"
b) 卷只读/只写
- 可通过
:ro
或:rw
控制挂载权限。
volumes:
- dbdata:/var/lib/mysql:ro
c) 多服务共享卷
- 多个服务挂载同一命名卷,实现数据共享或通信(如日志、上传目录等)。
services:
app1:
volumes:
- shareddata:/data
app2:
volumes:
- shareddata:/data
volumes:
shareddata:
d) 卷初始化数据
- 初次挂载时,容器路径有内容会自动复制到卷内(仅首次)。
4. 卷备份与恢复
- 可通过
docker run --rm -v 卷:/data -v $PWD:/backup busybox tar czvf /backup/x.tar.gz -C /data .
实现卷内容备份。 - 恢复时反向解包。
四、最佳实践与建议
- 建议所有需要持久化的数据(如数据库、上传、缓存)都要挂载命名卷。
- 用自定义网络实现安全分区,降低服务间攻击面。
- 跨服务/跨项目数据共享,推荐命名卷,不建议用宿主机目录(除非有特殊需求)。
- 生产环境可用 NFS/云盘等驱动,提升卷的可靠性与可扩展性。
- 定期备份数据卷,防止意外丢失。