引言
本文承接Docker系列教程,基于CentOS7系统,提供Docker run 单机部署 与Docker Compose 新版无警告编排部署双方案,固定部署 MySQL 8.0.36 稳定版本,规避 latest 版本迭代兼容性问题。全程适配本机磁盘,将数据、配置、日志挂载至空闲 /home 目录,实现数据永久持久化。
本文重点解决全网通用 CentOS7 致命坑:home目录挂载权限不足、SELinux拦截、compose版本废弃警告、容器无限循环重启,附带完整目录授权方案+一键部署脚本,零基础可直接复刻,适配开发、生产轻量化场景。
Docker系列往期文章:
Docker 入门篇(一)-- 简介与安装教程(Windows和Linux)
Docker 入门篇(七)-- Docker 安装 nginx
官方镜像仓库:https://hub.docker.com/
一、部署环境说明
-
操作系统:CentOS 7
-
Docker版本:20+ 任意稳定版本
-
Docker Compose版本:V2 新版(兼容无version写法,消除废弃警告)
-
MySQL版本:8.0.36(固定稳定版,规避新版本bug)
-
磁盘挂载方案:专属空闲 /home 目录(18G空闲空间,不占用系统根分区)
本机磁盘分区参考:
Plain
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 37G 6.7G 31G 19% /
/dev/sda1 1014M 187M 828M 19% /boot
/dev/mapper/centos-home 18G 33M 18G 1% /home
二、镜像准备(在线/离线双方案)
2.1 在线拉取指定版本镜像
bash
# 精准拉取 MySQL8.0.36,不使用latest模糊版本
docker pull mysql:8.0.36
# 校验镜像
docker images | grep mysql
2.2 离线镜像部署(无外网服务器)
外网导出镜像 & 服务器导入:
bash
# 外网导出
docker save mysql:8.0.36 -o D:\developsoft\docker\mysql8.0.36.tar
# 服务器上传至 /root 后导入
docker load -i /root/mysql8.0.36.tar
# 校验
docker images
三、目录初始化 + 完整权限授权(核心必做,解决无限重启)
99%容器循环重启原因:CentOS7 默认拦截 /home 目录的 Docker 容器读写权限,仅创建目录不授权,启动直接报错重启。本节为专属根治方案。
3.1 创建持久化目录
bash
mkdir -p /home/mysql8/{conf,data,logs}
3.2 全套目录授权命令(生产+测试通用)
bash
# 1. 目录最高读写权限(解决宿主机文件权限拒绝)
chmod 777 -R /home/mysql8
# 2. SELinux 容器安全标签授权(CentOS7专属必加)
chcon -Rt svirt_sandbox_file_t /home/mysql8
# 3. 临时关闭SELinux(测试环境兜底,重启失效)
setenforce 0
3.3 零报错纯净 my.cnf 配置
规避配置语法错误、多余空行、非法字符导致的启动崩溃,直接覆盖写入:
bash
cat > /home/mysql8/conf/my.cnf << EOF
[mysqld]
port=3306
character-set-server=utf8mb4
default-time_zone='+8:00'
max_connections=1000
validate_password.policy=0
validate_password.length=4
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
default-character-set=utf8mb4
EOF
四、方案一:Docker run 快速部署(简单轻量化)
4.1 启动命令(已适配权限+时区+持久化)
bash
docker run -d \
--name mysql8 \
-p 3306:3306 \
-v /home/mysql8/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /home/mysql8/data:/var/lib/mysql \
-v /home/mysql8/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD="Root@123456" \
-e TZ=Asia/Shanghai \
--restart=always \
mysql:8.0.36
4.2 参数说明
-
-d:后台守护进程运行
-
--restart=always:服务器/ Docker 重启自动拉起
-
-v 挂载:配置、数据、日志完全持久化
-
TZ时区:统一北京时间,解决时间偏差
五、方案二:Docker Compose 新版部署(无警告、推荐生产)
新版 Docker Compose 已废弃 version 字段,旧写法会提示 version is obsolete,下文为官方新标准无警告配置。
5.1 新版无警告 docker-compose.yml
bash
cat > /home/mysql8/docker-compose.yml << EOF
services:
mysql8:
image: mysql:8.0.36
container_name: mysql8
restart: always
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: "Root@123456"
volumes:
- /home/mysql8/conf/my.cnf:/etc/mysql/conf.d/my.cnf
- /home/mysql8/data:/var/lib/mysql
- /home/mysql8/logs:/var/log/mysql
network_mode: bridge
EOF
5.2 Compose 标准运维命令
bash
# 后台启动(无任何废弃警告)
docker compose up -d
# 查看状态
docker compose ps
# 实时日志排查
docker compose logs -f mysql8
# 停止服务
docker compose stop
# 销毁容器(保留宿主机数据,不丢库)
docker compose down
六、一键部署脚本(新增|全程零干预)
整合 目录创建+全套授权+纯净配置+新版compose启动,一条命令完成全套部署,适合快速重装、环境复刻。
6.1 编写 deploy-mysql8.sh
bash
cat > /home/mysql8/deploy-mysql8.sh << EOF
#!/bin/bash
# 1. 清理旧环境
docker compose down
docker rm -f mysql8
# 2. 创建目录并全套授权
mkdir -p /home/mysql8/{conf,data,logs}
chmod 777 -R /home/mysql8
chcon -Rt svirt_sandbox_file_t /home/mysql8
setenforce 0
# 3. 写入纯净my.cnf
cat > /home/mysql8/conf/my.cnf << MYSQL_EOF
[mysqld]
port=3306
character-set-server=utf8mb4
default-time_zone='+8:00'
max_connections=1000
validate_password.policy=0
validate_password.length=4
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
default-character-set=utf8mb4
MYSQL_EOF
# 4. 写入新版无警告compose配置
cat > /home/mysql8/docker-compose.yml << YML_EOF
services:
mysql8:
image: mysql:8.0.36
container_name: mysql8
restart: always
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: "Root@123456"
volumes:
- /home/mysql8/conf/my.cnf:/etc/mysql/conf.d/my.cnf
- /home/mysql8/data:/var/lib/mysql
- /home/mysql8/logs:/var/log/mysql
network_mode: bridge
YML_EOF
# 5. 启动服务
docker compose up -d
echo "======== MySQL8.0.36 部署完成 ========"
echo "远程授权SQL:"
echo "use mysql;ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'Root@123456';flush privileges;"
EOF
6.2 执行一键部署
bash
# 添加脚本执行权限
chmod +x /home/mysql8/deploy-mysql8.sh
# 一键部署
/home/mysql8/deploy-mysql8.sh
七、防火墙放行端口
bash
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports
八、远程连接授权(MySQL8专属)
bash
# 进入容器
docker exec -it mysql8 mysql -uroot -p
sql
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'Root@123456';
flush privileges;
exit;
九、常见报错终极解决方案(重点优化)
-
报错1:WARN version is obsolete:已移除yml中version字段,新版compose完全兼容,无任何警告
-
报错2:Container is restarting / Restarting (1):根因:权限不足+data脏数据+配置错误。解决方案:执行本文3.2全套授权 + 脚本重置环境
-
报错3:Navicat 认证插件错误:执行第八章远程授权SQL即可解决
-
报错4:中文乱码/时区错误:内置utf8mb4+上海时区配置,无需额外修改
十、数据持久化说明
所有数据持久化至宿主机 /home/mysql8 ,删除、重建容器数据不丢失,可随时通过compose脚本一键重构环境,安全稳定,适合长期项目使用。
(注:部分内容可能由 AI 生成)