前言
官方镜像
版本说明
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
配置文件所在的目录下,使用以下命令创建并启动容器
检测健康状态
若希望在 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;
|