一、 核心原理与目的
为什么要用本地目录挂载?
不用挂载,容器一删数据灰飞烟灭;用挂载,宿主机和容器共享同一块物理硬盘空间。
数据持久化:数据存宿主机,删容器不丢数据。
配置修改方便:直接在宿主机改 my.cnf,不用进容器。
自动化建库:通过挂载 SQL 脚本,容器首次启动时自动建库建表。
二、 前置准备(标准三步曲)
- 创建宿主机目录
在 /root 下建好专门管理 MySQL 的文件夹。
mkdir -p /root/mysql/data
mkdir -p /root/mysql/conf
mkdir -p /root/mysql/init
- 准备配置文件和初始化脚本
配置文件 my.cnf:解决中文乱码(UTF8MB4)。
echo -e "[mysqld]\ncharacter-set-server=utf8mb4\ncollation-server=utf8mb4_unicode_ci" > /root/mysql/conf/my.cnf
初始化脚本 init.sql:首次启动时自动建一个测试库。
echo "CREATE DATABASE IF NOT EXISTS test_db;" > /root/mysql/init/init.sql
- 赋予数据目录最高权限(极其重要)
MySQL 容器内的用户经常因为宿主机目录权限不足而启动失败,直接给 777。
chmod -R 777 /root/mysql/data
三、 标准启动命令
复制下面这段完整命令,一把过:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql:8.0
(注:如果你的系统有网络转发Bug,可以将 -p 3306:3306 替换为 --network host)
三个挂载参数深度解析:
-v /root/mysql/data:/var/lib/mysql:存数据的,里面有表结构、记录等。
-v /root/mysql/init:/docker-entrypoint-initdb.d:魔法目录,放进去的 .sql 会在第一次启动时自动执行。
-v /root/mysql/conf:/etc/mysql/conf.d:放配置文件的,覆盖容器默认配置。
四、 验证是否成功
看状态:docker ps,出现 Up 即成功。
看数据:打开左侧 SFTP,进入 /root/mysql/data,刷新,如果看到一堆 ibdata1、mysql 等文件,说明挂载生效了。
验脚本:进入容器连 MySQL,看 test_db 库是否存在。
docker exec -it mysql mysql -uroot -p123 -e "show databases;"
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_50379372/article/details/170294727



