Skip to content
Docker Compose 生产环境实操指南

在理解了 Docker Compose 的基本概念后,本章将通过一个具体的生产级案例,展示如何编写配置文件并部署一个包含 MySQL 数据库Spring Boot 后端应用以及自动更新工具 Watchtower 的完整系统。

一、生产级 docker-compose.yml 示例

在项目的根目录下创建 docker-compose.yml 文件。

yaml
services:
  # 数据库服务:处理数据持久化与存储
  db:
    image: mysql:8.0
    container_name: my-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_strong_password
      MYSQL_DATABASE: my_database
      TZ: Asia/Shanghai
    volumes:
      - /home/my/mysql/data:/var/lib/mysql
    ports:
      - "3306:3306"

  # 后端服务:Spring Boot 应用程序
  server:
    image: registry.cn-hangzhou.aliyuncs.com/my-space/my-server:latest
    container_name: my-server
    restart: always
    depends_on:
      - db
    ports:
      - "8081:8081"
    environment:
      - DB_HOST=db
      - DB_NAME=my_database
      - DB_USER=root
      - DB_PASS=your_strong_password
      - TZ: Asia/Shanghai
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  # 自动化运维:监控镜像更新并自动重启服务
  watchtower:
    image: containrrr/watchtower
    container_name: my-watchtower
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json
    command: --interval 30 --cleanup

二、关键参数详解

1. 容器互联 (depends_on 与 DB_HOST)

  • depends_on:规定了启动顺序。此处配置确保 db 容器先于 server 启动,避免后端程序因找不到数据库而频繁报错重启。
  • DB_HOST=db:这是 Docker Compose 的核心优势。在容器网络内部,db 会被解析为数据库容器的 IP。后端程序只需连接 jdbc:mysql://db:3306/... 即可。

2. 数据持久化 (volumes)

  • 格式宿主机路径:容器内路径
  • 我们将 /home/my/mysql/data 映射到容器的 /var/lib/mysql。这意味着即便执行了 docker compose down 删除了容器,真实的数据库文件依然安全地存储在服务器磁盘上。

3. 自动化更新 (Watchtower)

  • docker.sock 挂载:允许 Watchtower 容器与宿主机的 Docker 守护进程通信,从而具备停止旧容器和启动新容器的权限。
  • config.json 挂载:由于镜像仓库通常是私有的,挂载此文件是为了让 Watchtower 共享宿主机的 docker login 登录凭证,从而有权拉取最新镜像。
  • --interval 30:设定轮询周期,每 30 秒检查一次镜像仓库是否有新版本。

4. 日志限制 (logging)

在生产环境中,容器日志如果不加控制,可能会迅速填满磁盘。

  • max-size: "10m":单个日志文件最大为 10MB。
  • max-file: "3":最多保留 3 个旧日志文件。这种循环覆盖机制确保了磁盘空间的安全性。