Docker Compose之mysql部署全过程

 更新时间:2026年08月21日 09:16:34   作者:EthanPan_  
这篇文章主要介绍了Docker Compose之mysql部署全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言:

本文将指导你如何使用 Docker Compose 轻松部署 MySQL,并加载自定义配置文件,以实现数据持久化和灵活的配置管理。

在开始之前,请确保你的系统已安装 Docker 和 Docker Compose。

如果你尚未安装,可以参考我的: 这篇文章

1. 创建挂载目录

首先,我们需要创建两个目录用于挂载 MySQL 的数据和配置文件,确保数据的持久化和配置的自定义。

# 创建用于存放 MySQL 数据的目录
mkdir -p /data/mysql/data

# 创建用于存放 MySQL 配置文件的目录
mkdir -p /data/mysql/conf
  • /data/mysql/data: 该目录将挂载到 MySQL 容器的 /var/lib/mysql 目录,用于持久化存储 MySQL 的数据库文件。
  • /data/mysql/conf: 该目录将用于存放自定义的 my.cnf 配置文件,并通过数据卷挂载到容器中,覆盖默认配置。

2. 配置 docker-compose.yml 文件

接下来,在 /data/mysql 目录下创建一个 docker-compose.yml 文件,并粘贴以下配置信息:

version: '3'
services:
  mysql:
    image: mysql:8.0.33 # 使用 MySQL 8.0.33 镜像
    container_name: mysql # 定义容器名称为 mysql
    volumes:
      - /data/mysql/data:/var/lib/mysql # 挂载数据目录
      - /data/mysql/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf # 挂载自定义配置文件
    restart: always # 容器总是尝试重新启动
    ports:
      - 3336:3306 # 将宿主机的 3336 端口映射到容器的 3306 端口
    environment:
      MYSQL_ROOT_PASSWORD: 12345678 # 设置 root 用户的密码
      TZ: Asia/Shanghai # 设置容器的时区为上海
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 设置 MySQL 服务的默认字符集和排序规则
  • image: mysql:8.0.33: 指定了要使用的 Docker 镜像为 MySQL,版本为 8.0.33。你可以根据需要选择其他版本。

  • container_name: mysql: 为运行的 MySQL 容器指定一个名称,方便后续使用 Docker 命令进行管理。

volumes: 定义了数据卷的挂载。

  • /data/mysql/data:/var/lib/mysql: 将宿主机上的 /data/mysql/data 目录挂载到容器内的 /var/lib/mysql 目录,用于持久化存储 MySQL 的数据。
  • /data/mysql/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf: 将宿主机上的/data/mysql/conf/my.cnf文件挂载到容器内的指定路径,用于覆盖 MySQL 的默认配置。

restart: always: 配置 Docker 在容器意外停止时自动重新启动。

ports: - 3336:3306: 将宿主机的 3336 端口映射到容器内部 MySQL 服务的默认端口 3306。你可以根据需要修改宿主机端口,但请注意不要与其他服务冲突。

environment: 设置容器的环境变量。

  • MYSQL_ROOT_PASSWORD: 12345678: 设置 MySQL root 用户的初始密码。请务必修改为你自己的安全密码。
  • TZ: Asia/Shanghai: 设置容器的时区为亚洲/上海,避免时区问题。

command: 覆盖容器启动时执行的默认命令,这里用于设置 MySQL 服务的默认字符集为 utf8mb4 和排序规则为 utf8mb4_unicode_ci,以支持更广泛的字符。

3. 创建 Mysql 配置文件

/data/mysql/conf 目录下创建一个名为 my.cnf 的配置文件,并粘贴以下内容:

[mysqld]
default-storage-engine=INNODB  # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4      # 设置 mysql 服务端默认字符集
pid-file        = /var/run/mysqld/mysqld.pid  # pid 文件所在目录
socket          = /var/run/mysqld/mysqld.sock # 用于本地连接的 socket 套接字
datadir         = /var/lib/mysql              # 数据文件存放的目录
symbolic-links=0
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 定义 mysql 应该支持的 sql 语法,数据校验等!

# 允许最大连接数
max_connections=200


# 同一局域网内注意要唯一
server-id=3336
# 开启二进制日志功能 & 日志位置存放位置`/var/lib/mysql`
#log-bin=mysql-bin
log-bin=/var/lib/mysql/mysql-bin
# binlog 格式
# 1. STATEMENT:基于 SQL 语句的模式,binlog 数据量小,但是某些语句和函数在复制过程可能导致数据不一致甚至出错;
# 2. MIXED:混合模式,根据语句来选用是 STATEMENT 还是 ROW 模式;
# 3. ROW:基于行的模式,记录的是行的完整变化。安全,但 binlog 会比其他两种模式大很多;
binlog_format=ROW
# FULL:binlog 记录每一行的完整变更 MINIMAL:只记录影响后的行
binlog_row_image=FULL
# 日志文件大小
max_binlog_size=100M
# 定义清除过期日志的时间(这里设置为 7 天)
expire_logs_days=7

# ================= ↑↑↑ mysql 主从同步配置 end ↑↑↑ =================

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4  # 设置 mysql 客户端默认字符集

[mysqld]: 该部分配置了 MySQL 服务端的参数。

  • default-storage-engine=INNODB: 设置默认的存储引擎为 InnoDB,它支持事务和行级锁定,是推荐的存储引擎。
  • character-set-server=utf8mb4: 设置服务端使用的默认字符集为 utf8mb4,支持存储更广泛的 Unicode 字符。
  • datadir=/var/lib/mysql: 指定 MySQL 数据文件存放的目录,与 docker-compose.yml 中挂载的数据卷对应。
  • sql_mode: 定义了 MySQL 应该支持的 SQL 语法和数据校验规则。这里设置了严格模式。
  • max_connections: 设置允许的最大客户端连接数。
  • server-id: 在主从复制环境中用于唯一标识服务器。在单机部署中,保持唯一即可。
  • log-bin: 启用二进制日志,用于数据恢复和主从复制。这里指定了日志文件的路径。
  • binlog_format=ROW: 设置二进制日志的格式为 ROW,记录每一行的更改,更安全可靠。
  • binlog_row_image=FULL: 记录完整的行变更信息。
  • max_binlog_size: 设置单个二进制日志文件的最大大小。
  • expire_logs_days: 设置二进制日志的过期天数,MySQL 会自动清理过期的日志。

[mysql]: 该部分配置了 MySQL 客户端的默认字符集。

[client]: 该部分配置了 MySQL 命令行客户端的默认字符集。

4. 启动 MySQL 容器

完成以上配置后,切换到 /data/mysql 目录,并使用 Docker Compose 启动 MySQL 容器:

cd /data/mysql
docker-compose up -d

如果镜像未拉取,执行该命令会自动去拉取对应的镜像

5. 后续操作

容器启动后,你可以使用以下命令查看容器的运行状态:

docker ps

你应该能看到名为 mysql 的容器正在运行,并且宿主机的 3336 端口已经映射到容器的 3306 端口。

重要提示:

  • 云服务器: 如果你使用的是云服务器,请务必在服务器的安全组或防火墙设置中开放 TCP 协议的 3336 端口(你在 docker-compose.yml 中配置的宿主机端口),否则外部无法连接到 MySQL 服务。
  • 本地服务器: 如果你在本地服务器上运行,也需要检查并允许防火墙通过 TCP 协议的 3336 端口。例如,在使用 ufw 的 Linux 系统上,可以使用 sudo ufw allow 3336/tcp 命令。

接下来,你可以使用任何 MySQL 客户端工具(例如 Navicat、DBeaver、MySQL Workbench 等)通过 你的服务器IP地址:3336 连接到 MySQL 数据库。

默认的 root 用户密码是你在 docker-compose.yml 中设置的 12345678

总结

通过本文的步骤,你已经成功地使用 Docker Compose 部署了 MySQL 8.0.33,并实现了数据的持久化和自定义配置。

Docker Compose 通过简单的 YAML 文件,极大地简化了多容器应用的部署和管理流程。

你可以根据实际应用场景的需求,进一步调整 docker-compose.ymlmy.cnf 文件,以满足更复杂的配置和性能优化需求。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决docker CMD/ENTRYPOINT执行sh脚本报: not found/run.sh:

    解决docker CMD/ENTRYPOINT执行sh脚本报: not found/run.sh:

    这篇文章主要介绍了解决docker CMD/ENTRYPOINT执行sh脚本报: not found/run.sh:的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • docker image删不掉的解决办法

    docker image删不掉的解决办法

    在使用Docker的时候遇到删不掉image的情况,怎么回事,如何解决呢?下面小编给大家分享下docker image删不掉的解决办法,需要的朋友参考下吧
    2017-01-01
  • Linux新建用户并允许docker及docker基本命令

    Linux新建用户并允许docker及docker基本命令

    这篇文章给大家介绍了Linux新建用户并允许docker及docker的容器创建及基本命令讲解,需要的朋友参考下本文吧
    2017-12-12
  • docker用于将镜像打包为tar文件核心用法和注意事项

    docker用于将镜像打包为tar文件核心用法和注意事项

    在Docker中将镜像打包为.tar包是一个常见的需求,尤其是在需要将镜像迁移到其他服务器或进行备份时,这篇文章主要介绍了docker用于将镜像打包为tar文件核心用法和注意事项,需要的朋友可以参考下
    2025-12-12
  • Docker Compose版本怎么选?V1和V2对应关系全解析

    Docker Compose版本怎么选?V1和V2对应关系全解析

    还在纠结Docker Compose版本选择?本文梳理Docker引擎与Compose V1/V2的对应关系,提供最新V2独立二进制安装步骤,并告诉你官方已停止维护V1,务必迁移到docker compose插件,避免兼容性问题
    2026-07-07
  • Docker搭建redis集群的实现

    Docker搭建redis集群的实现

    本文主要介绍了Docker搭建redis集群的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • Docker启动常用容器命令及配置详解

    Docker启动常用容器命令及配置详解

    本文主要介绍了Docker启动常用容器命令及配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • docker和k8s-coredns内部域名解析方式

    docker和k8s-coredns内部域名解析方式

    这篇文章主要介绍了docker和k8s-coredns内部域名解析方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • docker-修改容器挂载目录的3种方法小结

    docker-修改容器挂载目录的3种方法小结

    这篇文章主要介绍了docker-修改容器挂载目录的3种方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • docker配置独立桥接IP的方法

    docker配置独立桥接IP的方法

    这篇文章主要介绍了docker配置独立桥接IP的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01

最新评论