> 技术文档 > Docker 部署 MySQL 8.3.0_docker部署mysql 8.3.0

Docker 部署 MySQL 8.3.0_docker部署mysql 8.3.0

Docker 容器中部署MySQL,废话不多说,开始!

一、环境准备

在开始部署之前,确保你的环境已经满足以下要求:

  • Docker 版本 :建议使用 Docker 版本 20.10 及以上,可以通过命令docker --version查看当前 Docker 版本,若未安装或版本过低,可参考官方文档进行安装与升级。
  • 操作系统 :推荐使用主流的 Linux 发行版,如 CentOS 7.9、Ubuntu 20.04 等,在 Windows 和 macOS 上也可通过 Docker Desktop 进行部署,但部分命令和配置可能会有所不同。
  • 远程管理工具 :使用 Xshell、PuTTY、FinalShell 等工具连接到远程服务器进行操作。

二、拉取镜像

2.1 查找 Docker Hub 上的 MySQL 镜像

打开终端,输入以下命令来搜索 MySQL 镜像:

docker search mysql

执行该命令后,会列出 Docker Hub 上与 MySQL 相关的镜像,包括官方镜像和其他用户创建的镜像。注意选择官方镜像(标记为 [Official]),以确保安全性和稳定性。

2.2 拉取 MySQL 镜像

根据实际需求,选择合适的 MySQL 版本进行拉取。这里以 MySQL 8.3.0 为例,输入以下命令:

docker pull mysql:8.3.0

拉取过程中,Docker 会从 Docker Hub 下载镜像到本地,如果网络较慢,可能需要一些时间,请耐心等待。

2.3 查看 MySQL 镜像

拉取完成后,使用以下命令查看本地已有的 MySQL 镜像,确认镜像是否正确下载:

docker images | grep mysql

该命令会列出所有与 MySQL 相关的镜像,包括镜像 ID、标签、创建时间等信息。

三、在宿主机创建目录

3.1 创建挂载目录

为了方便数据持久化和配置管理,需要在宿主机上创建目录用于挂载到 MySQL 容器中。这里我们选择在/home/mysql目录下创建相关子目录:

mkdir -p /home/mysql/{conf,data,log}
  • conf目录用于存放 MySQL 的配置文件,方便后续对数据库进行个性化配置。
  • data目录用于存储 MySQL 的数据库文件,实现数据的持久化保存,即使容器被删除,数据也不会丢失。
  • log目录用于存放 MySQL 的日志文件,便于对数据库的运行状态进行监控和问题排查。

创建完成后,可以使用ll /home/mysql命令查看目录结构。

3.2 创建配置文件

进入/home/mysql/conf目录:

cd /home/mysql/conf

使用 vim 编辑器创建并编辑 MySQL 配置文件my.cnf

vim my.cnf

在 vim 编辑器中,按i键进入插入模式,输入以下内容:

[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] server-id = 1 log-bin=mysql-bin binlog_expire_logs_seconds = 2592000 sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’ max_connections=1000 symbolic-links=0 default-time_zone = ‘+8:00’ innodb_flush_log_at_trx_commit = 1 innodb_log_buffer_size = 16M innodb_buffer_pool_size = 128M innodb_log_file_size = 64M innodb_file_per_table=on

以下是配置文件中各参数的详细解释:

  • [client][mysql]部分:设置客户端默认字符集为utf8mb4,以支持更多字符的存储和显示,避免出现字符编码问题。
  • [mysqld]部分:
    • server-id:配置服务器的服务号,用于日后进行数据库集群搭建时区分不同的 MySQL 服务器实例,这里设置为 1。
    • log-bin:开启 MySQL 数据库的二进制日志,用于记录用户对数据库的操作 SQL 语句,这对于数据的备份与恢复、主从复制等功能至关重要。
    • binlog_expire_logs_seconds:设置清理超过 30 天的日志,避免日志文件堆积过多占用服务器磁盘空间,2592000 秒等于 30 天的秒数。
    • sql_mode:解决 MySQL 8.0 版本中 GROUP BY 语句存在的问题,同时确保数据库的运行符合一定的规则和约束,例如禁止零日期等异常数据的插入。
    • max_connections:允许最大的连接数,默认值通常为 151,这里设置为 1000,可根据实际业务需求进行调整,以满足高并发场景下的数据库连接需求。
    • symbolic-links:禁用符号链接,防止各种潜在的安全风险,如通过符号链接访问敏感文件等。
    • default-time_zone:设置 MySQL 服务器的默认时区为东八区(+8:00),使数据库中的时间数据与本地时间保持一致,避免时间混乱。
    • innodb_flush_log_at_trx_commit:控制事务提交时 InnoDB 存储引擎日志的写入和刷新行为,设置为 1 表示每次事务提交时都将日志写入磁盘并刷新,虽然会稍微影响性能,但能保证数据的一致性和完整性,在发生系统崩溃等故障时,可以最大程度地减少数据丢失。
    • innodb_log_buffer_size:指定 InnoDB 日志缓冲区的大小,默认为 16MB,这里保持默认值,根据服务器内存大小可适当调整,用于临时存储日志数据,当缓冲区满时会将数据写入日志文件。
    • innodb_buffer_pool_size:设置 InnoDB 缓冲池的大小,用于缓存数据库中的数据页和索引页,默认为 128MB,这里保持默认值,它是 MySQL 性能优化的重要参数之一,合理的设置可以提高数据读取和写入的效率,但不宜设置过大,以免占用过多内存导致系统性能下降。
    • innodb_log_file_size:定义 InnoDB 日志文件的大小,默认为 64MB,保持默认值,日志文件用于记录数据库的修改操作,以便在系统崩溃后进行数据恢复。
    • innodb_file_per_table:设置为on表示为每个数据库表单独创建一个.ibd 文件来存储数据和索引,便于对表进行单独管理和优化,同时也能减少表空间的碎片化问题。

完成内容输入后,按Esc键退出插入模式,输入:wq保存并退出 vim 编辑器。

四、启动 MySQL 容器

在宿主机上执行以下命令来启动 MySQL 容器:

docker run -p 3306:3306 --restart=always --name mysql --privileged=true -v /home/mysql/log:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=a12bCd3_W45pUq6 -d mysql:8.3.0

以下是命令中各参数的详细说明:

  • -p 3306:3306:将容器内的 3306 端口映射到宿主机的 3306 端口,这样我们可以通过宿主机的 3306 端口访问 MySQL 服务。如果宿主机上已经存在其他服务占用了 3306 端口,可以将其映射到其他未被占用的端口,如-p 3307:3306,然后在连接数据库时指定相应的端口。
  • --restart=always:设置容器的重启策略为总是重启,即无论容器因何种原因停止,Docker 都会自动尝试重新启动它,确保 MySQL 服务的持续运行。也可以根据需要选择其他重启策略,如--restart=on-failure(仅在容器异常退出时重启)。
  • --name mysql:为启动的容器指定一个名称,这里命名为mysql,方便后续对容器进行管理和操作,避免使用默认的随机名称难以识别。
  • --privileged=true:赋予容器一定的额外权限,使容器能够访问宿主机的一些资源和设备,这对于 MySQL 数据库的正常运行通常是必要的,但也要注意合理使用该权限,避免潜在的安全风险。
  • -v /home/mysql/log:/var/log/mysql:将宿主机的/home/mysql/log目录挂载到容器的/var/log/mysql目录,用于存储 MySQL 的日志文件。这样可以方便地在宿主机上查看和管理数据库日志,便于对数据库的运行状态进行监控和故障排查。
  • -v /home/mysql/data:/var/lib/mysql:将宿主机的/home/mysql/data目录挂载到容器的/var/lib/mysql目录,这是 MySQL 数据库存储数据库文件的默认位置。通过挂载宿主机目录,可以实现数据的持久化保存,即使容器被删除或重建,数据也不会丢失,并且方便进行数据备份和恢复操作。
  • -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf:将宿主机上创建的my.cnf配置文件挂载到容器的/etc/mysql/my.cnf路径,使 MySQL 容器能够读取并应用我们自定义的配置参数。这样可以根据实际需求灵活地调整数据库的运行参数,而无需在容器内部直接修改配置文件。
  • -e MYSQL_ROOT_PASSWORD=a12bCd3_W45pUq6:设置 MySQL 数据库的root用户密码为a12bCd3_W45pUq6,这是一个强密码示例,建议大家根据实际情况设置一个复杂且安全的密码,避免使用过于简单或容易被猜到的密码,以保障数据库的安全性。在连接数据库时需要使用该密码进行身份验证。
  • -d:表示以后台模式运行容器,使容器在后台持续运行,不会因终端的关闭而停止。

执行命令后,Docker 会根据指定的参数和镜像创建并启动一个 MySQL 容器。可以通过以下命令查看容器是否成功启动:

docker ps | grep mysql

如果看到类似以下输出信息,则表示容器已成功启动并运行:

9f8e3c2d4a1b mysql:8.3.0 \"docker-entrypoint.s…\" 5 minutes ago Up 5 minutes 0.0.0.0:3306->3306/tcp mysql

五、测试连接

5.1 使用 MySQL 客户端工具连接

可以使用 Navicat、MySQL Workbench 等 MySQL 客户端工具进行连接测试。以下是使用 Navicat 的连接步骤:

  1. 打开 Navicat 软件,点击“连接”按钮,选择“MySQL”类型。
  2. 在连接属性窗口中,填写以下信息:
    • 连接名 :自定义一个易于识别的名称,如Docker_MySQL
    • 主机 :如果是在本地宿主机上运行 Docker,这里填写127.0.0.1localhost;如果是远程连接到部署在服务器上的 Docker MySQL 容器,则填写服务器的 IP 地址。
    • 端口 :填写之前映射的端口号,这里是3306
    • 用户名 :输入root
    • 密码 :输入在启动容器时设置的root用户密码,即a12bCd3_W45pUq6
  3. 点击“测试连接”按钮,如果连接成功,会弹出相应的提示信息,如“连接成功”。

5.2 使用命令行连接

在宿主机的终端中,也可以通过命令行工具连接到 MySQL 数据库,测试连接是否正常:

mysql -h 127.0.0.1 -P 3306 -u root -p

按下回车键后,会提示输入密码,输入之前设置的root用户密码a12bCd3_W45pUq6,如果连接成功,会进入 MySQL 的命令行界面,显示类似以下信息:

Welcome to the MySQL monitor. Commands end with ; or \\g. Your MySQL connection id is 2 Server version: 8.0.33 MySQL Community Server - GPL

至此,Docker 部署 MySQL 8.3.0 的过程就完成了。

六、注意事项

  1. 端口冲突问题 :在启动容器时,如果宿主机的 3306 端口已经被其他服务占用,会导致容器启动失败。可以通过命令netstat -tunlp | grep 3306查看端口占用情况,如果发现端口被占用,可以关闭占用该端口的服务,或者在启动容器时将 MySQL 的端口映射到其他未被占用的端口,如-p 3307:3306,然后在连接数据库时使用新的端口号。
  2. 目录权限问题 :创建的挂载目录/home/mysql及其子目录confdatalog需要确保 Docker 容器有足够的权限进行读写操作。可以使用命令chmod -R 755 /home/mysql为目录设置合适的权限,其中7表示所有者具有读、写、执行权限,5表示所属组和其他用户具有读和执行权限。如果权限设置不当,可能会导致容器无法正常启动或无法写入数据和日志文件。
  3. 字符集设置问题 :在配置文件中将字符集设置为utf8mb4可以更好地支持各种字符的存储,但在实际使用中,还需要确保应用程序与数据库连接时也使用相同的字符集编码,以避免出现乱码问题。可以在连接数据库的代码中指定字符集,例如在使用 JDBC 连接时,可以在连接 URL 中添加?characterEncoding=utf8mb4参数。
  4. 密码复杂度要求 :设置root用户密码时,需要满足一定的复杂度要求,通常包括大小写字母、数字和特殊字符的组合。如果密码过于简单,可能会导致容器启动时 MySQL 服务初始化失败,因此建议使用强密码并妥善保管。
  5. 容器重启策略的合理选择 :虽然--restart=always策略可以保证容器在停止时自动重启,但在某些情况下可能并不适用,例如在进行数据库维护或升级时,可能需要手动停止容器并进行相关操作,而不希望容器自动重启。此时可以根据实际情况灵活选择其他重启策略,如--restart=no(不自动重启)、--restart=on-failure(仅在容器异常退出时重启)等。
  6. 日志清理机制的调整 :根据业务实际情况,可能需要调整binlog_expire_logs_seconds参数的值来控制二进制日志的保留时间。如果业务数据量较大、写操作频繁,可能需要缩短日志保留时间以避免磁盘空间不足;反之,如果对数据安全性和恢复能力要求较高,则可以适当延长日志保留时间。
  7. 性能参数优化 :配置文件中的innodb_buffer_pool_sizeinnodb_log_file_size等性能相关参数的设置需要根据服务器的硬件配置(如内存大小、磁盘容量等)和业务负载情况进行合理调整。不合理的设置可能会导致数据库性能下降或系统资源过度消耗,因此在部署完成后,可以根据数据库的实际运行情况进行性能监控和参数优化。

在实际使用过程中,如果遇到任何问题,可以通过查阅官方文档、社区论坛或咨询专业人士来获取帮助和解决方案。
【鸣谢】感谢原帖提供参考!
Docker 部署 MySQL 8.3.0_docker部署mysql 8.3.0