欢迎光临
我们一直在努力

第22章 Docker实战应用(二):数据库容器化与数据管理

本章聚焦数据库容器化实践,覆盖数据库部署、持久化、备份恢复、迁移与生产建议,适用于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:
pgdata:/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:/dockerentrypointinitdb.d/init.sql:ro
pgdata:/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:
mysqldata:/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: redisserver appendonly yes
volumes:
redisdata:/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:
pgdata:/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:
mysqldata:/var/lib/mysql

redis:
image: redis:7
command: redisserver appendonly yes
volumes:
redisdata:/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
    赞(0)
    未经允许不得转载:171主机测评 » 第22章 Docker实战应用(二):数据库容器化与数据管理
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址