Using Supervior with Docker

注意:如果你不喜欢使用sudo,那么你可以看看Giving non-root access

传统上的docker容器中一次只能运行一个进程,例如一次只运行一个Apache守护进程或SSH服务器守护进程一个进程。你经常遇到需要 在一个容器中运行多个进程的情形。有许多方法可以实现这一点,从使用简单的bash脚本来运行的CMD指令到安装进程管理工具。

在这个例子中,我们将要利用进程管理工具,Supervior,来管理我们容器中的多个进程。使用Supervior使我们能够更好地控制,管理, 和重新启动我们想要运行的进程。为了证明这一点,我们接下来要安装并管理的SSH服务进程和一个Apache守护进程。

创建Dockerfile

让我们先创建一个基本的Dockerfile来创建我们的新镜像。

  1. FROM ubuntu:13.04
  2. MAINTAINER examples@docker.com
  3. RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
  4. RUN apt-get update
  5. RUN apt-get upgrade -y

安装Supervisor

现在,我们可以安装我们的SSH和Apache,以及Supervisor在我们的容器中。

  1. RUN apt-get install -y openssh-server apache2 supervisor
  2. RUN mkdir -p /var/run/sshd
  3. RUN mkdir -p /var/log/supervisor

这里我们组装了一个包含Openssh-server,Apache2和supervisor(它提供了超级守护进程)的封装包。我们也创建了用来运行 我们SSH和Supervisor的两个新目录

添加Supervisor的配置文件

现在,让我们为Supervisor添加一个配置文件。默认的文件名为supervisord.conf,位于/etc/supervisor/conf.d/

  1. COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

让我们来看看supervisord.conf文件。

  1. [supervisord]
  2. nodaemon=true
  3. [program:sshd]
  4. command=/usr/sbin/sshd -D
  5. [program:apache2]
  6. command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"

supervisord.conf配置文件包含了配置Supervisor的指令和Supervisor用来管理进程的指令。第一部分[supervisord]为Supervisor本身的配置。 我们使用一个nodaemon指令,来告诉Supervisor以交互方式而非以后台进程方式运行。

接下来的两个部分用来管理我们要控制的服务。每个部分控制一个单独的进程。该部分包含一个command指令,指定用什么命令来启动每个过程。 (译者注:要运行什么指令按照相同格式添加即可

开放端口以及运行Supervisor

现在,让我们开放一些需要口,并指定当容器启动时要运行的CMD指令来结束Dockerfile文件。

  1. EXPOSE 22 80
  2. CMD ["/usr/bin/supervisord"]

在这里,当我们的容器启动时,会自动开放了容器的22和80端口,同时运行/usr/bin/supervisord命令。

创建我们自己的镜像

现在,我们可以创建我们的新镜像。

  1. $ sudo docker build -t <yourname>/supervisord .

启动我们的Supervisor容器

一旦我们创建了一个镜像,我们就可以从它启动一个容器。

  1. $ sudo docker run -p 22 -p 80 -t -i <yourname>/supervisord
  2. 2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in config file)
  3. 2013-11-25 18:53:22,312 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
  4. 2013-11-25 18:53:22,342 INFO supervisord started with pid 1
  5. 2013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 6
  6. 2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7
  7. . . .

我们已经使用docker run命令以交互方式启动一个新的容器。该容器已运行Supervisor,并启动了SSH和Apache后台进程。 我们已经指定了-p参数开放了端口22和80。通过这种方式我们可以确认我们开放的端口,并且通过这些端口连接到SSH和Apache后台进程。