本文档说明如何在本地直接使用 官方 MySQL 镜像 启动服务,并通过 Volume / Bind Mount 将数据挂载到宿主机目录,方便测试数据持久化。
可以直接使用官方 MySQL 镜像,不一定需要自己构建镜像。
官方镜像支持把容器内的 MySQL 数据目录挂载到宿主机,例如挂载到当前目录下的 ./data:
/var/lib/mysql./data本地测试时这样做很方便;线上环境通常不建议直接挂载到项目目录,而是使用专门的数据盘、固定绝对路径或 Docker volume。
在当前目录下创建数据目录:
mkdir -p ./data
如果你希望初始化数据库脚本,也可以额外准备:
mkdir -p ./initdb
说明:
./data:用于持久化 MySQL 数据文件./initdb:可选,放置初始化 SQL 或 shell 脚本,首次启动时会自动执行以 MySQL 8.0 为例:
docker pull mysql:8.0
如果你需要其他版本,可替换标签,例如:
docker pull mysql:5.7
执行下面命令:
docker run -d \--name mysql-test \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=123456 \-e MYSQL_DATABASE=testdb \-v "$(pwd)/data:/var/lib/mysql" \-v "$(pwd)/initdb:/docker-entrypoint-initdb.d" \mysql:8.0
参数说明:
--name mysql-test:容器名-p 3306:3306:映射到本机 3306 端口MYSQL_ROOT_PASSWORD=123456:设置 root 密码MYSQL_DATABASE=testdb:首次启动时自动创建数据库 testdb-v "$(pwd)/data:/var/lib/mysql":把 MySQL 数据目录挂载到当前目录 data-v "$(pwd)/initdb:/docker-entrypoint-initdb.d":可选初始化脚本目录如果你暂时没有初始化脚本,可以去掉 initdb 这一行。
查看容器状态:
docker ps
查看日志:
docker logs -f mysql-test
看到类似下面的日志,通常表示启动成功:
ready for connections
可以直接进入容器连接:
docker exec -it mysql-test mysql -uroot -p123456
进入 MySQL 后测试:
SHOW DATABASES;USE testdb;
也可以从宿主机本地工具连接:
127.0.0.13306root123456docker restart mysql-test
如果数据仍然存在,说明挂载到宿主机的 ./data 已生效。
停止容器:
docker stop mysql-test
删除容器:
docker rm mysql-test
注意:
./data 中的数据./data 目录,数据库数据才会真正丢失本地可以直接挂载到当前项目目录,例如:
-v "$(pwd)/data:/var/lib/mysql"
这样做的优点:
适合:
线上通常不建议把 MySQL 数据直接挂在项目当前目录下,而更推荐:
/data/mysql原因包括:
线上更常见的方式示例:
docker volume create mysql_datadocker run -d \--name mysql-prod \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=your_strong_password \-v mysql_data:/var/lib/mysql \mysql:8.0
或者:
docker run -d \--name mysql-prod \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=your_strong_password \-v /data/mysql:/var/lib/mysql \mysql:8.0
只有在下面这些场景,才建议自己写 Dockerfile 构建:
my.cnf如果只是本地测试 MySQL 是否能正常启动、连接、持久化,直接使用官方镜像通常就够了。