Docker-Compose 【Mysql】

一、环境

使用的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
相关推荐
悟空码字1 小时前
SpringBoot实现系统监控:给应用装上“健康手环”
java·后端·监控
GuluGuluWater1 小时前
受够了同事的垃圾代码?我用 Go 写了个自动审查工具
后端
楼田莉子1 小时前
Linux学习:基础IO相关学习
linux·开发语言·c++·后端·学习
golang学习记1 小时前
Go 中获取两个切片交集的 6 种方法
后端
Cache技术分享1 小时前
261. Java 集合 - Java 开发必备:ArrayList 与 LinkedList 的选择攻略
前端·后端
golang学习记1 小时前
换掉 Maven?全新一代 Java 项目构建工具来了 —— **Maven-mvnd**,性能炸裂!
后端
汤姆yu1 小时前
基于springboot的智能化人员物资调度系统
数据库·spring boot·后端
用户377833043491 小时前
( 教学 )Agent 构建 Prompt(提示词)4. JsonOutputParser
人工智能·后端
一 乐1 小时前
宠物店管理|基于Java+vue的宠物猫店管理管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端