本章聚焦数据库容器化实践,覆盖数据库部署、持久化、备份恢复、迁移与生产建议,适用于MySQL/PostgreSQL/Redis等常见服务。
22.1 数据库容器化原则
核心原则:
1. 数据持久化使用命名卷或外部存储
2. 配置与数据分离
3. 密码与密钥通过环境变量/secret管理
4. 定期备份与可验证恢复
5. 生产环境关注高可用与监控
22.2 PostgreSQL容器化实践
22.2.1 单机部署
# 使用命名卷持久化
docker run -d \\
–name postgres \\
-e POSTGRES_PASSWORD=secret \\
-e POSTGRES_DB=myapp \\
-v pg-data:/var/lib/postgresql/data \\
-p 5432:5432 \\
postgres:13
22.2.2 Compose部署
version: '3.8'
services:
db:
image: postgres:13
environment:
– POSTGRES_PASSWORD=secret
– POSTGRES_DB=myapp
volumes:
– pg–data:/var/lib/postgresql/data
ports:
– "5432:5432"
volumes:
pg-data:
22.2.3 初始化脚本
# ./db/init.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
services:
db:
image: postgres:13
volumes:
– ./db/init.sql:/docker–entrypoint–initdb.d/init.sql:ro
– pg–data:/var/lib/postgresql/data
22.3 MySQL容器化实践
# MySQL单机部署
docker run -d \\
–name mysql \\
-e MYSQL_ROOT_PASSWORD=secret \\
-e MYSQL_DATABASE=myapp \\
-v mysql-data:/var/lib/mysql \\
-p 3306:3306 \\
mysql:8.0
# Compose
services:
mysql:
image: mysql:8.0
environment:
– MYSQL_ROOT_PASSWORD=secret
– MYSQL_DATABASE=myapp
volumes:
– mysql–data:/var/lib/mysql
ports:
– "3306:3306"
volumes:
mysql-data:
22.4 Redis容器化实践
# Redis持久化(AOF)
docker run -d \\
–name redis \\
-v redis-data:/data \\
redis:7 \\
redis-server –appendonly yes
services:
redis:
image: redis:7
command: redis–server ––appendonly yes
volumes:
– redis–data:/data
volumes:
redis-data:
22.5 数据备份与恢复
22.5.1 PostgreSQL备份与恢复
# 备份
docker exec postgres pg_dump -U postgres myapp > backup.sql
# 恢复
cat backup.sql | docker exec -i postgres psql -U postgres myapp
22.5.2 MySQL备份与恢复
# 备份
docker exec mysql mysqldump -uroot -psecret myapp > backup.sql
# 恢复
cat backup.sql | docker exec -i mysql mysql -uroot -psecret myapp
22.5.3 Redis备份与恢复
# 备份RDB/AOF文件
docker cp redis:/data/dump.rdb ./dump.rdb
docker cp redis:/data/appendonly.aof ./appendonly.aof
# 恢复
# 将文件放回数据目录
22.6 数据迁移与版本升级
22.6.1 卷迁移
# 备份卷
docker run –rm \\
-v pg-data:/data \\
-v $(pwd):/backup \\
alpine tar -czf /backup/pg-data.tar.gz /data
# 恢复卷
docker run –rm \\
-v pg-data:/data \\
-v $(pwd):/backup \\
alpine tar -xzf /backup/pg-data.tar.gz -C /
22.6.2 镜像版本升级(示例)
# PostgreSQL升级(建议导出/导入)
# 1. 备份数据
# 2. 启动新版本容器
# 3. 导入数据
22.7 生产环境建议
✅ 数据库使用专用卷/外部存储
✅ 定期备份并验证恢复
✅ 监控磁盘空间与性能
✅ 避免暴露数据库端口到公网
✅ 使用健康检查确保可用性
✅ 密码与证书放到secret或环境变量
22.8 实战:完整数据库编排
version: '3.8'
services:
postgres:
image: postgres:13
environment:
– POSTGRES_PASSWORD=${DB_PASSWORD}
– POSTGRES_DB=app
volumes:
– pg–data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
mysql:
image: mysql:8.0
environment:
– MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
– MYSQL_DATABASE=app
volumes:
– mysql–data:/var/lib/mysql
redis:
image: redis:7
command: redis–server ––appendonly yes
volumes:
– redis–data:/data
volumes:
pg-data:
mysql-data:
redis-data:
22.9 常见问题
22.9.1 容器重启导致数据丢失
原因:没有使用volume持久化。
解决:使用命名卷或bind mount。
22.9.2 备份文件为空
原因:容器内权限不足或数据库未写入。
解决:检查用户权限与容器日志。
22.9.3 端口冲突
# 修改映射端口
ports:
– "5433:5432"
22.10 小结
通过本章学习,你已经掌握数据库容器化关键能力:
✅ 数据库部署(PostgreSQL/MySQL/Redis)
✅ 数据持久化与初始化
✅ 数据备份与恢复
✅ 卷迁移与升级流程
✅ 生产最佳实践
下一步
在第23章中,我们将进入本专栏重点:
- ROCm虚拟化栈Docker化实战
- GPU设备映射与驱动兼容
- 性能测试与优化
本章思考题:
相关资源:
- PostgreSQL Docker:https://hub.docker.com/_/postgres
- MySQL Docker:https://hub.docker.com/_/mysql
- Redis Docker:https://hub.docker.com/_/redis






