在理解了 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 个旧日志文件。这种循环覆盖机制确保了磁盘空间的安全性。