docker容器内多进程的管理方案

时间 2015-05-08 00:00:00                                               涯余                         
原文                   http://yayua.github.io/docker/container-process-monitor/            
主题                 Docker                 多进程            

容器生来适合的是以单进程为主的独立的微服务架构,而很多传统的组件则是体积庞大,多 个进程(组件)之间难以拆分到不同的容器中,所以在单个容器内部署多个组件便成了一种 暂时的折衷方案。这便引入了一个问题:如何在容器内管理多个进程?

综述

总的来说,至少有三种方式可选:

  1. 通过      romote api 进行远程      attach 。通过      http 的方式来远程执行命令
  2. 使用一个      init 程序作为容器的主进程,所有组件都作为此程序的子进程
  3. 不虚拟      PID 的      namespace

这几种方式各有优劣,下面将分别进行详述。

Remote Attach

Docker Remote API 提供了两种进行    Remote Attach 的方式,一是通过    POST 的方式,另 一种是通过    Websocket 协议。    Websocket 是构建于    HTTP 之上的一种协议,比较适合于双 向通信。可惜的是,二者的文档都很少,很难完整地实现一个简单,可靠的客户端,不过总 的来说,    websocket 要比    POST 方便很多,这里有一个简单的客户端实现    docker-ws-client ,可以远程发送命令 并执行。

这个程序只能用来进行简单的演示,在生产环境几乎是不可用的。主要问题如下:

  1. 要想命令被执行,容器内必须有一个      bash 程序存在,生产环境用的容器很少会需要在 里面放一个      bash 程序
  2. 对于一些命令输出为交互式的来说(比如      top ),在执行了这些程序之后,会干扰到后续 命令的执行,一般只能通过重启容器解决。
  3. 远程发送命令的执行结果会和其他容器内程序的输出相混淆。这就意味着      docker logs 的输出里会混杂每次远程命令执行的结果,远程命令的结果里也会混杂着其他的程 序的输出,导致无法获取精确的信息
  4. 返回结果里附带了一行命令提示符,这是      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 程序的 生命周期和容器是一样的,就符合了单进程的模型,虽然可能不是那么轻量级。

这也是最适合生产环境中的一种方式。当然长期来说,能将各种传统服务转为微服务架构最 好,但在这个过渡期,或者对一些转换代价比较大的服务来说,这是最为稳定和可控的一种 方式。其主要优点如下:

  1. 不用再写脚本。脚本是容器内启动多个进程最为简单也是问题最多的一种方式。信号传 递、进程监控、容易引起僵尸进程、后台程序的处理……引发的问题非常多。
  2. 管理进程的通用性。      Supervisor 这类开源组件已经说明管理进程完全可以做的非常通 用,通过配置文件的定制,这个程序完全可以跑在所有需要多进程的容器内。
  3. 复用性。如果要自己开发这个程序,完全可以用到很多已有的经验,毕竟容器内的环境 非常类似于物理机上。已有平台的监控方式,在容器里几乎是一样的,这能大大减少开 发难度。

总之,对于简单的使用案例,可以尝试    Supervisor 这类开源组件。而对于有能力的公司, 则推荐在已有经验上开发一个新的管理程序。

Host PID Namespace

这种情况不再对容器内的PID进行虚拟,即    docker top 和在容器内执行    top 命令看到的 都是进程的实际PID。这样做的好处是原有的监控方案可以直接拿过来用,比如状态查看, 杀死进程等,不好的地方就是如果需要拉起的话则是在容器外做不到的,因为拉起一般都是 通过可执行文件的路径来做的,而容器的文件系统是虚拟的,所以基本上无法实现。

这种方式也是不推荐的。我们使用容器,最终也是为了虚拟化,所以在不影响性能的情况下, 应该进行将各部分都虚拟出来,这样最不容易出问题。如果虚拟网络性能不好,我们可以先 不用虚拟网络,但是其他的部分如果不是因为性能原因,还是尽量通过其他可能的途径去解 决问题,而不是破坏环境的一致性。

链接

  1. Docker Remote API v1.18

参考资料:

Docker 和 PID 1 僵尸进程问题:http://www.oschina.net/translate/docker-and-the-pid-1-zombie-reaping-problem

docker容器内多进程的管理方案:http://www.tuicool.com/articles/2677VfR

Using Supervisor with Docker:https://docs.docker.com/engine/admin/using_supervisord/

Supervisor的安装与使用入门:http://www.tuicool.com/articles/Ejm2u2

Linux后台进程管理利器:supervisor:http://www.liaoxuefeng.com/article/0013738926914703df5e93589a14c19807f0e285194fe84000

使用Supervisor简化进程管理工作:http://www.tuicool.com/articles/UZ3uUb

dumb-init:一个Docker容器初始化系统:https://www.infoq.com/cn/news/2016/01/dumb-init-Docker

Docker.io init.d script not working on start container:http://stackoverflow.com/questions/26938684/docker-io-init-d-script-not-working-on-start-container

runit - a UNIX init scheme with service supervision:http://smarden.org/runit/

【云计算】Docker 多进程管理方案的更多相关文章

  1. 【云计算】Docker多进程管理方案-cfengine && supervisord

    docker容器内多进程的管理方案 时间 2015-05-08 00:00:00 涯余 原文  http://yayua.github.io/docker/container-process-moni ...

  2. 云计算Docker全面项目实战(Maven+Jenkins、日志管理ELK、WordPress博客镜像)

    2013年,云计算领域从此多了一个名词“Docker”.以轻量著称,更好的去解决应用打包和部署.之前我们一直在构建Iaas,但通过Iaas去实现统一功  能还是相当复杂得,并且维护复杂.将特殊性封装到 ...

  3. docker集成管理工具-shipyard的开发环境搭建笔记

    前段时间一直在研究openstack,后来老师告诉我需要用docker容器来搭建hadoop集群,所以就将战场转移到docker上来了,话说docker最近这段时间太火了,但是说实话我觉得应用起来还不 ...

  4. Docker日志管理--docker部署安装ELK (十一)--技术流ken

    Docker logs 对于一个运行的容器,Docker 会将日志发送到 容器的 标准输出设备(STDOUT)和标准错误设备(STDERR),STDOUT 和 STDERR 实际上就是容器的控制台终端 ...

  5. 优秀的云计算工程师需要学什么?云计算Docker学习路线

    云计算工程师要学什么?随着互联网的快速发展,云计算这个词大家并不陌生,但是云计算究竟是做什么的,想要从事云计算要学习什么,很多都不知道,那么今天就给大家讲一下云计算. 云计算是基于互联网的相关服务的增 ...

  6. docker 日志管理

    高效的监控和日志管理对保持生产系统持续稳定地运行以及排查问题至关重要. 在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要.考虑到容器短暂和不固定的生命周期,当我们需 ...

  7. 你必须知道的容器日志 (2) 开源日志管理方案 ELK

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<你必须知道的容器日志(1)>中介绍了Docker自带的log ...

  8. docker 进程管理

    详文:理解Docker容器的进程管理:https://yq.aliyun.com/articles/5545 在Docker中,每个Container都是Docker Daemon的子进程. dock ...

  9. 体验SpringBoot(2.3)应用制作Docker镜像(官方方案)

    关于<SpringBoot-2.3容器化技术>系列 <SpringBoot-2.3容器化技术>系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更 ...

随机推荐

  1. react篇章-React 组件-ES6 class 来定义一个组件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  2. TCP的那些事-2

    这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇<TCP的那些事儿(上)> 上篇中,我们介绍了TCP的协议头.状态机.数据重传中的东西.但是TCP要解决一个很大的事,那就是要 ...

  3. java8新特性——接口中的静态方法与默认方法

    以前我们知道,接口中的方法必须时抽象方法,而从 java8 开始接口中也可以有方法的实现了,叫做默认方法. 一 .默认方法(default修饰) 在 java8 中,因为存在函数式接口,一个接口中只能 ...

  4. UVALive 6907 Body Building

    题目链接:https://vjudge.net/problem/UVALive-6907 题意: 给出一张图,判断这张图中有多少个哑铃,哑铃判断的条件是,对于一个连通图:如果找到一条边连接这两个点的个 ...

  5. 理解面向消息中间件及JMS 以及 ActiveMQ例子

    为了帮助你理解ActiveMQ的意义,了解企业消息传送背景和历史是很重要的.讨论完企业消息传送,你将可以通过一个小例子了解JMS及其使用.这章的目的是简要回顾企业消息传送及JMS规范.如果你已经熟悉这 ...

  6. SpringBoot返回结果如果为null或空值不显示处理方法

    第一种方法:自定义消息转换器 @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter{ // /** // * ...

  7. [转][Android] ListView中getView的原理+如何在ListView中放置多个item

      ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果 ...

  8. MYSQL学习笔记 (二)对数据库结构的增删改查

    显示数据库 show databases; 选择数据库 use database;//其实database为数据库的名字 创建表 create table tbclass( id int not nu ...

  9. WebDriver工作原理

    http://www.cnblogs.com/timsheng/archive/2012/06/12/2546957.html 通过研究selenium-webdriver的源码,笔者发现其实webd ...

  10. 函数中的 arguments 对象

    JavaScript函数具有像数组一样的对象,这些对象称为arguments,与传递给函数的参数相对应.传递给JavaScript函数的所有参数都可以使用arguments对象来引用. 现在我们开始学 ...