Docker 一键部署 MySQL 8.0

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 3306

2. my.cnf

[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-time-zone='+08:00' [client] default-character-set=utf8mb4

3. 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.sqlDockerfile,重新构建即可。

注意:若数据卷已存在,新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;