阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Docker容器内多进程管理(一)-Supervisor

98次阅读
没有评论

共计 2994 个字符,预计需要花费 8 分钟才能阅读完成。

导读 Docker 在设计时并不推崇在一个容器中运行多个进程,但在一些实际的场景中很多都可能需要在一个容器中,同时运行多个程序。在非容器的环境下系统初始化的时候,都会启动一个 init 进程,其余的进程都由它来管理,但容器环境下这种后台启动进程的方式都不可用。目前主要有两个工具,一个是 Supervisor,另一个是 Monit。本篇先来介绍 Supervisor,Monit 会在之后的文章中再做详解。

传统环境下同时运行多个进程非常简单,系统初始化启动一个 init 或者 systemctl 进程,其余的进程都由它来管理。在容器环境下没有 init 进程,启动一个 Docker 容器,只能让它运行一个前台程序。
那么有办法解决这个问题吗?

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

一、Supervisor 介绍及原理

Supervisor 是一个 C / S 架构进程管理工具,通过它可以监控和控制其他的进程,同时它自身提供了一个 WebUI,可以在 WebUI 进行 start,stop,restart 操作。由 Supervisor 管理的进程,都是它的子进程。

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

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

Docker 容器内多进程管理(一)-Supervisor

二、Supervisor 配置与实例
1、Supervisor 安装

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

Docker 容器内多进程管理(一)-Supervisor

yum 直接安装

Docker 容器内多进程管理(一)-Supervisor

使用 pip 安装

Docker 容器内多进程管理(一)-Supervisor

注意  使用 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 容器内多进程管理(一)-Supervisor

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

[unix_http_server]

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

[inet_http_server]

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

Docker 容器内多进程管理(一)-Supervisor

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

[supervisorctl]

Docker 容器内多进程管理(一)-Supervisor

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

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

[include]

Docker 容器内多进程管理(一)-Supervisor

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

3、Program 配置
在 Supervisord.conf 中配置 [include] 下配置的 files 路径中,创建应用各自的 program 配置文件,举例官网 http://www.supervisord.org/configuration.html 上的一个例子详细说明一下给参数的意义。
Docker 容器内多进程管理(一)-SupervisorDocker 容器内多进程管理(一)-Supervisor
Docker 容器内多进程管理(一)-Supervisor
Docker 容器内多进程管理(一)-Supervisor
4、supervisor 配置实例
举例配置,如何用 Supervisor 管理 httpd,和 sshd 两个服务
使用 supervisor 来管理多个进程,通常的做法是将每个进程都定义在一个单独的配置文件中,可以创建一个 base 镜像,在里面把基础环境和 supervisor 配置好,之后新加的应用只需要在写 Dockerfile 的时候,把被管理进程的配置文件拷贝到 /etc/supervisor/ 目录即可,注意 /etc/supervisor/ 目录的位置是 supervisord.conf 文件中 [include] 下 files 定义的路径。
创建一个 Dockerfile,内容如下:

Docker 容器内多进程管理(一)-SupervisorDocker 容器内多进程管理(一)-Supervisor

以下是 supervisord.conf

Docker 容器内多进程管理(一)-SupervisorDocker 容器内多进程管理(一)-Supervisor

以下是 supervisord_sshd.conf 文件内容

Docker 容器内多进程管理(一)-Supervisor

以下是 supervisord_httpd.conf 文件内容

Docker 容器内多进程管理(一)-Supervisor

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

docker build -t centos6.8/webserver:0.1

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

docker run -d -p 22:22 -p 9001:9001 -p 80:80 centos6.8/webserver:0.1

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

Docker 容器内多进程管理(一)-Supervisor

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

三、参考文档
http://www.supervisord.org/introduction.html

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计2994字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中