通过docker-compose部署mysql

环境

  1. Linux 版本:CentOS 7.9 64位操作系统
  2. Docker 版本:19.03
  3. Docker Compose 版本:v2.7.0

资料参考

  1. Basic Steps for MySQL Server Deployment with Docker
  2. More Topics on Deploying MySQL Server with Docker
  3. Docker-从入门到实践
  4. Overview of docker compose CLI

/data/mysql下创建文件夹

也可以按照自己的习惯在适当位置创建相关文件夹

1
mkdir {conf,datadir,logs}
  • conf:mysql配置文件所在文件夹
  • datadir:数据持久化文件夹
  • logs:日志文件夹

/conf下创建文件my.cnf

文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[mysqld]
user=mysql
# 表名参数名忽略大小写
lower_case_table_names=1

# 设置字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

#指定MySQL允许的最大连接进程数。如果在访问数据库时经常出现"Too Many Connections"的错误提 示,则需要增大该参数值。
max_connections = 2000
max_user_connections = 1900
#如果某个用户发起的连接 error 超过该数值,则该用户的下次连接将被阻塞,直到管理员执行 flush hosts ; 命令或者服务重启, 防止黑客 , 非法的密码以及其他在链接时的错误会增加此值
max_connect_errors = 100000

# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB 字段一起工作时相当必要), 每个连接独立的大小.大小动态增加。
# 设置最大包,限制server接受的数据包大小,避免超长SQL的执行有问题 默认值为16M,当MySQL客户端或mysqld
# 服务器收到大于 max_allowed_packet 字节的信息包时,将发出“信息包过大”错误,并关闭连接。对于某些客户端,如果通信信息包过大,在执行查询期间,可能会遇到“丢失与 MySQL 服务器的连接”错误。默认值 16M。
max_allowed_packet = 50M

[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4

/mysql下创建文件docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: "3"

services:
mysql:
image: mysql:5.7.38
container_name: mysql
command:
- --default_authentication_plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- /data/mysql/conf/my.cnf:/etc/my.cnf
- /data/mysql/datadir:/var/lib/mysql
- /data/mysql/logs:/logs
restart: always
environment:
- TZ=Asia/Shanghai
- MYSQL_RANDOM_ROOT_PASSWORD=true
- MYSQL_ROOT_HOST=%
- MYSQL_DATABASE=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=hpwMqVNj74@0C23
ports:
- "3306:3306"

部分解释:

  • ==–lower_case_table_names=1==:忽略表名大小写,容器创建并运行后在配置无法生效
  • /data/mysql/conf/my.cnf:/etc/my.cnf:挂载配置文件
  • /data/mysql/datadir:/var/lib/mysql:持久化数据
  • /data/mysql/logs:/logs:挂载配置logs
  • TZ=Asia/Shanghai:设置时区
  • MYSQL_RANDOM_ROOT_PASSWORD=true:当这个变量为真时(这是它的默认状态,除非 MYSQL_ROOT_PASSWORD 被设置或 MYSQL_ALLOW_EMPTY_PASSWORD 设置为真),当Docker容器启动时,会为服务器的root用户生成一个随机密码。密码打印到stdout容器中,可以通过查看容器的日志找到,MYSQL_ROOT_PASSWORD和MYSQL_ALLOW_EMPTY_PASSWORD不建议使用,这样设置密码是不安全的
  • MYSQL_ROOT_HOST=%:默认情况下,MySQL 创建 ‘root‘@’localhost’帐户。此帐户只能从容器内部连接,如从容器内 连接到 MySQL 服务器中所述。要允许来自其他主机的 root 连接,请设置此环境变量。例如, 172.17.0.1默认值 Docker 网关 IP 允许来自运行容器的主机的连接。该选项只接受一个条目,但允许使用通配符(例如, MYSQL_ROOT_HOST=172...*或 MYSQL_ROOT_HOST=%)。
  • MYSQL_DATABASE=gitea:此变量允许您指定要在映像启动时创建的数据库的名称。MYSQL_USER 如果用和 提供了用户名和密码 MYSQL_PASSWORD,则创建用户并授予对此数据库的超级用户访问权(对应于GRANT ALL)。指定的数据库由 CREATE DATABASE IF NOT EXIST语句创建,因此如果数据库已经存在,则该变量无效。
  • MYSQL_USER=gitea和MYSQL_PASSWORD=hpwMqVNj74@0C23:这些变量一起用于创建用户并设置该用户的密码,并且该用户被授予对 MYSQL_DATABASE 变量指定的数据库的超级用户权限。MYSQL_USER 和 都是 MYSQL_PASSWORD 创建用户所必需的——如果两个变量中的任何一个未设置,则忽略另一个。如果两个变量都已设置但未设置 MYSQL_DATABASE ,则创建的用户没有任何权限。

如果您挂载的数据目录不为空,则以下任何变量都不会产生任何影响,因为那时不会尝试进行服务器初始化(有关更多详细信息,请参阅 持久化数据和配置更改 )。文件夹中的任何预先存在的内容,包括任何旧的服务器设置,在容器启动期间都不会被修改。
布尔变量包括 MYSQL_RANDOM_ROOT_PASSWORD、 MYSQL_ONETIME_PASSWORD、 MYSQL_ALLOW_EMPTY_PASSWORD和 , MYSQL_LOG_CONSOLE 通过将它们设置为任何非零长度的字符串来使它们为真。因此,将它们设置为例如 “ 0 ”、“ false ”或 “ no ”不会使它们为假,而是实际上使它们为真。这是 MySQL 服务器容器的一个已知问题
无需使用此机制来创建 root 超级用户,默认情况下创建超级用户时使用的密码由 和 的描述中讨论的任一机制设置 MYSQL_ROOT_PASSWORD , MYSQL_RANDOM_ROOT_PASSWORD除非 MYSQL_ALLOW_EMPTY_PASSWORD 为真。
详细可以查看官网资料

执行命令

  1. docker compose up -d

    • up:创建和启动容器
    • -d:后台运行
    • 结果图如下↓
      1658474726944
  2. docker logs mysql
    查看日志,部分结果图如下↓
    1658474839403

  3. docker logs mysql 2>&1 | grep GENERATED
    查看mysql初始化的root用户密码

    1
    2022-07-22 15:24:28+08:00 [Note] [Entrypoint]: GENERATED ROOT PASSWORD: 8L4IrZFs7r8zvYBr2jm0GESRw6596L61

验证

使用熟悉的数据库操作工具进行 ip:3306 账户:root 密码:8L4IrZFs7r8zvYBr2jm0GESRw6596L61 测试链接,连接成功时可以看到成功创建库gitea,用户表gitea成功创建,用户gitea对库gitea有所有的操作权限。通过账户:gitea和密码:hpwMqVNj74@0C23也可以成功链接。

不使用docker-compose

将docker-pompose.yml转换成docker run 来执行,其余操作不便

1
docker run --name mysql -p 3306:3306 --restart=always -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro -v /data/mysql/conf/my.cnf:/etc/my.cnf -v /data/mysql/datadir:/var/lib/mysql -v /data/mysql/logs:/logs -env TZ=Asia/Shanghai -env MYSQL_RANDOM_ROOT_PASSWORD=true -env MYSQL_ROOT_HOST=% -env MYSQL_DATABASE=gitea -env MYSQL_USER=gitea -env MYSQL_PASSWORD=hpwMqVNj74@0C23 -d mysql:5.7.38 --default_authentication_plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=1

-env 有多个也可以修改为如下格式--env-file=/data/mysql/docker.env,前提是创建docker.evn文件,内容如下↓

1
2
3
4
5
6
TZ=Asia/Shanghai
MYSQL_RANDOM_ROOT_PASSWORD=true
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=gitea
MYSQL_USER=gitea
MYSQL_PASSWORD=hpwMqVNj74@0C23

个人并未尝试上述方法,如果执行出现错误可以参考官方文档进行修改,直达链接

windows 环境下docker创建

原理同linux环境,文件路径改为windows下绝对路径类似这样--env-file=windows文件地址\mysql.env -v windows文件地址\conf\my.cnf:/etc/mysql/my.cnf


通过docker-compose部署mysql
https://crudclass.github.io/2022/07/22/docker/Docker-Compose/mysql/
作者
Zero
发布于
星期五, 七月 22日 2022, 3:24 下午
许可协议