数据库部署在Docker中,Are You Crazy ?

简介: 数据库部署在Docker中,Are You Crazy ?

最近在兼职做 IT 咨询期间遇到过许许多多问题,其中咨询较多的问题之一就是在 Docker 容器中部署数据库。每每接到这个咨询我就想说一句:Are you crazy? Docker 在这几年可以说是大火,几乎所有的公司都将网站或者应用系统部署在 Docker 中,更有甚者将数据库也部署在 Docker 中(这个内容占到 Docker 问题咨询的一半左右)。那么将数据库部署在 Docker 中真的好吗?虽然像 MySQL、MSSQL、Oracle 等知名数据库都有 Docker 镜像,但是就目前 Docker 的情况来看将数据库容器化是不合理的,主要原因有如下6个方面:


  1. 数据安全
  2. 网络问题
  3. 资源隔离
  4. 云平台适用问题
  5. 运行环境
  6. 状态问题


下面分别对这七6方面进行一一讲解。


一、数据安全

Docker 官方明确说明过不要将数据存储在容器中,因为容器可以随时被删除,这样存储在容器中的数据也就随之丢失,因此官方推荐使用挂载 Volumes 的形式来存储数据,但是 Volumes 是由 Union FS 镜像层提供数据持久存储的,了解这个镜像层的开发人员都知道它很难保证数据安全,如果容器意外挂掉那么数据就很有可能损坏。其次,如果频繁对容器的共享数据卷(组)读写操作也会对物理服务器的硬件造成损害,进而造成数据丢失。


二、网络问题

数据库一般都具有高负载,因此需要专用的网络和持续的吞吐。如果对 Docker 的网络和网络虚拟化没有深入的了解的话,做这一块将会非常的困难,即使做了出来也很难保证网络的稳定。


三、资源隔离

Docker 目前还无法完全实现资源隔离,它只利用 Cgroup 来实现资源限制,只能限制资源消耗的最大值。如果有其他应用系统大量占用物理服务器资源,那么将会影响到部署在容器中的数据库的执行效率。


四、云平台适用问题

目前主流的云平台都支持弹性扩展,如果像让我们的数据库服务器也可以弹性扩展的话,就必须适用非容器化环境。


五、运行环境

我在进行 IT 咨询的时候遇到过很多将数据库容器和其他服务容器部署在同一台服务器上的情况,我们都知道不同类型的服务所需的硬件要求是不同的,尤其是像数据库这种服务对 IO 的要求会比较高。正常情况下我们会将数据库单独部署在独立的服务器上,这样就要可以避免并发资源竞争,但是如果将数据库部署在容器中那么可想而知将会限制数据库对资源的利用进而引发数据库的性能问题。


六、状态问题

Docker 快速扩展的重要特征是无状态,可以实现编排容器解决单点故障,一般来说具有状态的数据都不适合放在容器中,但是数据库是有状态的,如果将其部署在容器中会就必须单独部署存储服务,那么如果数据库崩溃/出错造成的故障范围就会扩大,进而应用系统崩溃。


七、总结

上面六条总结了为什么 Docker 不适合部署数据库,当然这不是绝对的。如果你使用的是轻量级数据库或者分布式数据库的话其实是可以部署在 Docker 中的。


目录
相关文章
|
4天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
145 91
|
5天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
20天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
12天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
71 44
|
11天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
84 42
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
58 23
|
24天前
|
SQL Java Maven
docker部署apollo
docker部署apollo步骤
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
49 22
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
66 25
|
25天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
63 6