为什么建议一个容器中只运行一个进程

docker容器必须要有前台进程 容器进程必须以前台方式运行 阅读详情

文章首发于:https://www.cnblogs.com/JasonCeng/p/14814888.html

在云原生与容器化时代浪潮下,大多数新手的普遍认识是“容器=虚拟机”,既然容器等同于虚拟机,那么在容器中想运行多少个进程就运行多少个进程。

作为从新手村走过来的人,笔者想为这个想法纠偏,避免大家和我走一样的弯路。有两个概念我们要理清:第一,容器不等同于虚拟机;第二,容器中不建议运行多个进程。

本文以Docker容器为主要讨论展开。

为什么说容器不等同于虚拟机呢?

我们来看一个较为学术的定义:A docker container is not a full virtual machine to run a complete stack of application instances and services. Docker container is the application; or more accurately a service that helps to make up the application.即,Docker容器不是一个运行完整的应用程序实例和服务堆栈的完整虚拟机。Docker容器是一种应用程序,或更准确地说是一种有助于构建应用程序的服务。

虽然容器不等同于虚拟机,但它们也有相似之处,容器与虚拟机拥有着类似的使命:对应用程序及其关联性进行隔离,从而构建起一套能够随处运行的自容纳单元。此外,容器与虚拟机还摆脱了对物理硬件的直接控制,允许我们更为高效地使用计算资源,从而提升能源效率与成本效益。[1]

那么,容器和虚拟机的不同点究竟在哪呢?笔者在这里做了一个通俗形象的类比。首先,对于物理机、虚拟机和容器在基础架构上的不同,可以类比为独栋别墅、小区楼盘和胶囊式公寓的区别。

物理机

物理机就像独栋别墅,拥有独立的基础设施,水管、电线、地基等都由自己独享,也就是说,网卡、内存、CPU等硬件都由自身操作系统独占。

物理机上的硬件可以看作是基础设施(Infrastructure),没有基础设施一切都无从谈起,硬件之上则是主操作系统(Host Operating System)。除此之外,还有各类基础软件,如各类硬件配套的驱动软件。

这里还要再重点介绍的是Hypervisor,它(也称为虚拟机监视器或VMM)是创建和运行虚拟机(VM)的软件。虚拟机管理程序通过虚拟共享其资源(例如内存和CPU),使一台主机可以支持多个Guest OS。

虚拟机

虚拟机就像小区楼盘,所有房子共享地基,但房子内部有自己独立了电线、水管,虽然最终也是走的统一水电管网出小区。也就是说,多个虚拟机之间,网卡、内存、CPU等硬件虽然最终是共用一套,但在虚拟机内部是由独立的一套虚拟硬件进行运转的。

前面我们介绍了hypervisor,hypervisor是一种虚拟化服务器的软件,这是在物理机及宿主机操作系统上运行虚拟机VM的基础,它帮助我们对硬件进行虚拟化。

虚拟机里的操作系统我们称为Guest OS,这是一个完整的操作系统,只要安装应用程序运行所必需的二进制文件和库,在其之上便可以运行应用程序,且能确保各个虚拟机之间、虚拟机与宿主机之间的环境完全独立、资源相互隔离。

由于虚拟机里运行的是一个完整的操作系统,且需要虚拟出Guest OS运行时所需的所有硬件的虚拟副本,这意味着虚拟机会占用大量系统资源,特别是CPU和内存的资源占用率会比较高,且虚拟机的空间占用可以高达数GB。不过在合理范围内,虚拟机可以利用固有的硬件资源虚拟出多台完整VM,其存在仍然有价值,与单独运行的物理机相比仍然是经济的。

虚拟机是伟大的,它通过抽象来增加并行,服务于多操作系统的使用,并提供业界最好的安全性。但对于隔离,它们相当昂贵。[2]

图1. 虚拟机层级图

容器

容器就像胶囊式公寓,所有隔间不仅共享地基,连电线、水管也都是共享的,且每个隔间的空间有限,彼此之间也相互隔离。当然,他们是共用大房间里的基础设施,如公共空间。

也就是说,容器是共用物理网卡、内存、CPU的。只有当他们之间需要通信时,才会采用容器层面的网桥docker0,而对于其他硬件,可以简单认为每个容器占有了限定范围内的资源(如RAM、CPU等)。

容器只是运行在宿主机上的一种特殊进程,多个容器之间使用的还是同一个宿主机的操作系统内核。可以认为,容器是一个不依赖于操作系统,运行应用程序的环境。

容器通过Linux的Namespace和Cgroups技术对应用程序进程进行隔离和资源限制。

Namespace的作用是环境隔离,它让应用程序只看到该Namespace内的世界。而Cgroups 的作用是限制分配给进程的宿主机资源。不过,对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。

对于Namespace技术,这里做一个稍微深入一点的解读。通过Mount Namespace,容器可以修改进程对自己的文件系统“挂载点”的认知。在容器进程启动之前重新挂载它的整个根目录"/",这个挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”。它还有一个更为专业的名字,叫作:rootfs(根文件系统)。rootfs只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。同一台机器上的所有容器,都共享宿主机操作系统的内核。[3]

Linux CGroup全称Linux Control Group,是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。Cgroup可让您为系统中所运行任务(进程)的用户定义组群分配资源—比如CPU时间、系统内存、网络带宽或者这些资源的组合。您可以监控您配置的Cgroup,拒绝Cgroup访问某些资源,甚至在运行的系统中动态配置您的Cgroup。[4]

回过头来谈谈操作系统内核,由于同一台宿主机上的所有容器都共享宿主机的操作系统内核,那么如果有一个容器里的应用程序需要配置内核参数,跟内核进行直接交互,则这些参数对所有容器来说就像一个“全局变量”,牵一发而动全身。

这也是容器劣势的主要原因,正是因为容器共享宿主机操作系统内核,因此不能像虚拟机一样模拟出完整的硬件机器充当沙盒,从而实现完全隔离。也就是说,容器是进程级的隔离,它可以通过影响宿主机操作系统内核来影响其他容器。

但容器还是有很多优势。首先,容器的空间占用比虚拟机小很多,甚至可以小到10MB,和虚拟机动则数GB相比十分小巧;其次,容器能轻松限制内存和CPU使用率,相比虚拟机采用hypervisor来实现虚拟化更加轻量;同时,正是由于容器体积小、采用的技术(Containerzation Engine)更轻量,使得它启动十分迅速,这十分有利于快速扩展。

值得一提的是,在DevOps理念日益流行的时代,容器对于持续集成和持续部署(CI/CD)实施也是极好的选择,它使得开发人员更容易构建、分发以及快速部署他们的应用程序。

图2. 容器层级图

为什么说容器中不建议运行多个进程呢?

聊过虚拟机与容器的区别之后,让我们暂时忘记架构和软件工程哲学。在前面的讨论中我们已经知道,容器其实是应用程序抽象出来的可相互隔离的线程。尽管单个容器中确实可以运行多个应用程序,但出于实际原因,您可能需要考虑遵循“每个容器一个应用程序”的经验法则。

1、每个容器中只运行一个应用程序,则水平伸缩将变得十分容易。例如,当你需要一个Tomcate容器,可以从现有的容器再扩展出一个,但如果你的这个容器中不仅有Tomcate,还有MySQL等其他应用程序,事情就会变得复杂起来。

2、每个容器中只运行一个应用程序,可以轻松地将其重新用于其他项目或目的,极大增加复用度。

3、每个容器中只运行一个应用程序,出现故障时开发人员能方便地对该故障容器进行问题排查,而不必对整个系统的各个部分进行排查,这也使得其更具有可移植性和可预测性。

4、每个容器中只运行一个应用程序,升级程序时能够将影响范围控制在更小的粒度,极大增加应用程序生命周期管理的灵活性,避免在升级某个服务时中断相同容器中的其他进程。

5、每个容器中只运行一个应用程序,从安全性和隔离性角度来看,能够提供更安全的服务和应用程序间的隔离,以保持强大的安全状态或遵守PCI之类的规定。[5]

话说回来,容器本身的设计,就是希望容器和服务/应用能够具备相同的生命周期。即:一个容器对应一个进程。这样,才能够最好地应用容器编排来管理好容器和服务。

综上,建议单个容器中只运行一个独立的进程。

参考

[1] https://blog.youkuaiyun.com/qq_24624539/article/details/103445229

[2] http://dockone.io/article/723

[3] https://zhuanlan.zhihu.com/p/157749762

[4] https://coolshell.cn/articles/17049.html

[5] https://devops.stackexchange.com/questions/447/why-it-is-recommended-to-run-only-one-process-in-a-container

(全文完)

更多关于大数据、分布式、存储、区块链、Linux相关文章请关注微信公众号:asympTech渐进线实验室

Github、知乎、博客园、优快云、简书全网唯一id:JasonCeng

Docker容器中可以运行多个应用或服务吗? 在Docker中,每个容器最好只运行一个应用或服务,以保持其轻量级和易管理性。但有时你可能想在一个容器中运行多个进程。这里告诉你为什么这通常不是个好主意,以及怎么做。 阅读详情

相关推荐

为什么 Docker 容器中的进程不应该以 root 身份运行

Docker 容器中的进程不应以 root 身份运行。以您指定为 Dockerfile 的一部分或使用docker run. 这通过减少对容器中任何威胁的攻击面来最大限度地降低风险。在本文中,您将了解以 root 身份运行容器化应用程序的危险。您还将看到如何创建一个非 root 用户并在不可能的情况下设置命名空间。

学海无涯苦作舟的博客 2262

容器内部运行多个进程(服务)

容器的哲学是一个进程(服务)一个容器 但是一个容器多个进程(服务)是可以实现的,比如: ELK的容器,就把3个进程塞在了一个容器里 常见的实现方式 参考: 如何科学的在Docker Container中运行多个服务 参考未提及的: 使用supervisor在Docker同时启动多个服务 PouchContainer 补充用脚本启动的一种方式,这里不必用到while true; do sleep 10;done这样 #!/bin/bash # 一共2个进程,其中一个进程后台,另一个进程作为前台.

cumt_TTR的专栏 3306

解释可以在一个容器中同时运行多个应用进程吗?

Docker容器中实现多进程运行的技术分析与实践 摘要:Docker容器可通过进程管理工具(如Supervisor)、自定义脚本或多进程框架实现多应用运行。核心方法包括配置进程管理器管理生命周期、编写脚本后台启动多个进程等。优点在于资源共享和部署简化,但面临信号传递、资源竞争等挑战。关键解决方案包括使用tini处理信号、Cgroups分配资源。适用紧密耦合服务或资源受限场景,但生产环境建议优先采用多容器架构。最佳实践推荐使用Supervisor管理进程,并明确资源限制,需注意避免无监控脚本和违反隔离性原则的

weixin_39291964的博客 371

【探索 Kubernetes|容器基础进阶篇 系列1】容器的本质是进程

相信大家学容器时都看过这个虚拟机和容器的对比图。左边是虚拟机的工作原理,其中Hypervisor 软件是虚拟机最重要的部分它可以实现模拟出各种硬件,比如:CPU、内存、磁盘等,在Hypervisor 软件层之上创建 Guest OS 也就是客户机操作系统,Guest OS 和 Hypervisor 模拟出来的硬件交互,这样用户应用程序就可以运行在这个虚拟机中,用户自然看到的就是这个新的操作系统的文件系统结构,这也是虚拟机也能起到将不同应用程序相互隔离的原因。

持续分享,个人的运维经验,包含:云计算、Linux、Windows、容器、K8s、CICD、Python、运维开发、公有云等;以及个人经历相关内容,包含:实习、面试经验等。 2274

OpenClaw Windows 最详细安装指南

Windows上养龙虾:OpenClaw完整安装教程+钉钉接入,助你养只大龙虾

weixin_43405859的博客 2212

django drf 框架知识点(一)——serializer序列化器_用法全解

【django drf】序列化器:别名设置,全部参数序列化,自定义字段,只读只写,部分更新

qq_59344127的博客 1338

容器与进程

首先,大家可能会有个疑问,容器,到底是怎么一回事儿? 我们说容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这不就是PaaS最理想的状态嘛。 不过,这两个能力说起来简单,但要用技术手段去实现它们,可能大多数人就无从下手了。 所以,我就先来跟你说说这个“边界”的实现手段。 假如,现在你要写一个计算加法的小程序,这个程序需要的输入来自于一个文件,计算完成后的结果则输出到

Real_cTo的博客 1796

自动换挡频率计的设计精髓:如何用数字电路优雅地解决量程切换难题

本文深入解析了自动换挡频率计的设计精髓,重点探讨如何利用数字电路优雅解决量程切换难题。通过74系列通用数字集成电路构建智能化的自动量程切换系统,详细介绍了状态检测、决策逻辑和档位执行等核心模块的设计方法,并对比了不同实现方案的优劣,为电子测量领域的工程师提供了实用的硬件设计参考。

weixin_27869497的博客 407

docker使用

Docker 获取镜像,eg: docker pull ubuntu:16.04 查看当前电脑有哪些镜像,eg: docker images 共有5个属性,分别时所属仓库、标签、镜像id、创建时间和镜像大小 从镜像运行一个容器: docker run 命令可以从一个镜像运行一个包含一个主进程进程的容器: eg: docker run -ti --name ubuntu_system ...

old__captain的博客 292

梦幻西游端游脚本开发实战:从易语言到大漠多线程全解析

本文详细解析了梦幻西游端游脚本开发的全流程,从易语言基础入门到大漠插件多线程实战。重点介绍了易语言中文编程优势、大漠插件图色识别技术,以及多线程控制台开发技巧,帮助开发者高效实现游戏自动化,提升脚本稳定性和执行效率。

weixin_29251567的博客 1061

Jetson Orin NX上PyTorch环境搭建与性能优化指南

本文详细指导如何在Jetson Orin NX上搭建高效的PyTorch开发环境。内容涵盖CUDA与cuDNN的“隐藏”配置、Miniconda虚拟环境管理、PyTorch for Jetson的正确安装与验证,并提供了电源模式设置、TensorRT加速、混合精度等关键性能优化实战技巧,帮助开发者充分释放边缘AI设备的算力。

weixin_29090089的博客 337

容器(如 Docker)中,通常不建议运行多个进程或要求进程必须运行在前台

若容器中运行多个进程,且没有进程管理器(如systemd、supervisord)处理子进程的退出状态,父进程(非PID 1进程)退出后,子进程会成为“僵尸进程”(状态为。在容器(如Docker)中,通常不建议运行多个进程或要求进程必须运行在前台,这与容器的设计理念、资源管理和生命周期管理机制密切相关。:若容器中同时运行Web服务(进程A)和日志服务(进程B),若进程A先退出,进程B未被正确管理,就会成为僵尸进程。),进程会脱离终端控制,导致容器在启动后立即“假死”(表面上运行,但实际无有效进程)。

liweiweili126的博客 1489

stable-diffusion-webui的逐步部署教程

本文主要介绍了stable-diffusion-webui的逐步部署教程,希望能对使用Stable Diffusion的同学们有所帮助。 文章目录 1. 前言 2. 逐步部署教程 2.1 创建Python环境 2.2 安装依赖库 2.3 运行代码

weixin_43178406的博客 6万+

到底为什么每个容器只运行一个进程?

小房子只住一个“主人”(进程),生活习惯不会冲突房子的大小(资源)专门为这个主人设计,不会浪费如果需要多个服务,就搭多个小房子,每个房子住不同的主人这样设计让容器变得简单、稳定,就像小朋友整理玩具,每个盒子只装一种玩具,找起来方便,也不会弄乱!

长风破浪会有时的博客 724

第八届传智杯微信小程序开发挑战赛练习题库

本文是微信小程序开发练习题库,包含单选题、多选题和判断题三种题型。单选题主要考察小程序开发基础知识,如数组方法、组件使用、API调用等;多选题涵盖样式属性、页面跳转、数据处理等综合知识;判断题则测试开发者对小程序特性、生命周期、功能限制等概念的理解。题目内容涉及小程序开发的各个方面,包括组件使用、API调用、数据绑定、页面配置等核心知识点,适合开发者进行自我测试和知识巩固。

qq_73044452的博客 505

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

一个容器中运行多个前台进程

#先说解决办法,多个前台运行文件直接用&连接,不要使用&&或者单个单个hold。有耐心的同学可以看看前因后果。欢迎大佬的评论与指教! 背景: 在docker容器中,如果一个容器只运行一个进程服务是蛮简单的,通过Dockerfile中CMD就可以实现,如果有参数也只需使用ENTERPOINT,CMD作为参数传入即可。 然而所有事物都不是一层不变的,由于业务的需要本将nodej...

镜的博客 1833

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

如何在一个 Docker 容器中运行多个进程 ?

在容器化的世界里,Docker 彻底改变了开发人员构建、发布和运行应用程序的方式。然而,在单个 Docker 容器中管理多个进程可能具有挑战性,这就是 Supervisor 发挥作用的地方。

xiaochong0302的博客 1850

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

docker容器中的前台程序和后台程序,为什么一定要前台运行

docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。 为了验证这一点,我写了两个go程序并静态编译为可执行程序,common 和 daemon ,他们即可前台运行也可后台运行 前台运行 ./common ./daemon 后台运行 ./common serve -d ./daemon -d

猛犸象 1万+

为什么说容器是单进程模型

Go 语言现在的一个主要应用领域就是云原生技术,包括容器(以 Docker 为代表)、Kubernetes、Prometheus 等。后面将写一系列文章来介绍一下云原生技...

Docker的专栏 2471

如何运行多进程Docker容器

2016-01-09 如何运行多进程Docker容器? 摘要: 本文介绍了两种在Docker容器中运行多个进程的方法: shell脚本和supervisor。 GitHub地址: kiwenlau/kubernetes-shell kiwenlau/kubernetes-supervisor 作者: KiwenLau 日期: 2016-01-09 一. 简介 一般来说,Docke...

lusic01的专栏 1060

Docker容器里的进程为什么要前台运行

《第一本Docker书》里面,讲到Docker容器启动web服务时,都指定了前台运行的参数,例如apache: ENTRYPOINT [ "/usr/sbin/apache2" ] CMD ["-D", "FOREGROUND"]    又例如nginx: ENTRYPOINT [ "/usr/sbin/nginx", "-g", "daemon off;" ]       为什么要这么做

kiboseeker的技术博客 1万+

Docker容器化后台运行与守护进程模式的实践

在Linux系统中,守护进程(Daemon)是一种在后台运行的进程,通常不需要用户交互。进程在后台运行,不占用终端。与控制终端脱离,避免因终端关闭而终止。通常以非交互式的方式运行。可能需要管理多个子进程以完成任务。Docker容器化部署中,后台运行和守护进程模式是常见的需求,特别是在Web服务器、消息队列、中间件等服务的部署中。通过将应用程序以守护进程的方式运行,可以确保服务的稳定性和可靠性。在某些情况下,可能需要自定义日志配置以满足特定的需求。# 自定义日志配置文件。

木头大左的博客 1452

进程状态 为什么容器里有这么多僵尸进程?

今天我们来聊一聊容器里僵尸进程这个问题。 说起僵尸进程,相信你并不陌生。很多面试官经常会问到这个知识点,用来考察候选人的操作系统背景。通过这个问题,可以了解候选人对 Linux 进程管理和信号处理这些基础知识的理解程度,他的基本功扎不扎实。 所以,今天我们就一起来看看容器里为什么会产生僵尸进程,然后去分析如何怎么解决。 通过这一讲,你就会对僵尸进程的产生原理有一个清晰的认识,也会更深入地理解容器 init 进程的特性。 问题再现 我们平时用容器的时候,有的同学会发现,自己的容器运行久了之...

小楼一夜听春雨,深巷明朝卖杏花 1665

【docker系列】容器自启动与守护进程停止后容器保活

一、Docker守护进程开机自启动,二、Docker容器自启动重启策略说明,三、Docker守护进程停止期间保证容器服务正常。

字母哥博客 8108
上一篇: 《JacaScript权威指南(第五版)》读书笔记(第二章)——词法构造
下一篇: 《个人信息保护法》正式施行,拒绝隐私泄露
普通网友
博客等级 码龄11年 23粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值