Docker Compose 部署微服务:多容器依赖配置、网络互通与环境变量隔离

1. 多容器依赖配置

在微服务架构中,服务间存在启动依赖关系(如数据库先于应用启动)。通过 depends_on 字段定义层级依赖:

services:
  database:
    image: postgres:14
    environment:
      POSTGRES_PASSWORD: $DB_PASSWORD
  backend:
    build: ./backend
    depends_on:
      - database  # 确保database先启动
    environment:
      DB_HOST: database  # 通过服务名访问

关键点

  • depends_on 控制容器启动顺序,但不保证服务完全就绪(需结合健康检查)。
  • 服务间通过 服务名称(如 database)直接通信。

2. 网络互通

Docker Compose 默认创建独立网络,所有服务自动加入同一网络,无需额外配置:

networks:
  default:  # 默认网络
    driver: bridge

互通原理

  • 容器间通过服务名解析 IP(如 backend 访问 database 只需 ping database)。
  • 端口无需暴露到宿主机,仅需在服务内部开放(如数据库仅需容器内端口 5432)。

3. 环境变量隔离

通过分层配置实现环境隔离:

  • 全局变量.env 文件):
    DB_PASSWORD=secret
    APP_ENV=production
    

  • 服务级变量environment 字段):
    backend:
      environment:
        - DB_HOST=database
        - APP_ENV=$APP_ENV  # 引用全局变量
    

  • 文件注入env_file):
    database:
      env_file:
        - ./db.env  # 独立文件管理敏感配置
    

隔离策略

  • 敏感数据(密码/密钥)通过 .envenv_file 管理,避免硬编码。
  • 服务仅加载所需变量,减少信息泄露风险。

4. 完整示例
version: '3.8'

services:
  # 数据库服务
  postgres:
    image: postgres:14
    env_file: ./.env  # 从文件加载变量
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - app-network

  # 后端服务
  backend:
    build: ./backend
    depends_on:
      postgres:
        condition: service_healthy  # 依赖健康状态
    environment:
      DB_URL: postgres://user:${DB_PASSWORD}@postgres:5432/db
    networks:
      - app-network

  # 前端服务
  frontend:
    image: nginx:alpine
    ports:
      - "80:80"
    depends_on:
      - backend
    networks:
      - app-network

# 自定义网络
networks:
  app-network:
    driver: bridge

# 数据卷持久化
volumes:
  pgdata:

验证命令

docker-compose up -d  # 启动所有服务
docker-compose logs backend  # 查看日志确认连接


5. 最佳实践
  • 健康检查:在依赖服务中添加健康检测,确保真实可用性:
    postgres:
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres"]
        interval: 5s
    

  • 配置分离:将环境变量分为:
    • .env:全局通用配置(如环境模式)。
    • service.env:服务专属配置(如数据库连接串)。
  • 网络分段:对敏感服务(如数据库)使用独立网络:
    networks:
      db-network:
        internal: true  # 禁止外部访问
    

通过以上设计,可实现微服务的安全隔离、高效通信与弹性部署。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐