【云计算】Docker多进程管理方案-cfengine && supervisord
docker容器内多进程的管理方案
容器生来适合的是以单进程为主的独立的微服务架构,而很多传统的组件则是体积庞大,多 个进程(组件)之间难以拆分到不同的容器中,所以在单个容器内部署多个组件便成了一种 暂时的折衷方案。这便引入了一个问题:如何在容器内管理多个进程?
综述
总的来说,至少有三种方式可选:
- 通过
romote api进行远程attach。通过http的方式来远程执行命令 - 使用一个
init程序作为容器的主进程,所有组件都作为此程序的子进程 - 不虚拟
PID的namespace
这几种方式各有优劣,下面将分别进行详述。
Remote Attach
Docker Remote API 提供了两种进行 Remote Attach 的方式,一是通过 POST 的方式,另 一种是通过 Websocket 协议。 Websocket 是构建于 HTTP 之上的一种协议,比较适合于双 向通信。可惜的是,二者的文档都很少,很难完整地实现一个简单,可靠的客户端,不过总 的来说, websocket 要比 POST 方便很多,这里有一个简单的客户端实现 docker-ws-client ,可以远程发送命令 并执行。
这个程序只能用来进行简单的演示,在生产环境几乎是不可用的。主要问题如下:
- 要想命令被执行,容器内必须有一个
bash程序存在,生产环境用的容器很少会需要在 里面放一个bash程序 - 对于一些命令输出为交互式的来说(比如
top),在执行了这些程序之后,会干扰到后续 命令的执行,一般只能通过重启容器解决。 - 远程发送命令的执行结果会和其他容器内程序的输出相混淆。这就意味着
docker logs的输出里会混杂每次远程命令执行的结果,远程命令的结果里也会混杂着其他的程 序的输出,导致无法获取精确的信息 - 返回结果里附带了一行命令提示符,这是
bash的正常表现,但在远程执行时经常不需 要这个功能。
Docker 自身在实现 Websocket Server 时选用的是一个比较简陋的库 : code.google.com/p/go.net/websocket/ , 所提供的API很少,无法对双向通信提供精确的控制。而且按照 Docker 自身的规划来说,这 个功能并不是需要重点支持的,因为Docker适用的是微服务(单进程),常用的远程API都 是针对容器级别的,对容器内部的操纵只能算是一些“小众”需求,社会不太会花太多时间 在这块的改进上,所以不建议花时间在这方面构建什么东西。
多进程管理程序
这也是Docker官方比较推荐的一种方式,有两篇官方博文介绍: Process Management with CFEngine 和 Using Supervisor with Docker 。 思路其实很明确 : 将多进程转为单进程(管理程序,容器的 init 程序),这个 init 程序的 生命周期和容器是一样的,就符合了单进程的模型,虽然可能不是那么轻量级。
这也是最适合生产环境中的一种方式。当然长期来说,能将各种传统服务转为微服务架构最 好,但在这个过渡期,或者对一些转换代价比较大的服务来说,这是最为稳定和可控的一种 方式。其主要优点如下:
- 不用再写脚本。脚本是容器内启动多个进程最为简单也是问题最多的一种方式。信号传 递、进程监控、容易引起僵尸进程、后台程序的处理……引发的问题非常多。
- 管理进程的通用性。
Supervisor这类开源组件已经说明管理进程完全可以做的非常通 用,通过配置文件的定制,这个程序完全可以跑在所有需要多进程的容器内。 - 复用性。如果要自己开发这个程序,完全可以用到很多已有的经验,毕竟容器内的环境 非常类似于物理机上。已有平台的监控方式,在容器里几乎是一样的,这能大大减少开 发难度。
总之,对于简单的使用案例,可以尝试 Supervisor 这类开源组件。而对于有能力的公司, 则推荐在已有经验上开发一个新的管理程序。
Host PID Namespace
这种情况不再对容器内的PID进行虚拟,即 docker top 和在容器内执行 top 命令看到的 都是进程的实际PID。这样做的好处是原有的监控方案可以直接拿过来用,比如状态查看, 杀死进程等,不好的地方就是如果需要拉起的话则是在容器外做不到的,因为拉起一般都是 通过可执行文件的路径来做的,而容器的文件系统是虚拟的,所以基本上无法实现。
这种方式也是不推荐的。我们使用容器,最终也是为了虚拟化,所以在不影响性能的情况下, 应该进行将各部分都虚拟出来,这样最不容易出问题。如果虚拟网络性能不好,我们可以先 不用虚拟网络,但是其他的部分如果不是因为性能原因,还是尽量通过其他可能的途径去解 决问题,而不是破坏环境的一致性。
链接
参考资料:
docker容器内多进程的管理方案:http://www.tuicool.com/articles/2677VfR
Process management with CFEngine:https://docs.docker.com/engine/admin/cfengine_process_management/
Using Supervisor with Docker:https://docs.docker.com/engine/admin/using_supervisord/
【云计算】Docker多进程管理方案-cfengine && supervisord的更多相关文章
- 【云计算】Docker 多进程管理方案
docker容器内多进程的管理方案 时间 2015-05-08 00:00:00 涯余 ...
- 云计算Docker全面项目实战(Maven+Jenkins、日志管理ELK、WordPress博客镜像)
2013年,云计算领域从此多了一个名词“Docker”.以轻量著称,更好的去解决应用打包和部署.之前我们一直在构建Iaas,但通过Iaas去实现统一功 能还是相当复杂得,并且维护复杂.将特殊性封装到 ...
- Supervisor多进程管理 异常自动重启 可视化管理
一.序言 Supervisor是多进程管理工具,在Docker中相关联的进程能够通过supervisor来管理. 微服务项目开发阶段,可用于微服务子项目的启动管理. 支持web可视化管理,能够极大方面 ...
- docker集成管理工具-shipyard的开发环境搭建笔记
前段时间一直在研究openstack,后来老师告诉我需要用docker容器来搭建hadoop集群,所以就将战场转移到docker上来了,话说docker最近这段时间太火了,但是说实话我觉得应用起来还不 ...
- Docker日志管理--docker部署安装ELK (十一)--技术流ken
Docker logs 对于一个运行的容器,Docker 会将日志发送到 容器的 标准输出设备(STDOUT)和标准错误设备(STDERR),STDOUT 和 STDERR 实际上就是容器的控制台终端 ...
- 优秀的云计算工程师需要学什么?云计算Docker学习路线
云计算工程师要学什么?随着互联网的快速发展,云计算这个词大家并不陌生,但是云计算究竟是做什么的,想要从事云计算要学习什么,很多都不知道,那么今天就给大家讲一下云计算. 云计算是基于互联网的相关服务的增 ...
- docker 日志管理
高效的监控和日志管理对保持生产系统持续稳定地运行以及排查问题至关重要. 在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要.考虑到容器短暂和不固定的生命周期,当我们需 ...
- 你必须知道的容器日志 (2) 开源日志管理方案 ELK
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<你必须知道的容器日志(1)>中介绍了Docker自带的log ...
- docker 进程管理
详文:理解Docker容器的进程管理:https://yq.aliyun.com/articles/5545 在Docker中,每个Container都是Docker Daemon的子进程. dock ...
随机推荐
- Django 1.6在Windows平台下的配置
Django 1.6 在Windows平台下的配置 前言 最近两天研究了下Django1.6在Windows平台中的配置安装,服务器采用Apache.期间遇到过许多新手所遇到的各种问题,也算是一种宝贵 ...
- svn服务器配置以及自动同步到web服务器
感觉再不用svn就真的老了. 安装 yum install subversion 新建repo mkdir -p /opt/svn/myrepo svnadmin create /opt/svn/my ...
- react生命周期函数使用箭头函数,导致mobx-react问题
最近新人加入了项目,遇到了一个很奇怪的问题.mobx observable 属性,onChange的时候就是页面不会刷新. 试来试去,就是不知道什么原因,后来其他同事查到是因为componentWil ...
- (翻译)一起使用 .NET 和 Docker——DockerCon 2018 更新
原文:https://blogs.msdn.microsoft.com/dotnet/2018/06/13/using-net-and-docker-together-dockercon-2018-u ...
- Genymotion的2个问题及解决方法
问题一:Unable to connect to your virtual device 解决方法:基本都是内存不够导致的,在virtualbox中调整对应虚拟机的内存,确保任务管理器中的性能一项中剩 ...
- 决策树:ID3与C4.5算法
1.基本概念 1)定义: 决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系,树中每个节点代表的某个可能的属性值. 2)表示方法: 通过把实例从根结点排列到某个叶子结点来分类实例,叶子 ...
- Loj#6432「PKUSC2018」真实排名(二分查找+组合数)
题面 Loj 题解 普通的暴力是直接枚举改或者不改,最后在判断最后对哪些点有贡献. 而这种方法是很难优化的.所以考虑在排序之后线性处理.首先先假设没有重复的元素 struct Node { int p ...
- Luogu P2590 树的统计(树链剖分+线段树)
题意 原文很清楚了 题解 重链剖分模板题,用线段树维护即可. #include <cstdio> #include <cstring> #include <algorit ...
- 北邮校赛 H. Black-white Tree (猜的)
H. Black-white Tree 2017- BUPT Collegiate Programming Contest - sync 时间限制 1000 ms 内存限制 65536 KB 题目描述 ...
- 面向对象编程课程(OOP)第二单元总结
一.设计策略 第一次作业(傻瓜式电梯): 由于是第一次写多线程作业,许多的知识还处在理论阶段,所以第一次作业写得非常的朴实无华.整个程序总共有四个类,Main类负责通过电梯类实例化一个电梯,然后通过w ...