Docker 安装 mysql8.0

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

1
cat /etc/docker/daemon.json

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

  • 中国区镜像
1
2
3
4
5
{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}
  • 网易镜像
1
2
3
4
5
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com"
  ]
}
  • 阿里云镜像

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/db638d8f1d5447bca5e54227203de932.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
阿里云镜像地址

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/96866e63f1ca4b9d9f5e3b129c405cd4.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
设置镜像源

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

1
systemctl restart docker

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

1
docker info | grep Mirrors -A 1

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/bd599a600ab44a73a6f21de4167a4446.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
查看镜像源

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

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/09ed0f1adae443d3a22a34796c8b3c0e.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
镜像下载

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

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/569c7174b200474f9e20724d2f7c4e35.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
下载镜像

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

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

1
2
3
4
5
[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 问题。

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/014c2fb94bb74b0b8f42178efaff315c.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
设置挂载目录

1
2
3
4
5
6
7
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

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/2c0a7dbf9628400a98fcfaaa341c6970.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
启动容器

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

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

https://cdn.xiaobinqt.cn/xiaobinqt.io/20230307/f4a351ea0e654164b078634826de0033.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
docker-entrypoint-initdb.d 目录

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

1
docker exec -it 容器ID bash

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/c086da058f074cfc96f93ce87d8d2cfb.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
进入容器

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

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/534fccacb5c44d9e8dcc9db8df1d6ee3.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
设置host

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

如果修改了用户需要执行

1
flush privileges;

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

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

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/3ca7bd00dfaf402d871581aca72d2e93.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
修改密码

  • secure-file-priv
1
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

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/22c2b7f4e7f24aaba10ede6b043cbb55.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
FAQ1

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

https://cdn.xiaobinqt.cn/xiaobinqt.io/20221121/8591686d90444944a3b3aaefed189b26.png?imageView2/0/q/75|watermark/2/text/eGlhb2JpbnF0/font/dmlqYXlh/fontsize/1000/fill/IzVDNUI1Qg==/dissolve/52/gravity/SouthEast/dx/15/dy/15
999:999

  • flush privileges

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

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