背景:

  之前在容器中启动多个程序时,将启动命令写到一个脚本中,然后执行脚本,又因为执行脚本后,就退出了,没有启动1号进程(容器启动时需要保持Docker容器的1号进程始终运行,否则启动不成功),容器始终启动不起来,后来发现如果想运行多个程序的话,可以通过supervisord来操作,很容易实现。


Supervisor说明:

  Supervisor是由python语言编写,基于linux操作系统的一款服务器管理工具,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能。

  Supervisor要求管理的程序是非daemon程序,supervisord会帮你把它转成daemon程序。


简单操作如下:

Dockerfile:

FROM ubuntu:13.04
MAINTAINER ttxsgoto <1824841486@qq.com>
RUN apt-get update
RUN apt-get install build-essential libxml2 python-dev libmysqld-dev openssh-server supervisor nginx ssh -y
RUN pip install MySQL-python && pip install  Django==1.8.11
 
ADD serverinfo /data/www/serverinfo
ADD supervisord.conf /etc/supervisor/supervisord.conf
EXPOSE 8080 22 80

RUN /etc/init.d/ssh stop
RUN /etc/init.d/nginx stop

CMD ["/usr/bin/supervisord","-c","/etc/supervisor/supervisord.conf"]

supervisord.conf

[supervisord]
nodaemon=true  #前端进行模式

[program:nginx]
#command=nginx -g  "daemon off;"
command=/etc/init.d/nginx start

[program:ssh]
command=/etc/init.d/ssh start

[program:serverinfo]
command=python manage.py runserver 0.0.0.0:8080 #设置执行的命令
directory=/data/www/serverinfo                  #设置命令执行目录
stdout_logfile=/var/log/serverinfo.log          #设置日志文件
autostart=true                                  #是否随supervisord进程启动而启动,包括reloadconf
autorestart=true                                #当挂掉后,自动重启
redirect_stderr=true                            #是否重定向std err
stopsignal=QUIT                                 #被监控程序kill的信号

build&run

docker build -t ttxsgoto.supervisor/v2016 .   

docker run -it -d -p 8080:8080 -p 80:80 -p 2222:22 --name supervisor.v2016 ttxsgoto.supervisor/v2016

docker ps     #查看容器状态

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                                          NAMES
ee38e4aa48f8        ttxsgoto.supervisor/v2016          "/usr/bin/supervisor   4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8080->8080/tcp   supervisor.v2016

docker exec -it  ee38e4aa48f8 /bin/bash    #进入容器查看        

root@ee38e4aa48f8:/# netstat -nltp 
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      37/python       
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      29/nginx        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      34/sshd         
tcp6       0      0 :::80                   :::*                    LISTEN      29/nginx        
tcp6       0      0 :::22                   :::*                    LISTEN      34/sshd

此时启动的Django,nginx,ssh应用都已启动成功。