背景:

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

Supervisor说明:

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

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

简单操作如下:

Dockerfile:

FROM ubuntu:13.04MAINTAINER ttxsgoto <1824841486@qq.com>RUN apt-get updateRUN apt-get install build-essential libxml2 python-dev libmysqld-dev openssh-server supervisor nginx ssh -yRUN pip install MySQL-python && pip install  Django==1.8.11 ADD serverinfo /data/www/serverinfoADD supervisord.conf /etc/supervisor/supervisord.confEXPOSE 8080 22 80RUN /etc/init.d/ssh stopRUN /etc/init.d/nginx stopCMD ["/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进程启动而启动,包括reloadconfautorestart=true                                #当挂掉后,自动重启redirect_stderr=true                            #是否重定向std errstopsignal=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                                                          NAMESee38e4aa48f8        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 nametcp        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应用都已启动成功。