Docker 安装 mysql8.0
1 设置镜像源
国内的网络环境,使用官方的镜像源,下载速度很慢,所以我们需要使用国内的镜像源。
cat /etc/docker/daemon.json
如果没有daemon.json
文件可以手动创建一个。可以设置中国区镜像或是网易镜像,也可以设置阿里云镜像(推荐使用阿里云的加速器,因为快🤣)。
- 中国区镜像
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
- 网易镜像
{
"registry-mirrors": [
"https://hub-mirror.c.163.com"
]
}
- 阿里云镜像
设置完成后,重启docker服务。
systemctl restart docker
可以通过 docker info
查看镜像源是否设置成功。
docker info | grep Mirrors -A 1
2 下载镜像
可以去 https://hub.docker.com/_/mysql/tags 仓库找需要的 mysql 版本👇
通过 docker pull
下载需要的镜像。
3 配置并启动容器
3.1 主机挂载目录
mkdir -p mysql8.0/{conf,data} # conf 存放配置文件,data 存放数据库文件
touch mysql8.0/conf/my.cnf # 创建配置文件
chown -R 999:999 mysql8.0 # 修改权限
将my.cnf
文件中写入以下配置
[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 问题。
3.2 启动容器
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
目录下,可以直接通过宿主机映射到容器目录,比如
-v /root/dockerdata/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
4 开启远程连接
如果不能远程连接可以进入容器后连接数据库,修改 mysql 库的 user 表。
docker exec -it 容器ID bash
查看 user 表中的user='root'
的账号的 host 是否是%
,如果不是则设置为%
。如果已存在多个 root 账号,其中只要有一个的 host 为%
就可以了。
update user set host='%' where user = 'root';
如果修改了用户需要执行
flush privileges;
这样在不重启的 mysql 服务的情况下就可以生效。
5 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
6 FAQ
- ❓ secure-file-priv
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
宿主机的映射目录需要设置用户和用户组为999:999
,因为 docker 容器里的用户也是 999,可以启动一个临时容器进去查看。
- ❓ flush privileges
flush privileges
命令本质上的作用是将当前 user 和 privilige 表中的用户信息/权限设置从 mysql 库中提取到内存里。
MySQL 用户数据和权限有修改后,希望在不重启MySQL服务的情况下直接生效,就可以执行这个命令。