Docker 安装 MySQL 8 教程

前言

官方镜像

版本说明

MySQL 8.4 是一个长期支持(LTS)版本,它的 ** 主流支持 ** 将持续到 **2029 年 4 月 30 日 **,而 ** 延长支持 ** 将持续到 **2032 年 4 月 30 日 **。这意味着 MySQL 8.4 将享有总计 8 年的支持周期,其中前 5 年为完全支持,后 3 年为延长支持。

启动 MySQL 容器

Docker 启动容器

  • 简单启动容器(后台运行)
1
$ docker run --name mysql-server -e MYSQL_ROOT_PASSWORD=your-password -d mysql:8.4.2
  • 持久化 MySQL 容器内的数据库数据(后台运行)
1
$ docker run --name mysql-server -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=your-password -d mysql:8.4.2
  • 指定 MySQL 配置文件来启动容器(后台运行),假设本地配置文件的路径为 /my/custom/config-file.cnf
1
$ docker run --name mysql-server -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=your-password -d mysql:8.4.2

Docker Compose 启动容器

基础使用

  • 创建 docker-compose.yml 配置文件,并写入以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3.5'

services:

mysql:
image: mysql:8.4.2
container_name: mysql-server
restart: always
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: your-password
volumes:
- '/my/own/datadir:/var/lib/mysql'
  • docker-compose.yml 配置文件所在的目录下,使用以下命令创建并启动容器
1
$ docker compose up -d

检测健康状态

若希望在 MySQL 容器启动时,检测 MySQL 服务的运行状态,可以通过添加 healthcheck 指令来配置健康检测:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3.5'

services:

mysql:
image: mysql:8.4.2
container_name: mysql-server
restart: always
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: your-password
volumes:
- '/my/own/datadir:/var/lib/mysql'
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s

指定监听的端口

若需要指定 MySQL 监听的端口,可以通过环境变量 MYSQL_TCP_PORT 来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3.5'

services:

mysql:
image: mysql:8.4.2
container_name: mysql-server
restart: always
ports:
- 3308:3308
environment:
TZ: Asia/Shanghai
MYSQL_TCP_PORT: 3308
MYSQL_ROOT_PASSWORD: your-password
volumes:
- '/my/own/datadir:/var/lib/mysql'

自动创建数据库和用户

若需要在 MySQL 容器启动的时候,自动创建指定的数据库和用户,可以参考以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.5'

services:

mysql:
image: mysql:8.4.2
container_name: mysql-server
restart: always
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: your-password
MYSQL_DATABASE: your-database
MYSQL_USER: your-user
MYSQL_PASSWORD: your-password
volumes:
- '/my/own/datadir:/var/lib/mysql'

允许 Root 用户远程登录

若需要允许外部可以使用 root 用户远程登录 MySQL,可以参考以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3.5'

services:

mysql:
image: mysql:8.4.2
container_name: mysql-server
restart: always
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_HOST: '%'
MYSQL_ROOT_PASSWORD: your-password
volumes:
- '/my/own/datadir:/var/lib/mysql'

启用传统的身份验证插件

MySQL 8 默认使用的身份验证插件(登录校验)是 caching_sha2_password,为了兼容旧版本的 MySQL 客户端(如 MySQL 5.7 或之前的版本),可以让 MySQL 8 启用对 mysql_native_password 身份验证插件的支持,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3.5'

services:

mysql:
image: mysql:8.4.2
container_name: mysql-server
command: ["mysqld", "--mysql-native-password=ON"]
restart: always
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: your-password
volumes:
- '/my/own/datadir:/var/lib/mysql'

使用上面的配置来创建 MySQL 容器后,root 用户默认使用的身份验证插件依旧是 caching_sha2_password,若需要 root 用户切换使用 mysql_native_password 身份验证插件,可以执行以下 SQL 语句来更改:

1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your-password';

之后在需要创建新的 MySQL 用户时,就可以指定使用 mysql_native_password 身份验证插件了,SQL 语句如下:

1
CREATE USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY 'your-password';

特别注意

在上面的配置文件中,command: ["mysqld","--mysql-native-password=ON"] 的写法只针对 MySQL 8.4.x,不同版本的 MySQL 写法可能不一致。

测试 MySQL 容器

查看容器的日志信息

  • 查看容器运行的日志信息
1
$ docker logs mysql-server
  • 或者
1
$ docker logs -f --tail 50 mysql-server

登录 MySQL 服务器

  • 使用 docker exec 命令连接进 Docker 容器内部
1
$ docker exec -it mysql-server bash
  • 连接进 Doker 容器内部后,可以使用以下命令登录 MySQL 服务器
1
$ mysql -h localhost -u root -p

远程登录 MySQL

在默认情况下,MySQL 是不支持远程登录的,详细说明请看 [这里](/posts/24a08cfe.html# 无法远程连接 - MySQL)。强烈建议单独创建一个普通用户,然后授权该用户可以远程访问特定的数据库。首先连接进 Docker 容器的内部,然后使用 root 用户登录 MySQL 服务器,最后执行以下 SQL 语句。

1
2
3
4
5
6
7
8
-- 创建用户
CREATE USER 'your-user-name'@'%' IDENTIFIED WITH mysql_native_password BY 'your-password';

-- 用户授权
GRANT ALL PRIVILEGES ON your-db-name.* TO 'your-user-name'@'%';

-- 刷新权限
FLUSH PRIVILEGES;