6月2日 23:40

Docker 跑数据库怎么做?数据持久化、备份和生产环境注意事项

Docker 跑数据库能快速搭建开发环境,但生产环境要格外注意数据持久化、性能和备份。一句话:开发环境放心用,生产环境谨慎用。

数据持久化:第一优先级

容器删了数据就没了——这是 Docker 跑数据库最大的风险。必须用 Volume 挂载数据目录:

bash
# MySQL:把 /var/lib/mysql 挂到宿主机 docker run -d -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret mysql:8 # PostgreSQL:把 /var/lib/postgresql/data 挂出来 docker run -d -v pg_data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=secret postgres:16

-v mysql_data:/var/lib/mysql 用 Docker Volume(推荐)。也可以用宿主机目录 -v /data/mysql:/var/lib/mysql,但权限管理更麻烦。

验证持久化docker rm -f 删掉容器后重新 docker run(同一个 volume),数据还在。

开发环境:docker-compose 一键搭建

yaml
# docker-compose.yml services: db: image: postgres:16 environment: POSTGRES_DB: myapp POSTGRES_PASSWORD: dev123 ports: - "5432:5432" volumes: - pg_data:/var/lib/postgresql/data redis: image: redis:7 ports: - "6379:6379" volumes: pg_data:

docker compose up -d 一键启动 PostgreSQL + Redis。ports 映射到宿主机,本地开发工具(psql、DBeaver)直连。

生产环境的注意事项

1. 不要把数据库密码放环境变量

环境变量对容器内所有进程可见,docker inspect 也能看到。用 Docker Secrets(Swarm)或文件挂载:

bash
docker run -d -v /secrets/db_password.txt:/run/secrets/db_password:ro mysql:8

2. 设置资源限制

数据库不加限制会吃光宿主机内存:

bash
docker run -d --memory=4g --memory-swap=4g --cpus=2 mysql:8

同时在数据库配置里调整缓存大小(MySQL 的 innodb_buffer_pool_size,PG 的 shared_buffers),让它和容器内存限制匹配。

3. 健康检查

yaml
healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 3

容器"运行中"不代表数据库"可用"——MySQL 可能还在做崩溃恢复。健康检查确保只有真正可用的数据库接收连接。

备份

bash
# MySQL 备份 docker exec mysql_container mysqldump -u root -p secret mydb > backup.sql # PostgreSQL 备份 docker exec pg_container pg_dump -U postgres mydb > backup.sql

定时备份:用 cron + 上面的命令,把 SQL 文件推到 S3 或其他存储。不要把备份文件存在容器里。

生产环境该不该用 Docker 跑数据库?

适合:中小规模、团队能力有限、需要快速部署。用 Docker 统一运维比手动管理多台数据库服务器简单。

不适合:高性能场景(I/O 密集型数据库)、需要极致调优、合规要求禁止容器化。Docker 的网络和存储有一层抽象,理论上比裸机慢 5-10%。大多数场景这 5% 可以忽略,但对 TPS 要求极高的系统可能不行。

折中方案:数据库跑在宿主机或托管数据库(RDS),只把应用放在 Docker 里。

标签:Docker