Ubuntu 20.04.6 安装Docker版MySQL - 镜像 bitnami/mysql:5.7.43-debian-11-r73

  |   0 评论   |   4,210 浏览

背景

之前一直使用安装版本的Mysql. 由于Mysql近年来的割裂. 比如在Ubuntu上默认带的Mysql源已经是MariaDB 对于想要使用原汁原味的MySQL用户来说,会遇到很多的麻烦. 比如需要去找非官方的源进行安装. 后期如果系统有特定的升级后,极有可能造成MySQL版本无法运行. 同时对于直接安装版本的配置以及数据备份与恢复也相对麻烦. 对于我这个小白好不容易配置好后,在某一天升级Ubuntu后再也无法启动起来. 痛定思痛后,决定使用Docker版本. 这或许能解决我之前遇到的所有问题. 于是有了这篇文章.

不管是Docker,还是Ubuntu,还是Mysql. 这三样对于一个开发来说实际都不算熟悉. 之前一直在Centos上打转, 奈何CentOS也不再是免费的午餐. 因此个人折腾的NAS只能迁移到以Ubuntu为中心的平台进行折腾. 平时Mysql也是所有的使用都是DBA解决, 实际个人的运维经验特别有限. 你说让我找下某个SQL查询的死锁问题,我可能能分析分析. 优化下某个查询的索引,那也是小菜一碟. 但是要装MySQL 那是真的不会. 之前也装过很多次.实际就是找教程安装一个能跑的即可. 并且在安装好后,再也不会再动它. 比如备份, 迁移, 升级等. 这些通通不会.

Docker亦是如此. 对于一个老互联网研发, 基于KVM技术的虚拟机平台已经根深蒂固. 学习起Docker来说亦是思维定势,很难去深入的学习. 因为在最初的接触对比中,并没有觉得它对于我们Javaer来说提供了什么不一样的东西. 就拿基于Tomcat的JAVA 运行环境来说. 由于自己对于Jenkins以及 CICD以及环境定制等有较深入的了解. 同时基于JDKtomcat的运行环境本身对于系统等环境的依赖本身非常少,要在一个Linux上安装一个JDK甚至于多个JDK那是非常容易的事情. 基于于一个几行的脚本都可以搞定.

基于这些认识, 不说Docker, 甚至于从基于SpringSpringMVC开发转到SpringBoot都感觉是一些多此一举. 因为,对于一个熟练的研发来说,虽然SpringMVC 相对麻烦,在长期的开发磨练后大家都会沉淀出一套完整可用的XML配置与项目模板. 基于这些开发并不会有太多的麻烦与障碍. 因此,对于Springboot的使用也觉得没有必要.

但是,对于一些陌生的领域. 或者说不是自己擅长的领域. 那些能够提供无差别的解决方案,不管你是否是该领域的熟手还是新手. 比如这里说到的MySQL的安装. 对于资深运维来说,可能非常简单. 就是自己擅长的JAVA开发一样. 但是对于一个不是那么专业的用户来说就非常的麻烦. 这个时候,Docker的解决方案的便利性就完全体现出来了. 就像我这个博客系统, 我能够非常熟悉并快速地基于tomcat版本部署好它. 因为我有一套完整的运行环境. 可以非常快速的支撑tomcat应用的运行. 虽然作者提供了 Docker 版本.

另一方面,对于那些不怎么熟悉JDK环境,或者TOMCAT最佳配置的用户而言. 他们配置Tomcat和JDK环境将会变得困难. 这个时候Docker版本的镜像就变得非常方便了.

说了这么多, 只是想表达Docker的出现确实能解决软件工程复杂性的问题. 让不同的用户能够以最小的学习成本去使用和体验不同的技术产品. 比如在此场景下的MySQL安装确实算得上是Docker应用的使用主场.

镜像选择

MySQL 的Docker镜像有很多, 常见的是Mysql的官方镜像(Mysql Docker Hub 镜像). 另外的选择就是bitnami/mysql , 以下是一些可选

  1. MySQL - 官方版本: 这是官方提供的MySQL Docker镜像。你可以使用最新的标签(例如 mysql:latest)或选择与本地安装的MySQL版本相匹配的标签(例如 mysql:5.7)。 这个镜像在 GitHub 上有详细的使用文档。
  2. MariaDB - 官方版本: MariaDB 是 MySQL 的一个开源分支,更用户友好。这个镜像也有详细的使用说明,你可以选择与你的 MariaDB 版本匹配的标签。
  3. Percona - 官方版本:Percona 是 MySQL 的一个替代版本,提供了一些额外的性能优化和可扩展性。在 GitHub 上也有详细的使用说明。
  4. PhpMyAdmin - 官方版本:网页版的 MySQL 数据库管理工具,可以方便地运行在 Docker 中。如果你需要一个轻量级的 GUI 管理工具,这个镜像甚好。
  5. MySQL Group Replication: 这个镜像较新,可以轻松设置 MySQL Group Replication,适用于测试和开发环境。
  6. Adminer: 另一个轻量级的数据库管理工具,不仅支持MySQL,还支持PostgreSQL、SQLite、MSSQL和Oracle等多种数据库。

所有这些镜像都可以在 Docker Hub 或者官方的 GitHub 仓库中找到。在使用之前,一定要查看各镜像的使用说明,了解如何配置和运行。

根据了解MySQL官方的更原汁原味, 而bitnami的版本提供了更多安全性以及易用性.

Bitnami 为 MySQL 提供了一种 Docker 镜像,其优点在于 Bitnami 对它们的镜像进行了优化,以达到最好的性能和安全性。 Bitnami 的镜像还包含预配置的设置,从而使得设置具有持久性的数据库更加容易。此外,通过控制容器的文件系统层,Bitnami 的容器在部署时保持较小的体积。

然而,这可能会使得对于 Docker 或 MySQL 配置不熟悉的用户来说在定制镜像上遇到一些困难。Bitnami 的镜像可能包含一些额外的依赖性,这将导致镜像的体积大于其他简单的 MySQL 镜像。

Bitnami 镜像与其他镜像比较:

  1. 即插即用: Bitnami images 通常预安装并配置了各种应用,因此用户可以更快速地启动和运行它们。
  2. 一致性:Bitnami 提供一致的环境,无论你是将其用于开发还是在生产中使用。
  3. 安全:Bitnami 非常关注安全性,他们的镜像在发布时都包含最新的安全性修复和更新。
  4. 开箱即用的数据库:Bitnami 的 MySQL 镜像包括持久性存储,这意味着你的数据库数据不会在容器停止或删除时丢失。
  5. 文档和支持: Bitnami 提供详细的文档和社区支持。
  6. 大小:相比于其他构建更简单、更轻量级的镜像(如官方的 MySQL 镜像),Bitnami 的镜像可能会更大一些,他们包含了更多的依赖和预配置内容。

基于以上对比, 最后选择的是bitnami的mysql.

bitnamioracle 还有 Mysql的关系

Bitnami、MySQL、和 Oracle 是三个不同的实体,它们之间的关系可以解释如下:

  • Oracle :Oracle 是一家大型的全球性IT解决方案提供商。它们提供各种软件和硬件产品,包括但不限于数据库系统(如 Oracle Database)、企业级应用软件、云服务等。
  • MySQL :MySQL 是一个关系型数据库管理系统,最初由瑞典的 MySQL AB 公司开发。2008年,MySQL AB 公司被 Sun Microsystems 收购,随后在2010年,Oracle 又收购了 Sun Microsystems,因此 MySQL 目前实际上是 Oracle 的一个产品。
  • Bitnami :Bitnami 是一个提供各种开源软件预配置版本的平台,目前其业务已被 VMware 收购。Bitnami 提供了各种软件的 Docker 镜像和 Helm chart,包括 MySQL。这些镜像和 chart 都预先配置好了各种环境参数,可以方便用户快速部署和使用相关软件。所以,当你使用 Bitnami 的 MySQL Docker 镜像时,你实际上是在使用 Bitnami 预先配置好的 MySQL 数据库系统。

以上的关系可以简单概括为:Oracle 是 MySQL 的所有者,Bitnami 是利用 MySQL 制作了一些预配置的产品供大众使用。

镜像版本选择

bitnami提供了丰富的mysql镜像版本. 但是对于使用该使用哪个版本tag,这还是比较讲究的.

内容引用: https://docs.bitnami.com/tutorials/understand-rolling-tags-containers/

Bitnami 在其容器镜像中使用滚动标签。要了解其工作原理,让我们看一下 Bitnami WordPress 容器映像的标签:

latest, 6, 6-debian-11, 6.4.1
  • The latest tag 始终指向 WordPress 映像的最新版本.
  • The 6 tag is a rolling tag that always points to the latest revision of WordPress 6.y.z
  • The 6-debian-11 tag points to the latest revision of WordPress 6.y.z for Debian 11.
  • The 6.4.1 tag is a rolling tag that points to the latest revision(修定版本) of WordPress 6.4.1. It will be updated with different revisions or daily releases but only for WordPress 6.4.1.

当 Bitnami 修改容器镜像时(通常是为了升级系统包、修复错误或改进系统配置),它还会更新容器标签以指向镜像的最新版本。因此,上面显示的滚动标签是动态的;他们将始终指向相应Image最新版本每日版本
例如,6.4.1标签现在可能指向 WordPress 6.4.1 修订版 20,但当 Bitnami 下次更新容器映像时,将引用 WordPress 6.4.1 修订版 21。每次 Bitnami 为同一版本的应用程序发布镜像的更新版本时,后缀修订号 (rXX) 都会递增。
值得注意的是,任何未明确指定发行版的标签都应假定为引用 Bitnami 应用程序目录中使用的基础映像,目前为 Debian 11。

不可变标签

如果您依赖于Image的特定修订版怎么办?对于这些场景,Bitnami 还会为每个修订版附加一个静态(不可变)标签。在此示例中,6.4.1-debian-11-r4标签指的是 WordPress 6.4.1 修订版 4,使用此标签可确保用户每次始终获得相同的图像。

使用建议
您应该使用哪个标签以及何时使用?请遵循以下准则:

如果您在生产环境(例如 Kubernetes)中使用容器,Bitnami 建议使用不可变标签。这可以确保如果新版本无意中破坏了现有功能,您的部署不会受到影响。
如果您使用容器进行开发,Bitnami 建议使用滚动标签。这可确保您始终使用最新版本。滚动标签还可以更轻松地使用特定版本的开发工具(例如Node.js 18 的bitnami/node:18)。

综上, 这里选择一个固定的标签比较好. 根据搜索:https://hub.docker.com/r/bitnami/mysql/tags?page=1&name=5.7

因此最后选择的版本是: bitnami/mysql:5.7.43-debian-11-r73

启动命令和配置参数

这个命令相关的参数都是根据官方文档总结出来的, 具体的含义可看官方文档.

命令

具体的相关的配置可以参考: https://github.com/bitnami/containers/blob/main/bitnami/mysql/README.md#configuration. 这里直接给出最终的配置:

docker run -d \
    -p 3306:3306 \
    --name mysql \
    -e ALLOW_EMPTY_PASSWORD=yes \
    -e MYSQL_ROOT_PASSWORD=yourrootpassword \
    -e MYSQL_CHARACTER_SET=utf8mb4 \
    -e MYSQL_COLLATION=utf8mb4_general_ci \
    -e MYSQL_ENABLE_SLOW_QUERY=1 \
    -e MYSQL_LONG_QUERY_TIME=5.0 \
    -e TZ=Asia/Shanghai \
    -v /path/to/persitence-data:/bitnami/mysql/data \
    -v /path/to/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \
    bitnami/mysql:5.7.43-debian-11-r73

命令解释:

  • -d 后台运行
  • -p 3306:3306: 把docker镜像内部的3306端口映射到宿主机的3306端口.
  • --name mysql docker实例的名字
  • -e ALLOW_EMPTY_PASSWORD=yes 让mysql可以使用空密码进行链接. 即可以使用没有密码的账号.
  • -e MYSQL_ROOT_PASSWORD=yourrootpassword 设置好新mysql 实例的root 账号密码.
  • -e MYSQL_CHARACTER_SET=utf8mb4 把数据库的默认字符编码修改为utf8b4 , 如果不修改,默认的设置是utf8
  • -e MYSQL_COLLATION=utf8mb4_general_ci 同上.
  • -e MYSQL_ENABLE_SLOW_QUERY=1 开启慢查询日志.
  • -e MYSQL_LONG_QUERY_TIME=5.0 慢查询日志的query 时间阈值. 默认值是10.0秒, 这里设置为5
  • -e TZ=Asia/Shanghai 重要: 设置 Mysql Docker实例的系统时区. 如果不设置,其默认的时区将会为UTC
  • -v /path/to/persitence-data:/bitnami/mysql/data 持久化配置. 把mysql的数据存储到宿主机的相关的目录.
  • -v /path/to/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro 把镜像内部的自定义的my_custom.cnf文件映射到宿主机上.且docker内部是只读权限.
  • bitnami/mysql:5.7.43-debian-11-r73 最后的镜像名称.

以上配置中的时区很重要. 如果不配置,则有可能影响mysql运行时的时间设置. 特别是insert now() 这样的配置.

慢查询日志在data目录里面.

image.png

配置参数 - my_custom.cnf

以上的启动参数基本是一个可以实际使用的命令.但是还需要配置一些其它的额外参数. 这里贴出我的配置:

[mysqld]
max_allowed_packet    = 256M
innodb_log_file_size  = 256M
transaction-isolation = READ-COMMITTED
default_time_zone     = '+08:00'

一个是修改最大的包大小,这个在一些特别大的数据插入与查询时会用到. RC 隔离级别是 Confluence所要求的. 最后的 default_time_zone = '+08:00' 是为中国区的程序员准备的. 这样可以写入正确的默认值.

启动与试用.

拉取镜像:

[HomeNas]:~$ docker pull bitnami/mysql:5.7.43-debian-11-r73
5.7.43-debian-11-r73: Pulling from bitnami/mysql
cf09c9b353fa: Pull complete
Digest: sha256:6c5b962faf5ab94ff91ff2dc5d16a3e4b496ef0d6bd4aef3446668e5c2b2ae2a
Status: Downloaded newer image for bitnami/mysql:5.7.43-debian-11-r73
docker.io/bitnami/mysql:5.7.43-debian-11-r73

启动脚本:

# cat start-bitnami-mysql.sh
docker run -d \
    -p 3306:3306 \
    --name mysql \
    -e ALLOW_EMPTY_PASSWORD=yes \
    -e MYSQL_ROOT_PASSWORD=12345 \
    -e MYSQL_CHARACTER_SET=utf8mb4 \
    -e MYSQL_COLLATION=utf8mb4_general_ci \
    -e MYSQL_ENABLE_SLOW_QUERY=1 \
    -e MYSQL_LONG_QUERY_TIME=5.0 \
    -e TZ=Asia/Shanghai \
    -v /home/path/to/mysql/bitnami-mysql-data:/bitnami/mysql/data \
    -v /home/path/to/mysql/bitnami-mysql-conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \
    bitnami/mysql:5.7.43-debian-11-r73

我们使用命令: sudo ./start-bitnami-mysql.sh && docket logs -f mysql 查看启动状态:

image.png

进入容器并登陆mysql

  1. 使用命令: docker exec -it mysql bash 进入到mysql docker内部.
  2. 使用命令: mysql -uroot -p 连接到mysql
  3. 使用命令: select now(); 查看当前时间

image.png

总结

我们使用bitnami的镜像在ubuntu环境上安装好了mysql 并且把相关的环境与运行参数都已经调整好. 后续如果有备份或者迁移.直接把mysql的数据目录的数据全部迁移后用同一个版本的tag的mysql镜像就可以重新在新环境恢复mysql环境了.

评论

发表评论


取消