【云计算】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 ...
随机推荐
- 错误:在maven install是抛出 “1.5不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符”
Maven默认用的是JDK1.5去编译 diamond运算符,有的书翻译为菱形,有的书写的是钻石语法,指的是JDK1.7的一个新特性 List<String> list = new Arr ...
- 嵌套循环连接(Nested Loops Joins)
The nested loops join, also called nested iteration, uses one join input as the outer input table(sh ...
- CodeVS1169 传纸条 [DP补完计划]
题目传送门 题目描述 Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端, ...
- 洛谷P4587 [FJOI2016]神秘数(主席树)
题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...
- 51nod 1201 (dp)
整数划分 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种.由于数据较大,输出Mod 10^9 + 7的结果即可. In ...
- Linux命令之rlogin
rlogin [-8EKLdx] [-e char] [-l username] host rlogin在远程主机host上开始一个终端会话. (1).选项 -8 选项允许进行8位的输入数据传送:否则 ...
- Flask实战第66天:celery实现异步任务
Celery文档:http://docs.celeryproject.org Celery 通过消息进行通信,用专用的工作线程不断监视任务队列以执行新工作. Celery需要消息传输来发送和接收消息. ...
- 【vim】mac配置vim,molokai配色
效果如下: 首先修改主目录下的.vimrc: "======================================================================= ...
- Redux 源码自己写了一遍
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content ...
- POJ 3378 Crazy Thairs(树状数组+DP)
[题目链接] http://poj.org/problem?id=3378 [题目大意] 给出一个序列,求序列中长度等于5的LIS数量. [题解] 我们发现对于每个数长度为k的LIS有dp[k][i] ...