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 的连接步骤:
- 打开 Navicat 软件,点击“连接”按钮,选择“MySQL”类型。
- 在连接属性窗口中,填写以下信息:
- 连接名 :自定义一个易于识别的名称,如
Docker_MySQL
。 - 主机 :如果是在本地宿主机上运行 Docker,这里填写
127.0.0.1
或localhost
;如果是远程连接到部署在服务器上的 Docker MySQL 容器,则填写服务器的 IP 地址。 - 端口 :填写之前映射的端口号,这里是
3306
。 - 用户名 :输入
root
。 - 密码 :输入在启动容器时设置的
root
用户密码,即a12bCd3_W45pUq6
。
- 连接名 :自定义一个易于识别的名称,如
- 点击“测试连接”按钮,如果连接成功,会弹出相应的提示信息,如“连接成功”。
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 的过程就完成了。
六、注意事项
- 端口冲突问题 :在启动容器时,如果宿主机的 3306 端口已经被其他服务占用,会导致容器启动失败。可以通过命令
netstat -tunlp | grep 3306
查看端口占用情况,如果发现端口被占用,可以关闭占用该端口的服务,或者在启动容器时将 MySQL 的端口映射到其他未被占用的端口,如-p 3307:3306
,然后在连接数据库时使用新的端口号。 - 目录权限问题 :创建的挂载目录
/home/mysql
及其子目录conf
、data
、log
需要确保 Docker 容器有足够的权限进行读写操作。可以使用命令chmod -R 755 /home/mysql
为目录设置合适的权限,其中7
表示所有者具有读、写、执行权限,5
表示所属组和其他用户具有读和执行权限。如果权限设置不当,可能会导致容器无法正常启动或无法写入数据和日志文件。 - 字符集设置问题 :在配置文件中将字符集设置为
utf8mb4
可以更好地支持各种字符的存储,但在实际使用中,还需要确保应用程序与数据库连接时也使用相同的字符集编码,以避免出现乱码问题。可以在连接数据库的代码中指定字符集,例如在使用 JDBC 连接时,可以在连接 URL 中添加?characterEncoding=utf8mb4
参数。 - 密码复杂度要求 :设置
root
用户密码时,需要满足一定的复杂度要求,通常包括大小写字母、数字和特殊字符的组合。如果密码过于简单,可能会导致容器启动时 MySQL 服务初始化失败,因此建议使用强密码并妥善保管。 - 容器重启策略的合理选择 :虽然
--restart=always
策略可以保证容器在停止时自动重启,但在某些情况下可能并不适用,例如在进行数据库维护或升级时,可能需要手动停止容器并进行相关操作,而不希望容器自动重启。此时可以根据实际情况灵活选择其他重启策略,如--restart=no
(不自动重启)、--restart=on-failure
(仅在容器异常退出时重启)等。 - 日志清理机制的调整 :根据业务实际情况,可能需要调整
binlog_expire_logs_seconds
参数的值来控制二进制日志的保留时间。如果业务数据量较大、写操作频繁,可能需要缩短日志保留时间以避免磁盘空间不足;反之,如果对数据安全性和恢复能力要求较高,则可以适当延长日志保留时间。 - 性能参数优化 :配置文件中的
innodb_buffer_pool_size
、innodb_log_file_size
等性能相关参数的设置需要根据服务器的硬件配置(如内存大小、磁盘容量等)和业务负载情况进行合理调整。不合理的设置可能会导致数据库性能下降或系统资源过度消耗,因此在部署完成后,可以根据数据库的实际运行情况进行性能监控和参数优化。
在实际使用过程中,如果遇到任何问题,可以通过查阅官方文档、社区论坛或咨询专业人士来获取帮助和解决方案。
【鸣谢】感谢原帖提供参考!