使用supervisord管理容器进程

Docker可以在启动容器的时候通过设置Dockerfile中的CMD条目启动一个进程,但如果要在容器中同时启动多个进程,就需要使用进程管理工具了。supervisord(http://supervisord.org/introduction.html)是一个非常优秀的进程管理工具,使用Python开发。它可以在类UNIX系统的方式让用户来准确地监视和控制后台一定数量的服务进程。并作为一个天使进程让后台进程在当发生内部错误退出、或者进程被意外杀死时自动重启。除此之外,supervisord可以监控TCP端口,让其他主机通过客户端了命令supervisorctl通过HTTP协议直接对Server端进程进行启停,避免让进程/服务器管理者直接接触Shell或root用户。进程之间也有一个优先级和进程组关系,让管理员使用start all和stop all的关系来启动。

安装和配置

在ubuntu下通过apt-get安装supervisor:

配置文件内容如下

启动supervisor

配置进程

参数文件中,进程的相关配置如下:

下面由Supervisord启动redis服务

配置supervisord.conf,设置redis-server为autostartautorestart

使用supervisorctl

supervisorctl命令行选项:
-c, --configuration 配置文件路径 (default /etc/supervisord.conf)
-h, --help 帮助信息
-i, --interactive 启动一个交互式shell
-s, --serverurl URL 指定supervisor服务监听地址 (默认 “http://localhost:9001”).
-u, --username 用户名
-p, --password 密码
-r, --history-file

如果readline可用,指定一个readline历史文件
如果使用-i选项或者不指定后面的动作(如start,stop,tail等),那么会出现一个交互式页面。
在另一个主机来操作进程:

Docker中的Supervisor

编辑Dockerfile

其中,在当前目录新建一个supervisord.conf,由于是CMD执行,supervisord不用以daemon的形式启动。

下面构建这个image

运行测试:

参考:
http://supervisord.org/configuration.html
http://yeasy.gitbooks.io/docker_practice/content/cases/supervisor.html

Posted in Ops, Tools, Virtualization.