以Docker的观点来看,Supervisor的使用方法如下

因为我是Docker的新手,所以我会分享关于在使用Docker时如何使用Supervisor以及一些建议。

首先,「主管」是什么意思?

这篇文章或许会有所启发,但基本上是关于进程管理、守护进程化和持久化(如进程异常终止时自动重启等)的工具,这就是它的主题。

从Docker的角度来看,存在一个限制条件,即在Docker容器上,如果进程不在前台运行,容器就会终止。在这种情况下,当我们想要在一个容器上运行多个进程(例如Node + Mongo或Fluentd + Elasticsearch等)并且希望使它们持久化时,就会使用一个叫做Supervisor的工具。

请查看 supervisord.conf 的官方页面以获取选项信息。

基本用法

如果想要在supervisor上运行nginx,根据该案例研究,Dockerfile将如下所示。

FROM ubuntu:14.04

#Install nginx
RUN apt-get update && apt-get -y install nginx curl
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

#Install Supervisor and config
RUN apt-get install -y supervisor
RUN touch /etc/supervisord.conf
RUN echo '[supervisord]'  >> /etc/supervisord.conf
RUN echo 'nodaemon=true'  >> /etc/supervisord.conf
RUN echo '[program:nginx]' >> /etc/supervisord.conf
RUN echo 'command=nginx'   >> /etc/supervisord.conf

EXPOSE 80
CMD /usr/bin/supervisord -c /etc/supervisord.conf

[supervisord]和nodaemon=true的行是必需的,nodaemon=true的作用是使supervisor本身作为前台进程,防止Docker容器关闭。在command=中,需要写入在容器上持续运行nginx的命令,以确保nginx在容器中单独运行。

如果您认为Dockerfile需要简洁地编写,并且建议将配置文件存储在另一个文件中,那么您可以将以下内容写入名为supervisord.conf的文件,并在Dockerfile中将其放置在/etc/目录下即可。

[supervisord]
nodaemon=true

[program:nginx]
command=nginx

多进程的使用方法。

如果想在监控程序上运行Elasticsearch + Fluentd的案例研究中,Dockerfile的内容如下所示。

FROM ubuntu:14.04
RUN apt-get update -y

#Install Elasticsearch
ENV ELASTICSEARCH_VERSION elasticsearch-1.4.4
RUN apt-get install -y curl openjdk-7-jdk
RUN mkdir /opt/elasticsearch
RUN curl -sL "https://download.elasticsearch.org/elasticsearch/elasticsearch/${ELASTICSEARCH_VERSION}.tar.gz" | tar xz -C /opt/elasticsearch --strip=1

#Install Fluentd and plugins
RUN apt-get install -y libcurl4-openssl-dev git-core build-essential ruby-dev
RUN curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
COPY td-agent.conf /etc/td-agent/td-agent.conf
RUN ulimit -n 65536

#Install Supervisor and config
RUN apt-get install -y supervisor
RUN touch /etc/supervisord.conf
RUN echo '[supervisord]'  >> /etc/supervisord.conf
RUN echo 'nodaemon=true'  >> /etc/supervisord.conf
RUN echo '[program:elasticsearch]'             >> /etc/supervisord.conf
RUN echo 'command=/opt/elasticsearch/bin/elasticsearch' >> /etc/supervisord.conf
RUN echo '[program:td-agent]'             >> /etc/supervisord.conf
RUN echo 'command=/usr/sbin/td-agent' >> /etc/supervisord.conf

# expose port for elasticsearch
EXPOSE 9200

# expose port for fluentd
EXPOSE 24224

CMD /usr/bin/supervisord -c /etc/supervisord.conf

在Supervisor中需要注意的设置

关于每个进程的标准输出

默认情况下,Supervisor被设置为接收各个进程的标准输出并写入文件的配置。因此,通过Supervisor运行各个进程时,无法查看各个进程的标准输出内容。

如果想将内容输出到标准输出而不是文件中,可以将stdout_logfile设置为/dev/fd/1。例如,通过以下设置,来自td-agent进程的标准输出将通过(Supervisor作为中间环节)路由到整个系统的标准输出。

[supervisord]
nodaemon=true

[program:elasticsearch]
command=/opt/elasticsearch/bin/elasticsearch

[program:td-agent]
command=/usr/sbin/td-agent
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
bannerAds