Docker 入门篇(八)-- CentOS7 安装 MySQL 8

引言

本文承接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 生成)

相关推荐
w200512241 小时前
Pod管理
linux·服务器·云原生·容器·k8s·podman
典典分享指南2 小时前
用大模型把写作 SOP 变成可复用 Prompt
docker·jupyter·eclipse·phpstorm·myeclipse
想带你从多云到转晴2 小时前
MySQL重点梳理
数据库·mysql
sryyd_022 小时前
Kubernetes Pod 管理从入门到实战:命令、YAML 与生命周期全解析
云原生·容器·kubernetes
冰暮流星3 小时前
mysql之外键约束
数据库·mysql
betazhou5 小时前
mysql shell8.4.10+mysql 8.4.10搭建MySQL replicaset主从
数据库·mysql·ffmpeg·replicaset·mysql shell
Larru-Sun5 小时前
从零开始用 Docker 部署 Node.js 后端服务
docker·容器·node.js
2601_962065256 小时前
2.启动mysql容器
java·数据库·mysql
feilieren7 小时前
ubuntu 安装 docker
linux·ubuntu·docker