Docker 安装 mysql8.0

国内的网络环境,使用官方的镜像源,下载速度很慢,所以我们需要使用国内的镜像源。

shell

cat /etc/docker/daemon.json

如果没有daemon.json文件可以手动创建一个。可以设置中国区镜像或是网易镜像,也可以设置阿里云镜像(推荐使用阿里云的加速器,因为快🤣)。

  • 中国区镜像

json

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}
  • 网易镜像

json

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com"
  ]
}
  • 阿里云镜像

阿里云镜像地址
阿里云镜像地址

设置镜像源
设置镜像源

设置完成后,重启docker服务。

shell

systemctl restart docker

可以通过 docker info 查看镜像源是否设置成功。

shell

docker info | grep Mirrors -A 1

查看镜像源
查看镜像源

可以去 https://hub.docker.com/_/mysql/tags 仓库找需要的 mysql 版本👇

镜像下载
镜像下载

通过 docker pull下载需要的镜像。

下载镜像
下载镜像

shell

mkdir -p mysql8.0/{conf,data} # conf 存放配置文件,data 存放数据库文件
touch mysql8.0/conf/my.cnf # 创建配置文件
chown -R 999:999 mysql8.0 # 修改权限

my.cnf文件中写入以下配置

shell

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= /var/lib/mysql

具体可以参考https://github.com/docker-library/mysql/blob/master/8.0/config/my.cnf

secure-file-priv 设置为 /var/lib/mysql是为了解决 MySQL 8 docker-compose :Failed to access directory for –secure-file-priv 问题。

设置挂载目录
设置挂载目录

shell

docker run -d \
    -p 3310:3306 \
    --name mysql8.0 \
    -v /root/weibin/mysql8.0/conf/my.cnf:/etc/mysql/my.cnf \
    -v /root/weibin/mysql8.0/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    mysql:8.0

启动容器
启动容器

这里还可以在启动容器时初始化一些工作,比如建库建表,可以把 sql 或是 sh 文件放在容器的/docker-entrypoint-initdb.d目录下,可以直接通过宿主机映射到容器目录,比如

shell

-v /root/dockerdata/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

docker-entrypoint-initdb.d 目录

如果不能远程连接可以进入容器后连接数据库,修改 mysql 库的 user 表。

shell

docker exec -it 容器ID bash

进入容器
进入容器

查看 user 表中的user='root'的账号的 host 是否是%,如果不是则设置为%。如果已存在多个 root 账号,其中只要有一个的 host 为%就可以了。

设置host
设置host

shell

update user set host='%' where user = 'root';

如果修改了用户需要执行

shell

flush privileges;

这样在不重启的 mysql 服务的情况下就可以生效。

shell

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

修改密码
修改密码

  • secure-file-priv

shell

Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files

FAQ1
FAQ1

宿主机的映射目录需要设置用户和用户组为999:999,因为 docker 容器里的用户也是 999,可以启动一个临时容器进去查看。

999:999
999:999

  • flush privileges

flush privileges命令本质上的作用是将当前 user 和 privilige 表中的用户信息/权限设置从 mysql 库中提取到内存里。

MySQL 用户数据和权限有修改后,希望在不重启MySQL服务的情况下直接生效,就可以执行这个命令。