Docker配置mysql
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组,所以出现了错乱。
容器时对外提供服务的,例如mysql和nginx,对外提供服务,就存在风险。如果容器中,mysql进程以root权限运行,那么使用mysql的人可能会获得容器的root权限,同时,如果容器内进程以root权限执行,容器在宿主机内对应的进程也是root权限,也就是获得了宿主机的root权限(可能不准确,容器内的root和宿主机的root权限应该有区别)
可以通过在docker run命令中加入--user uid:gid或者docker-compose.yml中加入user: "uid:gid"(user和image同级,user:之后要加一个空格)来执行容器内进程的执行用户(如果指定的uid和gid在容器中不存在,进入容器ps会发现进程所有者是一个数字)和容器进程在宿主机的执行用户。