微服务项目的Docker部署策略

97次阅读
没有评论

问题描述

是一个新手,对DevOps的运维方面有些困惑。特别是在一个微服务项目中,如果每个JAR包都在同一台硬件上的虚拟机(VM)中部署,如何避免限制吞吐量?如果服务器只有固定的处理能力,而多个服务都在竞争这些资源,似乎会导致性能下降。有人能解释一下这是如何工作的吗?

解决方案

请注意以下操作注意版本差异及修改前做好备份。
在微服务项目中,使用Docker进行部署时,不会为每个微服务都部署一个独立的虚拟机(VM),这样会浪费大量资源。Docker与虚拟机不同,它不是一种虚拟化技术,也没有额外的层介于Docker容器内运行的进程和主机内核之间。Docker的运行过程与直接在主机上运行进程几乎没有区别,也没有显著的内存使用开销。

Docker基于命名空间的概念。现代Linux内核为其所有内部数据结构(从用户ID到网络接口到进程表)提供了命名空间。无论进程是在Docker容器内还是在主机上运行,访问内核资源/硬件/网络等方面的所有情况都是完全相同的。这就是Docker的优点所在,也是为什么Docker容器可以快速启动而几乎没有开销的原因。

唯一的区别在于文件系统,这不是由于任何形式的虚拟化,而是由于将许多文件系统层叠在一起的”洋葱”式结构。在构建镜像时,有一些选项可以避免这种情况,例如将多个层合并为一个层,这将减轻此类问题(反之,您也可以在纯Linux中挂载类似于unionfs的文件系统,它们将具有完全相同的性能开销)。

但是,这种开销通常是可以忽略的,因为标准的微服务通常只会加载一次,然后持续运行。如果在容器中使用存储,通常不会将其写入容器本身(尽管可以),而是在启动容器时挂载到一个单独的卷中;而这些卷就像普通的Linux挂载一样,即没有性能损失。

总结一下:Docker在大多数情况下几乎没有任何性能损失;命名空间而不是虚拟化是原因所在。

参考文献:Docker Performance Study

正文完