【教程分享】一键部署MySQL,轻松搞定Docker安装和配置!

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【教程分享】一键部署MySQL,轻松搞定Docker安装和配置!

1 下载 MySQL

我们就可以到 docker hub 来看:



16.png

点击后的页面:

111.png



直接执行docker pull mysql,会下载最新版本的 MySQL。


点击 tags,找到并下载经典的 MySQL5.7:

14.png



[root@service-monitoring ~]# docker pull mysql:5.7.42-oracle


5.7.42-oracle: Pulling from library/mysql

e83e8f2e82cc: Pull complete

0f23deb01b84: Pull complete

f5bda3b184ea: Pull complete

ed17edbc6604: Pull complete

33a94a6acfa7: Pull complete

f153bd2953e4: Pull complete

ab532edfb813: Pull complete

c76bdfe4f3d0: Pull complete

8a7ffe2f2551: Pull complete

857ada4fbbcc: Pull complete

b7c508404c3c: Pull complete

Digest: sha256:f57eef421000aaf8332a91ab0b6c96b3c83ed2a981c29e6528b21ce10197cd16

Status: Downloaded newer image for mysql:5.7.42-oracle

docker.io/library/mysql:5.7.42-oracle

[root@service-monitoring ~]#



2 ipv4

在虚拟机中执行 ipv4 命令的主要目的是配置虚拟机的网络接口,使其能够正常地连接到网络。IPv4 是当前广泛使用的 IP 协议,它是 Internet 协议族中的一员,用于在互联网上标识和定位网络设备。在虚拟化环境中,虚拟机需要一个唯一的 IPv4 地址,以便与其他设备进行通信。


通过执行 ipv4 命令,可以为虚拟机配置 IPv4 地址、子网掩码、网关等网络参数。这些参数将决定虚拟机如何与其他设备进行通信。例如,如果虚拟机的 IP 地址与其他设备的 IP 地址不在同一个子网中,那么它们就无法直接通信,需要通过网关进行转发。


总之,执行 ipv4 命令可以帮助虚拟机正确地配置网络参数,使其能够正常地连接到网络,并与其他设备进行通信。而若使用的云服务器,默认已经开启了,无需再配置了。


2.1 验证

[root@service-monitoring ~]# vim /usr/lib/sysctl.d/00-system.conf


添加:


net.ipv4_forward=1

13.png



由于修改了网络相关, 所以必须重启对应服务:


systemctl restart network;

systemctl restart docker;


3 启动MySQL


# 将容器的 3306 端口映射到主机的 3306 端口,这样就可以通过主机的 IP 地址和端口号访问 MySQL 服务。

# 指定容器的名称为 mysql,方便后续管理和操作

[root@service-monitoring home]# docker run -p 3306:3306 --name mysql \

# 将主机的 /home/mysql/log 目录挂载到容器的 /var/log/mysql 目录,用于存储 MySQL 的日志文件。

-v /home/mysql/log:/var/log/mysql \

# 将主机的 /home/mysql/data 目录挂载到容器的 /var/lib/mysql 目录,用于存储 MySQL 的数据文件。

-v /home/mysql/data:/var/lib/mysql \

# 将主机的 /home/mysql/conf 目录挂载到容器的 /etc/mysql 目录,用于存储 MySQL 的配置文件。

-v /home/mysql/conf:/etc/mysql \

# 将主机的 /home/mysql/mysql-files 目录挂载到容器的 /var/lib/mysql-files 目录,用于存储 MySQL 的文件数据。

-v /home/mysql/mysql-files:/var/lib/mysql-files \

# 设置 MySQL 的 root 用户密码为 root。这个参数使用了环境变量来传递密码信息。

-e MYSOL_ROOT_PASSWORD=root \

# 以后台模式运行 MySQL 容器,并使用 mysql:5.7.42-oracle 镜像作为容器镜像。

-d mysql:5.7.42-oracle \

# 设置 MySQL 的字符集为 utf8mb4,并使用 utf8mb4_unicode_ci 排序规则。这个参数可以确保 MySQL 能够正确地处理 Unicode 字符。

--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

# ---命令结束,下面都是输出

# 输出的是容器的 ID,表示容器已成功启动。

ec88509b8b1b8b759747c71b75a9fc6c5c0a8ec63e1e6b7a716a6e98ccce184e

[root@service-monitoring home]# docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@service-monitoring home]#




12.png

MySQL 是exit 态,说明有问题,而且 created 时间和 status 时间基本一致,说明启动就失败了


11.png


那就得查看对应容器的日志了:


[root@service-monitoring home]# docker logs mysql

2023-04-26 15:36:12+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.42-1.el7 started.

2023-04-26 15:36:12+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config

       command was: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --verbose --help --log-bin-index=/tmp/tmp.lEmtN09BMq

       mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory)

mysqld: [ERROR] Fatal error in defaults handling. Program aborted!

[root@service-monitoring home]#


看来需要调整,去除 etc 启动参数:


# 删除了-v /home/mysql/conf:/etc/mysql \的启动命令:

[root@service-monitoring home]# docker run -p 3306:3306 --name mysql \

-v /home/mysql/log:/var/log/mysql \

-v /home/mysql/data:/var/lib/mysql \

-v /home/mysql/mysql-files:/var/lib/mysql-files \

-e MYSQL_ROOT_PASSWORD=root \

-d mysql:5.7.42-oracle \

--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

docker: Error response from daemon: Conflict. The container name "/mysql" is already in use by container "ec88509b8b1b8b759747c71b75a9fc6c5c0a8ec63e1e6b7a716a6e98ccce184e". You have to remove (or rename) that container to be able to reuse that name.

See 'docker run --help'.

[root@service-monitoring home]#



当然,意料之中的报错啦,要删除它


[root@service-monitoring home]# docker rm mysql

mysql

[root@service-monitoring home]#


再重新执行启动命令:


10.png


再验证下:


[root@service-monitoring home]# docker ps

CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                  NAMES

e380fdc23c78   mysql:5.7.42-oracle   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql

[root@service-monitoring home]#


可算是 up 起来咯!


9.png


至此,MySQL成功运行了。


4 文件挂载好了吗?

发现已经都帮我们按启动命令,都创建好了对应路径:


[root@service-monitoring mysql]# pwd

/home/mysql

[root@service-monitoring mysql]# ll

total 16

drwxr-xr-x 2 root    root 4096 Apr 26 23:36 conf

drwxr-xr-x 5 polkitd root 4096 Apr 26 23:58 data

drwxr-xr-x 2 root    root 4096 Apr 26 23:36 log

drwxr-xr-x 2 polkitd root 4096 Apr 26 23:36 mysql-files

[root@service-monitoring mysql]#


可见 docker 安装是真的方便呢!


8.png


5 docker stats

可实时监控每个容器的状态:


CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O        PIDS

e380fdc23c78   mysql     0.05%     208.7MiB / 7.795GiB   2.61%     656B / 0B   1.27MB / 289MB   27



7.png

Ctrl+C 退出。


CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O        PIDS

e380fdc23c78   mysql     0.06%     208.7MiB / 7.795GiB   2.61%     656B / 0B   1.27MB / 289MB   27

^C

[root@service-monitoring data]#

本地数据库客户端连接

也是完美:


1.png


7 进入容器内部配置 MySQL


mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'root';

Query OK, 0 rows affected (0.00 sec)

# 设置密码永存

mysql> alter user 'root'@'%' identified by 'root' password expire never;

# 允许 root 用户从任何主机登录 MySQL 数据库。MySQL默认会限制用户只能从本地主机登录,为增强系统安全性。但在某些情况下,例如需要远程管理 MySQL 数据库时,需将用户的登录主机限制更改为任意主机

mysql> update user set host='%' where user='root';

# 若已设置过,则会报该错

ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'



mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

# Ctrl+D 退出MySQL

mysql> ^DBye

bash-4.2#



8 生产环境Docker部署MySQL

考虑如下问题:


8.1 动态扩展 MySQL

一般都会提前规划好 MySQL 集群模式,存储大小,一般都不会做什么应急扩容。而像一些 pass,提供一些云数据库这种是方便向用户收费,他们是云平台,使用 docker 扩容完全没问题。但正常公司不会【频繁】修改 MySQL。


8.2 数据共享

若把容器实例删了,镜像也移除了,MySQL库表数据还在吗?


容器实例是由 Docker 镜像创建的运行实例,而容器内的 MySQL 是运行在该容器实例中的 MySQL 数据库服务。在 Docker 中,每个容器实例都是一个相互隔离的运行环境,可以运行不同的应用程序和服务。因此,当您在 Docker 容器中运行 MySQL 时,MySQL 数据库服务是运行在该容器实例的隔离环境中的,与其他容器实例和主机上的其他进程相互隔离。


若你删除 Docker 容器实例,且该容器实例中的数据没有进行持久化存储,则该容器实例中的数据将会被删除。若你删除 Docker 镜像,那么该镜像的文件系统和历史记录也将被删除,但是该镜像所创建的容器实例中的数据不会受到影响。


容器和镜像是不同东西:


容器是由镜像创建的运行实例

而镜像是用于创建容器的模板

因此,删除容器实例不会影响镜像本身,而删除镜像会影响以该镜像为基础创建的所有容器实例。


所以,我们都会通过磁盘进行挂载,将数据转移存储到宿主机的某目录下。所以我们前文中的启动命令也包括挂载操作,这样可以确保即使容器实例被删除,数据仍然可以被保留下来。


但若我们想实现数据共享,即把数据共享给其他数据库,做数据的共享扩容,而我们刚才挂载的目录显然又是无法被多个数据库共享的,其他数据库是无法写入的,所以无法实现数据共享。因为宿主机上的目录只能被一个容器实例访问和写入,无法实现多个容器实例之间的数据共享。


宿主机上的目录只能被一个容器实例访问和写入,是因为同一时间只有一个进程(或容器实例)可以占用该目录。当你将宿主机上的目录挂载到容器中时,该目录在容器中的访问权限与在宿主机上的访问权限是一致的。若多个容器实例同时访问该目录,就会发生冲突,导致数据的不一致性和损坏。


为解决这问题,可使用一些分布式文件系统,如 GlusterFS、Ceph,将宿主机上的目录转换为一个分布式文件系统,并将其挂载到多个容器实例中。这样就可以实现多个容器实例之间的数据共享和访问。


8.3 内存独占

其它中间件如 cache、mq,大家其实都在同一个服务器内,都会使用内存,就会发生内存竞争,当然你也能限制其它中间件的内存使用阈值,MySQL 自然也很可能无法被分配到足够的内存,无法对当前服务器的内存进行独占,导致对性能有一些影响,这也是一大局限。


在这种情况下,可通过以下方式来优化系统的内存使用:


为每个中间件设置合适的内存使用限制,避免竞争和冲突。

对于 MySQL 数据库来说,可以通过调整缓存和缓冲池大小来优化内存使用。

对于 cache、mq 等中间件,可以使用专业的监控工具来监控其内存使用情况,并及时调整配置和优化性能。

通过以上措施,有效避免内存竞争和独占问题,并提高系统的性能和可靠性。

8.4 不要把鸡蛋放在一个篮子里

数据库是系统的底限,必须全力保证其稳定性。所以最好单独部署,一个 docker容器只部署MySQL。所以推荐使用各种云数据库,运维成本低,也满足三高要求,除了贵这一个缺点。


9 总结

使用 Docker 部署和配置 MySQL 数据库时,可获得很多好处,如更高可移植性、更好的资源隔离和更好的可伸缩性。Docker 为 MySQL 数据库的部署和管理提供了很多便利,可更轻松管理和维护 MySQL 数据库。


本文介绍了如何使用 Docker 部署和配置 MySQL 数据库,并提供了一些优化性能和避免常见问题的建议。希望这篇文章能够帮助您更好地理解 Docker 和 MySQL 数据库,并在实践中获得更好的体验和效果。


如果对 Docker 和 MySQL 数据库有任何问题或建议,欢迎在评论区留言,我将尽快回复。同时,也欢迎关注我的博客,获取更多关于技术和实践的分享和经验。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
tengine 关系型数据库 MySQL
Tengine、Nginx安装MySQL数据库命令教程
本指南详细介绍了在Linux系统上安装与配置MySQL数据库的步骤。首先通过下载并安装MySQL社区版本,接着启动MySQL服务,使用`systemctl start mysqld.service`命令。若启动失败,可尝试使用`sudo /etc/init.d/mysqld start`。利用`systemctl status mysqld.service`检查MySQL的服务状态,确保其处于运行中。通过日志文件获取初始密码,使用该密码登录数据库,并按要求更改初始密码以增强安全性。随后创建一个名为`tengine`的数据库,最后验证数据库创建是否成功以及完成整个设置流程。
|
13天前
|
关系型数据库 MySQL Linux
Linux 安装 mysql 【使用 tar.gz | tar.xz安装包-离线安装】
在Linux系统中使用tar.xz压缩包安装MySQL数据库的详细步骤。包括下载MySQL压缩包,解压到指定目录,创建mysql用户和组,设置目录权限,初始化MySQL,配置my.cnf文件,启动服务,以及修改root用户密码。此外,还提供了如何设置Windows远程登录MySQL服务器的方法。
Linux 安装 mysql 【使用 tar.gz | tar.xz安装包-离线安装】
|
13天前
|
关系型数据库 MySQL 数据安全/隐私保护
docker应用部署---MySQL的部署配置
这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
docker应用部署---MySQL的部署配置
|
10天前
|
数据采集 中间件 关系型数据库
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
30 2
|
13天前
|
关系型数据库 MySQL Linux
Linux 安装 mysql【使用yum源进行安装】
这篇文章介绍了在Linux系统中使用yum源安装MySQL数据库的步骤,包括配置yum源、安装MySQL服务、启动服务以及修改root用户的默认密码。
Linux 安装 mysql【使用yum源进行安装】
|
1天前
|
关系型数据库 MySQL 数据库
docker mysql表名和数据库名不区分大小写
docker mysql表名和数据库名不区分大小写
9 0
|
23天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
25天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
185 11
|
20天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
59 13
MySQL的安装&数据库的简单操作
|
26天前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
119 14
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案

热门文章

最新文章