docker一键启动mysql 8.0开发实例:执行docker run命令,配置端口映射、密码、数据库、数据卷及初始化sql,创建独立账号隔离项目环境,避免数据污染。

用 Docker 一键拉起 MySQL 实例,跳过系统级安装
本地开发环境不需要长期运行、也不需要和宿主机 MySQL 端口或配置冲突,Docker 是最快最干净的选择。直接执行以下命令即可启动一个可立即连接的 MySQL 8.0 实例:
docker run -d \ --name mysql-dev \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root123 \ -e MYSQL_DATABASE=myapp_dev \ -v $(pwd)/mysql-data:/var/lib/mysql \ -v $(pwd)/my.cnf:/etc/mysql/conf.d/my.cnf \ -d mysql:8.0
注意几个关键点:
-
MYSQL_DATABASE会自动创建数据库,避免手动CREATE DATABASE -
-v挂载数据目录确保容器重启后数据不丢失;若只是临时调试,可去掉这一行 - 如果宿主机 3306 已被占用,把
-p 3306:3306改成-p 3307:3306,应用连接时用localhost:3307 - MySQL 8.0 默认使用
caching_sha2_password插件,某些老版本客户端(如 MySQL Workbench 6.x)会报Authentication plugin 'caching_sha2_password' cannot be loaded—— 此时需在my.cnf中加一行:default_authentication_plugin=mysql_native_password
为每个项目配独立数据库 + 用户,避免 test 数据污染
多个项目共用 root 或同一个库,容易因迁移脚本误删表、字段名冲突、测试数据串库。应在容器启动后立刻创建隔离账号:
docker exec -it mysql-dev mysql -uroot -proot123 -e " CREATE DATABASE myproject_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'myproject'@'%' IDENTIFIED BY 'devpass123'; GRANT ALL ON myproject_test.* TO 'myproject'@'%'; FLUSH PRIVILEGES;"
这样项目配置里就该用:
- host:
localhost(Docker 内部连接)或127.0.0.1(宿主机连接) - port:
3306(或你映射的端口) - database:
myproject_test - username:
myproject - password:
devpass123
好处是:删库只删自己库,改表不影响别人,CI 脚本也能安全跑 DROP DATABASE。
用 .env + 初始化 SQL 自动建表,避免手动导入
项目根目录放 .env 和 init.sql,启动容器时自动执行建表语句。修改 docker run 命令加入初始化卷:
-v $(pwd)/init.sql:/docker-entrypoint-initdb.d/init.sql
init.sql 示例内容(别加 USE,入口脚本会在目标库中执行):
CREATE TABLE users ( id BIGINT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(255) UNIQUE NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意:
- 文件名必须以
.sql结尾,且放在/docker-entrypoint-initdb.d/下才会被自动执行 - 如果容器已存在并启动过,再挂这个卷也不会重跑 —— 需先
docker rm -f mysql-dev再重新 run - 不要在
init.sql里写DROP TABLE IF EXISTS,否则每次重启都清空数据;真要重置,用mysql -u myproject -pdevpass123 myproject_test 手动重放
Mac / Windows 上连接失败?重点查 host 和认证插件
常见错误是 Can't connect to local MySQL server through socket 或 Access denied for user,本质是连接方式没对上:
- Mac 上用
localhost会走 socket 连接,但 Docker 容器不提供宿主机 socket 文件 —— 必须用127.0.0.1 - Windows WSL2 用户,
localhost指向 WSL2 自身,不是宿主机 Docker Desktop —— 应用连接地址填host.docker.internal(Docker Desktop 提供的特殊 DNS) - MySQL 8.0 客户端报错
Public Key Retrieval is not allowed?在 JDBC URL 后加参数:&allowPublicKeyRetrieval=true&useSSL=false - Workbench 报错
Plugin caching_sha2_password could not be loaded?除了改my.cnf,也可临时用 root 登录后执行:ALTER USER 'myproject'@'%' IDENTIFIED WITH mysql_native_password BY 'devpass123';
真正麻烦的不是搭环境,而是不同系统下 host 解析逻辑、认证插件、socket 路径这三者混在一起时,错误信息根本不指明哪一环出了问题。










