Docker 一键部署 MySQL 8.0
一个 Dockerfile,一个初始化脚本,5分钟拿到一个随时可用的 MySQL,后面接 Hive 时直接连。
一、为什么还要单独写 MySQL?
因为 Hive 的元数据需要一个数据库来存(表结构、分区信息等),默认的 Derby 只能单连接,生产级使用都换成 MySQL 或 PostgreSQL。
核心要求:
- 使用 MySQL 8.0
- 支持远程连接(后面 Hive 要从另一个容器连)
- 字符集和时区预先配置好,避免乱码和时区坑
- 数据持久化到宿主机,不会因容器删除而丢数据
二、目录结构
新建一个文件夹mysql-docker,放以下三个文件:
mysql-docker/ ├── Dockerfile ├── my.cnf └── init.sql # 初始化时自动创建的 Hive 元数据库及用户三、文件内容
1. Dockerfile
FROM mysql:8.0 # 设置 root 密码,并创建 Hive 元数据库和用户(通过环境变量 + init.sql) ENV MYSQL_ROOT_PASSWORD=root123 ENV MYSQL_DATABASE=hive_metastore ENV MYSQL_USER=hive ENV MYSQL_PASSWORD=root123 # 复制自定义 MySQL 配置 COPY my.cnf /etc/mysql/conf.d/my.cnf # 初始化脚本会在容器首次启动时自动执行 COPY init.sql /docker-entrypoint-initdb.d/ # 暴露默认端口 EXPOSE 33062. my.cnf
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-time-zone='+08:00' [client] default-character-set=utf8mb43. init.sql
-- 创建 Hive 元数据库 CREATE DATABASE IF NOT EXISTS hive_metastore DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建 hive 用户(如果已存在则跳过) CREATE USER IF NOT EXISTS 'hive'@'%' IDENTIFIED WITH mysql_native_password BY 'root123'; -- 授权 GRANT ALL PRIVILEGES ON hive_metastore.* TO 'hive'@'%'; -- 刷新权限 FLUSH PRIVILEGES;注意:
init.sql会在容器第一次启动时自动执行,重复启动不会再次执行,避免重复建库报错。
四、构建镜像并启动容器
0. 配置 Docker 镜像加速
如果网络不稳定,可以配置国内镜像源。
在 Docker Desktop 设置 → Docker Engine 中添加:
{ "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me" ] }1. 构建
方式A:最简单,会有高级,docker 认为把密码写在 Dockerfile 不安全
docker build -t mysql:8.0 .方式B:忽略警告
docker build --build-arg MYSQL_ROOT_PASSWORD=root123 --build-arg MYSQL_PASSWORD=root123 -t mysql:8.0 .方式 C:直接加--quiet不输出警告
docker build -t mysql:8.0 . 2>&1 | grep -v "SecretsUsedInArgOrEnv"2. 启动容器(挂载数据卷)
docker run -d \ --name mysql \ -p 3306:3306 \ -v /Users/用户/bigdata/dev/docker/mysql/mysql-data:/var/lib/mysql \ mysql:8.0-v将 Mac 上的mysql-data目录映射到容器内的数据目录,确保数据持久化。- 首次启动会执行
init.sql,稍等约 20 秒让 MySQL 完全就绪。
3. 检查运行状态
docker logs mysql看到[Server] ready for connections.且没有报错,即成功。
五、验证连接
1. 用 root 连入 MySQL
docker exec -it mysql mysql -uroot -proot123进入 MySQL 命令行后:
SHOW DATABASES;应能看到hive_metastore数据库。
2. 测试 hive 用户连接(模拟远程)
在 Mac 上任意 MySQL 客户端(如 DBeaver、DataGrip)连接:
- Host:
localhost - Port:
3306 - User:
hive - Password:
root123 - Database:
hive_metastore
如果连接成功,说明 MySQL 已准备就绪。
六、数据安全与日常维护
数据备份:直接备份 Mac 上的/Users/你的用户名/mysql-data目录,或使用mysqldump:
docker exec mysql mysqldump -uroot -proot123 hive_metastore > metastore_bak.sql镜像更新:如果以后要改密码或添加其他库,修改init.sql或Dockerfile,重新构建即可。
注意:若数据卷已存在,新init.sql不会再次执行,需要手动删除数据卷目录。
七、踩坑问题
- Public Key Retrieval is not allowed
这个错误是因为 MySQL 8.0 默认使用caching_sha2_password认证插件,而客户端连接时需要通过公钥加密密码。
如果客户端没有请求公钥,或者连接 URL 中没允许,就会报Public Key Retrieval is not allowed。
解决办法:
修改MySQL 用户的认证插件为老式的mysql_native_password
ALTERUSER'hive'@'%'IDENTIFIEDWITHmysql_native_passwordBY'root123';FLUSHPRIVILEGES;