1.宿主机创建对应目录
mkdir -p /data/dockers/mysql
cd /data/dockers/mysql
# 创建数据目录
mkdir data
# 创建配置目录
mkdir config
# 创建日志目录
mkdir log
2.创建docker-compose文件
/data/docker/mysql
vi docker-compose.yml
version: '3'
services:
mysql:
image: mysql:5.7.30
restart: unless-stopped
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: monkey
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- /data/docker/mysql/data:/var/lib/mysql
- /data/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
- /data/docker/mysql/log:/var/log/mysql
环境变量里面的TZ是设置mysql使用的基础镜像(linux系统)的时区
3.编写mysql配置文件
cd /data/dockers/mysql/config
vi my.cnf
#########################
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
default-time_zone = '+8:00'
log_timestamps=SYSTEM
max_connections=1000
default-authentication-plugin=mysql_native_password
skip-host-cache
skip-name-resolve
#########################
在客户端连接mysql的时候,mysql针对客户端IP会进行DNS反查,确认是否已经授权,此时客户端在连接的时候会非常慢。加上skip-host-cache
和skip-name-resolve
参数后,取消这个功能,连接会加快。
未加参数时的日志:
[Warning] IP address 'xxx' could not be resolved: Temporary failure in name resolution
4.创建容器
cd /data/dockers/mysql/
docker-compose up -d
# 查看容器
docker-compose ps
# 查看日志
docker-compose logs mysql -f
5.创建数据库及用户
docker exec -it mysql bash
mysql -uroot -pmonkey
create database if not exists halodb;
create user 'halo'@'%' identified by 'halo';
grant all privileges on halodb.* to 'halo'@'%';
flush privileges;
show grants for 'halo'@'%';
show databases;
use halodb;
6.其他
-
数据文件权限为polkitd:input问题
可以看到,在容器内部,数据文件的权限是mysql,在宿主机中,数据文件的权限是polkitd
出现这个问题,是因为在容器内,mysql的uid和gid为999,而在宿主机,999的uid对应是polkitd用户,
999的gid对应的是input组,所以出现了错乱。出现这个问题也不用太担心,docker守护进程一般以root权限运行,因此即使用户不对,容器内创建的文件也可以在宿主机创建出来。
要解决这个问题
- 可以在宿主机创建mysql用户和组,然后把/etc/passwd,/etc/group映射到容器。
- 将当前用户的uid和pid传入容器,然后用当前用户启动mysql
- 宿主机修改目录权限,让polkitd对日志目录,配置目录,数据目录可读可写。