在 Docker 中安装 MySQL

对于开发者,安装 MySQL 不是什么难事,但是往往步骤比较多。我记录了一个 Docker compose 模板,能直接启动一个配置好的 MySQL 容器,用于开发。

Docker compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3'
services:
mysql:
image: mysql:5.7
container_name: mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: '123456'
ports:
- 43306:3306
volumes:
- mysql_data:/var/lib/mysql
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --character-set-client-handshake=FALSE
healthcheck:
test: out=$$(mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD); echo $$out | grep 'mysqld is alive' || { echo $$out; exit 1; }
start_period: 0s
interval: 5s
timeout: 3s
retries: 2

volumes:
mysql_data:
external: true

配置说明

容器卷

MySQL 有三个存放数据的目录:

  • /var/lib/mysql:数据目录
  • /var/log/mysql:日志目录
  • /etc/mysql/conf.d:配置文件目录

1️⃣最重要的当然是数据目录。

2️⃣配置文件目录可用可不用,因为可以使用启动参数。如果要用的话,创建一个 my.cnf,内容为

1
2
3
4
5
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

实际上就是配置了字符集,因此完全可以用启动参数代替。

3️⃣日志目录最不重要。

mysqld 启动参数

使用如下命令查看(选项很多,保存到文件中再查看):

1
2
docker run -it --rm mysql:5.7 --verbose --help > mysqld_args.txt
more mysqld_args.txt

配置文件中的大部分选项都可以被启动参数代替,很适合快速创建容器。

启动命令是:

1
mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --character-set-client-handshake=FALSE

--character-set-server--collation-server 很容易理解。

--character-set-client-handshake 的意思是:

Don’t ignore client side character set value sent during handshake.

即优先采用客户端的字符集,默认为 TRUE。我设置为了 FALSE,强制客户端使用服务端的字符集。

healthcheck

测试命令是:

1
out=$$(mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD); echo $$out | grep 'mysqld is alive' || { echo $$out; exit 1; }
  • $$ 是为了转义 $,因此 shell 命令中的 $ 都需要双写;
  • 如果命令的退出码为 0,则代表 healthy;否则,是 unhealthy;
  • 这个命令可以当作一个模板:如果 mysqladmin ping 返回内容包括 mysqld is alive,则正常退出。否则,打印返回内容,并设置退出码为 1;

参考