如何在Docker中运行mysql

查看docker仓库中的mysql信息

1
docker search mysql

获取mysql镜像

1
docker pull mysql:5.7.33

启动mysql镜像

随容器自动启动

方式一:通过映射目录方式挂载目录(同时应用宿主的时区;sql_mode配置;)

1
2
3
4
5
6
docker run --restart=always --name mysql-dev \
-v /data/docker/instance/mysql/0/db:/var/lib/mysql \
-v /data/docker/instance/mysql/0/conf:/etc/mysql/conf.d \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=${ROOT_PASSWORD} -d -p ${HOST_IP}:${HOST_PORT}:${DOCKER_PORT} mysql:5.7.33 --sql-mode=NO_ENGINE_SUBSTITUTION

方式二:通过卷的方式挂载目录

1
2
3
4
docker run --restart=always --name mysql-dev \
-v mysql-dev_db:/var/lib/mysql \
-v mysql-dev_conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.33

备注:--restart=always可以替换成--rm表示容器停止后不保留历史记录(2者不能同时使用)。mysql_data_v1用于装载mysql数据,mysql_conf_v1用于装载mysql的配置。如果卷不存在docker会自动创建。

自定义配置文件

mysql使用utf8mb4方式配置:/data/docker/instance/mysql/0/conf为自定义配置的目录,该目录下的cnf文件将随容器启动时合并至mysql中

编辑文件
1
vi my.cnf
修改内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
default-time-zone='Asia/Shanghai'
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names = 1
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-host-cache
skip-name-resolve

重启容易使配置生效

1
docker restart mysql