Compose 网络与数据管理——AI教你学Docker

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/云盘等驱动,提升卷的可靠性与可扩展性。
  • 定期备份数据卷,防止意外丢失。

五、参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值