以下是安装Docker版MySQL 8.0.25并实现目录挂载的步骤:
docker仓库:https://hub.docker.com/_/mysql
1. 拉取Mysql镜像文件
bash
docker pull mysql:8.0.25
2. 创建mysql临时容器服务
bash
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.25
3. 创建宿主机挂载目录
bash
mkdir -p /root/docker/mysql/{data,init,conf,logs}
/root/docker/mysql/data
:映射容器的/var/lib/mysql
(数据库文件)/root/docker/mysql/init
:映射容器的/docker-entrypoint-initdb.d
(初始化 SQL/Shell 脚本)/root/docker/mysql/conf
:映射容器的/etc/mysql/conf.d
(自定义配置文件)/root/docker/mysql/logs
:映射容器的/var/log/mysql
(自定义日志文件)
4. 调整目录权限(避免权限问题)
bash
#[root@localhost ~]# docker run --rm mysql:8.0.25 sh -c 'cat /etc/passwd | grep mysql'
#mysql:x:999:999::/home/mysql:/bin/sh
chmod -R 755 /root/docker/mysql/{data,init,conf,logs}
chown -R 999:999 /root/docker/mysql/data # MySQL容器内默认使用UID/GID 999
chmod -R 777 /root/docker/mysql/logs # 确保容器可写入日志
5. 将容器中的数据、配置信息复制到宿主机
bash
docker cp mysql:/var/lib/mysql/. /root/docker/mysql/data
docker cp mysql:/docker-entrypoint-initdb.d/. /root/docker/mysql/init
docker cp mysql:/etc/mysql/conf.d/. /root/docker/mysql/conf
6. 准备MySQL配置文件
创建或编辑配置文件 `/root/docker/mysql/conf/my.cnf:
ini
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
# 错误日志
log_error = /var/log/mysql/error.log
# 可选:启用通用日志和慢查询日志
general_log = 1
general_log_file = /var/log/mysql/mysql.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
# 其他自定义配置...
7. 准备初始化脚本(由于步骤2已完成初始化导致该测试脚本未生效)
将SQL脚本(如建表语句)放入 /root/docker/mysql/init
,例如:
bash
echo "CREATE DATABASE IF NOT EXISTS test_nacos;" > /root/docker/mysql/init/test.sql
8. 启动MySQL容器
bash
# 删除临时容器
docker rm -f mysql
# 启动新容器
docker run -d \
--name mysql \
-p 3306:3306 \
#--restart unless-stopped
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /root/docker/mysql/data:/var/lib/mysql \
-v /root/docker/mysql/init:/docker-entrypoint-initdb.d \
-v /root/docker/mysql/conf:/etc/mysql/conf.d \
-v /root/docker/mysql/logs:/var/log/mysql \
mysql:8.0.25 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
参数说明
-d
:后台运行容器。--name mysql
:容器名称。-p 3306:3306
:将宿主机的 3306 端口映射到容器的 3306 端口。-e MYSQL_ROOT_PASSWORD
:设置 MySQL root 用户的密码(必填)。-v
:将容器内的/var/lib/mysql
目录挂载到宿主机,确保数据持久化。--character-set-server
和--collation-server
:配置字符集和排序规则(可选)。--restart
:mysql重启策略。-
no:不自动重启容器(默认值)。
-
always:容器无论退出状态如何都会自动重启。
-
unless-stopped:容器除非被手动停止,否则会自动重启。
-
on-failure:仅当容器因错误退出时才重启,你还可以设置最大重启次数(例如 on-failure:5)。
bash# 由于运行时没有设置mysql的启动策略,这里需要更新重启策略配置 docker update --restart unless-stopped mysql # 查看重启策略 docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' mysql
-
9. 验证容器运行状态
bash
docker ps -a | grep mysql # 检查状态是否为Up
docker logs mysql # 查看启动日志,确认无报错
10. 容器开启、关闭、重启
bash
docker start mysql # 开启
docker stop mysql # 关闭
docker restart mysql # 重启
11. 检查挂载内容
-
数据持久化 :
/root/docker/mysql/data
会保存所有数据库文件。 -
配置生效 :进入容器检查配置:
bashdocker exec -it mysql bash cat /etc/mysql/conf.d/my.cnf
-
初始化脚本 :首次启动后,
/root/docker/mysql/init
中的脚本会自动执行。 -
日志文件 :在
/root/docker/mysql/logs
下查看error.log
等日志。
常见问题解决
- 权限拒绝 :确保挂载目录权限正确(尤其
data
和logs
)。 - 配置不生效 :检查配置文件路径是否为
/etc/mysql/conf.d
。 - 日志未生成 :确认
my.cnf
中的日志路径与挂载路径一致。
通过以上步骤,MySQL 8.0.25容器将实现数据、配置、脚本和日志的完整挂载,确保持久化和可维护性。