Docker系列文章--Docker容器内多进程管理(一)

来源:互联网 发布:真正的面向对象编程 编辑:程序博客网 时间:2024/06/15 03:53
                                                                                                     

本文转载自G云定制云订阅号“G云定制云”

目录

1、Supervisor介绍及原理

2、Supervisor配置与实例
3、参考文档



从Docker的设计初衷来看,它并不推崇在一个容器中运行多个进程,但在一些实际的场景,比如小规模应用、老业务容器化等,都可能需要在一个容器中,同时运行多个程序。


      在非容器的环境下,同时运行多个进程是非常简单的,系统初始化的时候,都会启动一个init进程,其余的进程都由它来管理。但在容器环境下就不一样了,因为它并没有init进程,所以大多数情况下,我们启动一个Docker容器,只让它运行一个前台程序,并且保证它不会退出,当容器检查到内部没有运行的前台进程之后,自己就会自动退出。


      换句话说启动Docker容器时不能运行后台程序,诸如在CentOS里面,service xxx start,这种后台启动进程的方式都不可用,因为没init进程。
那么有办法解决这个问题吗?


      目前主要有两个工具,一个是Supervisor,另一个是Monit。本篇先来介绍Supervisor,Monit会在之后的文章中再做详解。


一、Supervisor介绍及原理


      Supervisor是一个进程管理工具,是客户端/服务端结构,通过它可以监控和控制其他的进程,同时它自身提供了一个WebUI,对其管理的应用进程,可以在WebUI进行start,stop,restart操作。由Supervisor管理的进程,都是它的子进程。


在Linux系统启动之后,第一个启动的用户态进程是/sbin/init ,它的PID是1,其余用户态的进程都是init进程的子进程。Supervisor在Docker容器里面充当的就类似init进程的角色,其它的应用进程都是Supervisor进程的子进程。通过这种方法就可以实现在一个容器中启动运行多个应用。


以下是在容量里面看到的由Supervisor管理mysql-server和apache的进程情况


Docker系列文章--Docker容器内多进程管理(一)


二、Supervisor配置与实例


1、Supervisor安装


官网上提供了很多方法来安装Supervisor,本文介绍两种最常用的方法


Docker系列文章--Docker容器内多进程管理(一)


yum直接安装


Docker系列文章--Docker容器内多进程管理(一)


使用pip安装


Docker系列文章--Docker容器内多进程管理(一)


注意  使用pip安装Supervisor完成后需要pip install setuptools --upgrade升级setuptools工具,否则会有如下报错
[root@localhost ~]# echo_supervisord_conf > /etc/supervisord.conf
Traceback (most recent call last):
  File "/usr/bin/echo_supervisord_conf", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in <module>
    working_set.require(__requires__)
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: meld3>=0.6.5


2、Supervisord配置


      安装完成之后,首选需要创建一份supervisor的配置文件,通过echo_supervisord_conf生成一个配置文件模板,启动supervisor的时候,默认会在当前运行目录下寻找supervisord.conf,所以一般在启动的时候用-c指定配置文件。


Docker系列文章--Docker容器内多进程管理(一)


生成的配置文件模板,包括多段配置,下面就来逐段介绍,配置和含义
[unix_http_server]


Docker系列文章--Docker容器内多进程管理(一)


      这个配置段,配置http服务监听的 socket,它的作用是为了让supervisorctl 能连接supervisord  http server获取进程状态信息,包括管理子进程。file指定sock路径,把注释打开即可。

[inet_http_server]


Docker系列文章--Docker容器内多进程管理(一)


      Supervisor提供了一个WebUI的管理界面,如果需要打开的话,就在这个配置段设置,port指定监听ip和端口,username 和password指定访问WebUI需要的认证信息
[supervisord]


Docker系列文章--Docker容器内多进程管理(一)


Supervisor服务的配置项,上面已经很清楚了,包括了logfile,logfile_maxbytes等等,可以参考上面来配。
[supervisorctl]


Docker系列文章--Docker容器内多进程管理(一)


Supervisor的客户端程序supervisorctl的相关配置,注意serverurl对应的sock就是[unix_http_server]中file的配置项,如果上面配置了用户名密码,此处也需要配置


[program:theprogramname]
具体需要监控的程序配置项,通常不会直接定义在这里,往下看。
[include]


Docker系列文章--Docker容器内多进程管理(一)


指定包含的配置文件的路径,通常被监控的程序配置文件,会放在这个路径下,一个程序一个,比较清楚。

3、Program配置


      在Supervisord.conf中配置[include]下配置的files路径中,创建应用各自的program配置文件,举例官网http://www.supervisord.org/configuration.html 上的一个例子详细说明一下给参数的意义。

Docker系列文章--Docker容器内多进程管理(一)
Docker系列文章--Docker容器内多进程管理(一)
Docker系列文章--Docker容器内多进程管理(一)
Docker系列文章--Docker容器内多进程管理(一)


4、supervisor配置实例


      举例配置,如何用Supervisor管理httpd,和sshd两个服务
使用supervisor来管理多个进程,通常的做法是将每个进程都定义在一个单独的配置文件中,如果这类应用比较多的话,可以创建一个base镜像,在里面把基础环境和supervisor配置好,之后新加的应用只需要在写Dockerfile的时候,把被管理进程的配置文件拷贝到/etc/supervisor/目录即可,注意/etc/supervisor/目录的位置是supervisord.conf文件中[include]下files定义的路径。
创建一个Dockerfile,内容如下:


Docker系列文章--Docker容器内多进程管理(一)

Docker系列文章--Docker容器内多进程管理(一)


以下是supervisord.conf


Docker系列文章--Docker容器内多进程管理(一)
Docker系列文章--Docker容器内多进程管理(一)


以下是supervisord_sshd.conf文件内容


Docker系列文章--Docker容器内多进程管理(一)


以下是supervisord_httpd.conf文件内容


Docker系列文章--Docker容器内多进程管理(一)


将上面文件放在一个目录下,并编译镜像


Docker系列文章--Docker容器内多进程管理(一)


运行容器,注意-p后面映射的端口,在宿主机上必须没被占用


Docker系列文章--Docker容器内多进程管理(一)


容器启动之后,可以使用  宿主机ip:22  ssh访问容器
在web中打开http://宿主机IP:9001/  访问Supervisor的WebUI


Docker系列文章--Docker容器内多进程管理(一)


在这个页面中可以,对被管理的两个进程做一些常规的操作。


三、参考文档


http://www.supervisord.org/introduction.html


Docker系列文章--Docker容器内多进程管理(一)

KVM云技术社区微信群加入,联系北极熊:

Docker系列文章--Docker容器内多进程管理(一)


KVM云技术社区QQ群,99.99%纯技术交流气氛

QQ 1群:434720759(已满

QQ 2群:131961942,加入密码大写KVM

1000人VMWare技术交流群494084329,加入密码小写vm

OpenNebula QQ群:495571573 加入密码Nebula

2000人OpenStack开发纯技术群: 334605713 加入密码nova

Cloudstack纯技术交流群:515249455密码cs

2000人桌面云行业讨论: 484979056 加入密码大写VDI

2000超融合行业讨论群:65779632 加入密码大写HC

2000云技术招聘求职群: 279875515 加入密码hr




查看原文:http://www.zoues.com/2016/10/18/docker%e7%b3%bb%e5%88%97%e6%96%87%e7%ab%a0-docker%e5%ae%b9%e5%99%a8%e5%86%85%e5%a4%9a%e8%bf%9b%e7%a8%8b%e7%ae%a1%e7%90%86%ef%bc%88%e4%b8%80%ef%bc%89-2/
0 0
原创粉丝点击