一、环境
使用的
root用户操作,各版本如下:CentOS 10
Docker 29.1.2
Docker Compse 5.0.0
Mysql镜像 8.4
二、流程
2.1、创建数据持久化目录(避免容器删除后数据丢失):
bash
# 创建Mysql数据目录
mkdir -p /root/docker/mysql/data
# 创建Mysql配置目录
touch /root/docker/mysql/conf
# 创建Mysql文件导入导出持久化文件夹,解决容器内文件易丢失、宿主机无法访问的问题
mkdir -p /mysql/docker/mysql-files
# 创建配置my.cnf文件
touch /root/docker/mysql/conf/my.cnf
# 赋予目录权限(docker容器内mysql进程需要读写权限)
chmod -R 777 /root/docker/mysql
2.2、在/root/docker/mysql/conf目录下编写my.cnf文件
bash
# 服务端参数配置
[mysqld]
# 原有配置保留
user=mysql # MySQL启动用户
default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4 # 设置mysql服务端默认字符集
collation-server=utf8mb4_general_ci # 数据库字符集对应一些排序等规则,注意要和character-set-server对应
# default-authentication-plugin=mysql_native_password
max_connections=1000 # 允许最大连接数
max_connect_errors=100 # 最大错误连接数
# 必加核心配置(容器环境必需)
datadir=/var/lib/mysql # 容器内数据目录固定值
socket=/var/run/mysqld/mysqld.sock # 容器内套接字固定路径
pid-file=/var/run/mysqld/mysqld.pid # 容器内PID文件固定路径
lower_case_table_names=1 # Linux下表名忽略大小写(避免大小写坑)
skip-name-resolve # 关闭DNS解析,提升连接速度
log-error=/var/lib/mysql/error.log # 错误日志持久化到数据目录
innodb_buffer_pool_size=512M # 核心缓存(根据容器内存调整,4G内存设2G)
# 推荐补充:性能/运维配置
innodb_log_file_size=256M # InnoDB日志大小(提升事务性能)
max_allowed_packet=64M # 支持大字段/大SQL
slow_query_log=1 # 开启慢查询日志
slow_query_log_file=/var/lib/mysql/slow.log # 慢查询日志路径
long_query_time=2 # 2秒以上记为慢查询
wait_timeout=28800 # 闲置连接超时释放
interactive_timeout=28800 # 交互连接超时释放
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4 # 设置mysql客户端默认字符集
socket=/var/run/mysqld/mysqld.sock # 客户端指定套接字路径(避免连接报错)
2.3、在/root/docker目录下创建docker-compose.yaml文件
yaml
# 新版 Docker Compose(2.x+/5.0.0)已废弃`version`字段
# version: '3.8'
# 定义自定义桥接网络名为app-network(所有服务共享)
networks:
app-network:
driver: bridge
services:
# MySQL服务
mysql:
image: mysql:8.4 # 使用已下载的mysql镜像
container_name: mysql # 容器名称,便于管理
#restart: always # 容器无论退出码是什么,始终自动重启(包括手动停止后,Docker 重启 / 宿主机重启也会重新启动)。
restart: unless-stopped # 手动执行 `docker stop` 停止的容器,不会随 Docker / 宿主机重启而启动。
privileged: true # 提升容器权限(解决CentOS下权限问题)
environment:
MYSQL_ROOT_PASSWORD: "root" # 设置root用户密码
MYSQL_ROOT_HOST: "%" # 允许root从任意主机连接(仅测试/内网环境建议,生产需限制IP)
TZ: Asia/Shanghai # 时区设置
# 可选:初始化数据库(容器首次启动时创建)
# MYSQL_DATABASE: "your_db_name" # 自动创建的数据库名称
volumes:
# 核心数据持久化
- /root/docker/mysql/data:/var/lib/mysql
# 自定义配置文件目录
- /root/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf
# 文件导入导出目录
- /root/docker/mysql/mysql-files:/var/lib/mysql-files
ports:
- "3306:3306" # 端口映射(宿主机3306 -> 容器3306) 仅对外暴露(宿主机/外部访问),服务间访问无需此端口
networks:
- app-network # 接入共享网络
2.4、启动/停止/删除容器以及日志检查:
在docker-compose.yaml所在目录执行
bash
# 启动docker-compose.yaml中所编排的所有容器
docker-compose up -d
# 启动MySQL容器并在后台运行
docker-compose up -d mysql
# 重新Mysql启动容器(--force-recreate 强制重建,避免缓存)
docker-compose up -d mysql --force-recreate mysql
# 启动MySQL容器
docker-compose start mysql
# 重启MySQL容器
docker-compose restart mysql
# 查看Compose管理的容器
docker-compose ps
# 查看所有Docker容器
docker ps -a
# 停止MySQL容器
docker-compose stop mysql
# 查看Mysql容器日志(排查启动失败)
docker-compose logs mysql
# 查看Mysql容器日志 -f 实时查看日志
docker-compose logs -f mysql
# 会删除所有编排的容器
docker-compose down
# 删除Mysql容器(数据卷不会删除,数据保留)
docker-compose down mysql
# 彻底删除Mysql容器 + 数据卷(谨慎!数据会丢失)
docker-compose down -v mysql
# 删除容器 + 网络(数据卷保留)
docker-compose down --remove-orphans
三、校验数据卷是否挂载成功
3.1、方式一
bash
# 查看mysql容器的挂载配置(Source=宿主机路径,Destination=容器内路径)
docker inspect mysql | grep -A 25 "Mounts"
# 执行结果
"Mounts": [
{
"Type": "bind", # 表示是宿主机目录绑定挂载
"Source": "/root/docker/mysql/conf/my.cnf", # 宿主机路径
"Destination": "/etc/mysql/conf.d/my.cnf", # 容器内路径
"Mode": "rw", # 可读写(成功关键)
"RW": true, # 挂载路径可读写
"Propagation": "rprivate" # 私有挂载
},
{
"Type": "bind",
"Source": "/root/docker/mysql/data",
"Destination": "/var/lib/mysql",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/root/docker/mysql/mysql-files",
"Destination": "/var/lib/mysql-files",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
}
],
3.2、方式二
bash
# 1. 宿主机添加测试标记到 my.cnf
echo "# test_mount_success " >> /root/docker/mysql/conf/my.cnf
# 2. 容器内查看是否同步
docker exec -it mysql cat /etc/mysql/conf.d/my.cnf