推荐使用命名卷实现mysql数据持久化,如docker volume create mysql-data并挂载至/var/lib/mysql;宿主机目录挂载需确保权限(uid 999)和初始化状态,辅以--restart=unless-stopped等参数提升稳定性。

在 Docker 容器中部署 MySQL 并实现数据持久化,关键在于正确挂载宿主机目录或使用命名卷来保存 MySQL 的数据文件(如 /var/lib/mysql),避免容器重启或删除后数据丢失。
用命名卷方式持久化(推荐)
命名卷由 Docker 管理,安全性高、迁移方便、支持备份,是官方推荐的数据持久化方式。
- 创建一个命名卷:docker volume create mysql-data
- 运行 MySQL 容器并挂载该卷:
docker run -d \
--name mysql-dev \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
 -p 3306:3306 \
 -d mysql:8.0 - 验证是否生效:进入容器执行 ls /var/lib/mysql,能看到 ibdata1、mysql、sys 等系统库目录,说明数据已写入卷中
用宿主机目录挂载(适合开发调试)
将宿主机的某个路径(如 /mydata/mysql)直接映射到容器内 MySQL 数据目录,便于快速查看和编辑数据文件。
- 确保宿主机目录存在且权限正确(MySQL 容器默认以用户 mysql(UID 999)运行):
sudo mkdir -p /mydata/mysql
sudo chown -R 999:999 /mydata/mysql - 启动容器:
docker run -d \
--name mysql-local \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /mydata/mysql:/var/lib/mysql \
 -p 3307:3306 \
 -d mysql:8.0 - 注意:首次挂载空目录时,MySQL 会自动初始化数据库;若目录已有旧数据,需确保版本兼容,否则可能启动失败
补充关键配置项
提升稳定性和可用性,建议添加以下参数:
- --restart=unless-stopped:保证 Docker 服务重启后 MySQL 自动恢复运行
- --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci:设置默认字符集,避免中文乱码(可写进 my.cnf 或通过 command 参数传入)
- 如需自定义配置,可挂载 my.cnf 文件:
-v /path/to/my.cnf:/etc/mysql/conf.d/custom.cnf
验证与日常维护
确认持久化生效后,日常操作更安心:
- 停止并删除容器:docker stop mysql-dev && docker rm mysql-dev,再重新运行同名命令,原数据库和表仍存在
- 备份数据卷:docker run --rm -v mysql-data:/volume -v $(pwd):/backup alpine tar cvf /backup/mysql-backup.tar -C /volume .
- 恢复数据卷:先创建新卷,再用 tar xvf 解压到对应路径
不复杂但容易忽略的是权限和首次初始化逻辑——命名卷最省心,宿主机挂载要多留意 UID 和目录初始状态。










