背景:
之前在容器中启动多个程序时,将启动命令写到一个脚本中,然后执行脚本,又因为执行脚本后,就退出了,没有启动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应用都已启动成功。