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-cacheskip-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会发现进程所有者是一个数字)和容器进程在宿主机的执行用户。

posted @ 2023-03-03 17:33  monkey6  阅读(1042)  评论(0编辑  收藏  举报