麦克斯仇
Think different
159
文章
35552
阅读
首页
INDEX
文章
ARTICLE
关于
ABOUT
Docker 环境安装 MySQL 8.4.x LTS
创建日期:
2020/02/02
修改日期:
2024/07/24
MySQL
Docker
注:`MySQL 5.7` 已停止维护,下文以 `MySQL 8.4.2 LTS` 为例 仓库地址以及教程:[https://hub.docker.com/_/mysql](https://hub.docker.com/_/mysql) 不想看一堆废话的请直接点击右侧菜单的 `个人推荐实战` ## 拉取 ```bash docker pull mysql:8.4.2 ``` ## 端口 | 端口 | 协议 | 描述 | | ----- | ---- | --------------------------------------- | | 3306 | tcp | 客户端至服务器的连接端口(MySQL协议) | | 33060 | tcp | 客户端至服务器的连接端口(MySQL X协议) | 一般情况下,仅使用 `3306` 即可 ## 环境变量 | 参数 | 描述 | 可选值 | 备注 | | -------------------------- | ---------------------------- | ------ | ----------------------------------------- | | MYSQL_ROOT_PASSWORD | ROOT密码 | String | | | MYSQL_ALLOW_EMPTY_PASSWORD | 允许空密码 | yes | 初始化时使用 | | MYSQL_RANDOM_ROOT_PASSWORD | 生成随机ROOT密码 | yes | | | MYSQL_DATABASE | 默认创建数据库 | String | | | MYSQL_USER,MYSQL_PASSWORD | 默认普通用户与密码 | String | 用户名密码将作为MYSQL_DATABAS的用户名密码 | | MYSQL_ONETIME_PASSWORD | 将root用户密码设置为过期用户 | yes | MySQL 5.6+后可用 | 示例: ```bash # 自定义密码 docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 mysql:8.4.2 # 使用空密码 docker run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306 mysql:8.4.2 # 使用随机密码,在日志内查看随机密码 docker run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=yes -p 3306:3306 mysql:8.4.2 docker logs mysql | grep 'GENERATED ROOT PASSWORD' # 指定默认数据库,用户名,密码 docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=mydb -e MYSQL_USER=test -e MYSQL_PASSWORD=test -p 3306:3306 mysql:8.4.2 ``` ## 自定义MySQL配置文件 MySQL默认配置文件为 `/etc/mysql/my.cnf` ,其引入 `/etc/mysql/conf.d/` 、 `/etc/mysql/mysql.conf.d/` 两个文件夹下的配置文件。若自定义配置文件在 `/my/custom/config-file.cnf` ( `config-file.cnf` 文件名可自定义),则使用 `-v` 参数自定义MySQL配置文件。示例: ```bash docker run -d --name mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 mysql:8.4.2 ``` ## 传参方式配置MySQL 此方法无需配置文件,即可修改MySQL配置,但是不够灵活。示例: ```bash docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 mysql:8.4.2 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ``` 运行以下命令查看完整参数列表(内容太多,不详细列举了)。示例: ```bash docker run -it --rm mysql:tag --verbose --help ``` ## 数据存储 容器内默认数据库存储位置为 `/var/lib/mysql` ,该路径是容器内 `/etc/mysql/mysql.conf.d/mysqld.cnf` 配置文件指定的;建议使用 `-v` 参数绑定物理机。示例: ```bash docker run -d --name mysql -v /my/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 mysql:8.4.2 ``` ## 注意事项 #### 在MySQL初始化完成之前没有连接 如果在容器启动时没有初始化数据库,则将创建一个默认数据库。尽管这是预期的行为,但这意味着在此类初始化完成之前,它将不接受传入的连接。使用自动化工具(例如) `docker-compose` 同时启动多个容器时,这可能会引起问题。如果您尝试连接到MySQL的应用程序无法处理MySQL停机时间或等待MySQL正常启动,则可能有必要在服务启动之前放置connect-retry循环。 #### 针对现有数据库的用法 如果mysql使用已经包含数据库的数据目录启动容器实例, `MYSQL_ROOT_PASSWORD` 则应在运行命令行中忽略该变量;在任何情况下都将忽略它,并且不会以任何方式更改现有数据库。示例: ```bash # 启动一个容器并指定数据库目录以及数据库密码 docker run -d --name mysql -v mydb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:8.4.2 # 删除容器 docker rm -f mysql # 再次启动容器并使用刚刚的数据库目录,但是改变密码 docker run -d --name mysql -v mydb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=654321 -p 3306:3306 mysql:8.4.2 # 此时,数据库的密码依旧是123456,即第二次启动时,环境变量不起作用 ``` #### 数据库备份与还原 示例: ```bash # 备份 docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql # 还原 docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql ``` 该示例中的 `$MYSQL_ROOT_PASSWORD` 使用的 `docker run` 时设置的参数,当MySQL手动更换密码,或者使用其他参数启动时,需要在`-p`后面使用明文密码 ## 个人推荐实战 1. `mkdir -p /work/mysql` :在Linux跟路径下新建 `work` 目录用于存放工作数据,在 `/work/` 下新建 `mysql` 目录用于存储MySQL容器数据 2. `mkdir -p /work/mysql/config /work/mysql/data /work/mysql/log` :在 `/work/mysql/ `下新建 `data` 目录,用于存储MySQL数据文件; `log` 目录,用于存储MySQL日志文件; `config` 目录,用于存储MySQL配置文件 3. `vim /work/mysql/config/config.cnf` :在 `/work/mysql/config/` 下新建 `config.cnf` 文件作为MySQL配置文件,内容如下: ```ini [mysql] # 客户端默认字符集 default-character-set=utf8mb4 [mysqld] # === 基础配置 === # 服务端使用的字符集 character-set-server=utf8mb4 # 数据库排序字符集 collation_server=utf8mb4_general_ci # 服务器在关闭交互式连接之前等待活动的秒数,默认28800(8小时) interactive_timeout=7200 # 服务器关闭非交互连接之前等待活动的秒数,默认28800(8小时) wait_timeout=3600 # 写入错误日志的消息以及写入文件的常规查询日志和慢速查询日志消息中的时间戳的时区,默认UTC时间,SYSTEM代表取系统时间 log_timestamps=SYSTEM # 最大允许数据包 max_allowed_packet=1073741824 # 关闭MySQLx(一般情况下用不到)MySQL5.7不支持此选项,使用时需要注释此配置 mysqlx=0 # === 日志相关 === ## >>> 错误日志 # 错误日志存放文件,默认 datadir 目录下 log_error=/var/log/log-error.log # 开启事务中所有死锁的InnoDB信息记录在错误日志中 innodb_print_all_deadlocks=ON ## >>> 二进制日志 # 二进制日志文件基础名称以及路径,默认 datadir 目录下 log_bin=/var/log/log-bin ## >>> 慢查询日志 # 开启慢查询日志,默认OFF,建议开发和测试环境开启 slow_query_log=ON # 慢查询日志文件位置 slow_query_log_file=/var/log/log-slow.log # 慢查询时间阈值,默认10,单位:秒 long_query_time=1 ## >>> 中继日志,主从复制时,从机需要配置 # 中继日志文件位置,默认 datadir 目录下 #relay_log=/var/log/log-relay ``` 4. 运行容器并使用 `MYSQL_ALLOW_EMPTY_PASSWORD` 设置默认空密码。命令如下 ```bash docker run -d --restart always --name mysql \ -v /work/mysql/config/:/etc/mysql/conf.d \ -v /work/mysql/data/:/var/lib/mysql \ -v /work/mysql/log/:/var/log \ -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \ -e TZ=Asia/Shanghai \ -p 3306:3306 \ mysql:8.4.2 ``` 5. 使用 `docker exec` 进入容器内或者使用 `SQLyog` 、 `Navicat` 等工具连接MySQL,之后修改密码。命令如下 ```bash docker exec -it mysql sh -c 'mysql -uroot --skip-password' use mysql; ALTER USER 'root'@'%' IDENTIFIED BY "123"; flush privileges; DROP USER root@localhost; exit; ```
1143
全部评论