必须挂载/var/lib/mysql,否则容器删除后数据彻底丢失;推荐用docker volume create创建命名卷(如mysql-data)并-v挂载,由Docker自动管理路径、权限与生命周期,生产环境首选。

/var/lib/mysql必须挂载,否则容器一删,数据就彻底没了。挂载不是可选项,是上线前的强制动作。
用 docker volume create 创建命名卷最省心
命名卷由 Docker 管理,跨平台一致、权限自动处理、备份恢复也方便,生产环境首选。
- 先创建卷:
docker volume create mysql-data - 启动容器时挂载:
docker run -d -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 - 卷路径在宿主机上是
/var/lib/docker/volumes/mysql-data/_data,不建议手动修改 - 删除容器后执行
docker volume ls仍能看到该卷,数据完好
绑定挂载(-v /host/path:/var/lib/mysql)要特别注意目录状态
适合需要直接编辑数据文件、或做宿主机级备份的场景,但容易因目录非空或权限不对导致容器卡在 “Starting MySQL”。
- 宿主机目录必须为空:
mkdir -p /mydata/mysql && rm -rf /mydata/mysql/* - MySQL 容器内以 uid 999 运行,宿主机目录需赋予该用户写权限:
chown -R 999:999 /mydata/mysql - 绝对路径才有效,
./mysql或~/mysql会被忽略或报错 - 如果目录里已有旧数据(比如从别处拷来的
ibdata1),容器会跳过初始化,MYSQL_ROOT_PASSWORD直接失效
MYSQL_ROOT_PASSWORD 不生效?大概率是挂载点里有残留数据
官方镜像只在首次初始化数据库时读取环境变量。一旦 /var/lib/mysql 下存在 mysql 系统库目录,就认定“已有数据”,跳过全部初始化逻辑。
- 验证方式:进容器执行
ls /var/lib/mysql,若看到mysql、performance_schema等目录,说明已初始化过 - 想重置密码,只能清空挂载目录(确认无重要数据!)再重启容器
-
MYSQL_DATABASE、MYSQL_USER同样只在首次生效,后续修改无效
配置文件别硬覆盖 /etc/mysql/my.cnf,用 /etc/mysql/conf.d/ 挂载更安全
直接挂载整个 my.cnf 容易被镜像升级覆盖;而 conf.d/ 是 MySQL 自动加载的扩展目录,兼容性更好。
- 在宿主机建
/mydata/mysql/conf/my-custom.cnf,内容如:[mysqld] max_connections = 200 character-set-server = utf8mb4
- 启动时加挂载:
-v /mydata/mysql/conf:/etc/mysql/conf.d:ro - :ro 表示只读,避免容器内误改配置
挂载本身不难,难的是挂载后的状态管理——卷是否真在用、目录是否真为空、配置是否被正确加载,这些细节一旦漏查,问题往往出现在半夜重启之后。











