背景:
之前在容器中啓動多個程序時,將啓動命令寫到一個腳本中,然後執行腳本,又因爲執行腳本後,就退出了,沒有啓動1號進程(容器啓動時需要保持Docker容器的1號進程始終運行,否則啓動不成功),容器始終啓動不起來,後來發現如果想運行多個程序的話,可以通過supervisord來操作,很容易實現。
Supervisor說明:
Supervisor是由python語言編寫,基於linux操作系統的一款服務器管理工具,用以監控服務器的運行,發現問題能立即自動預警及自動重啓等功能。
Supervisor要求管理的程序是非daemon程序,supervisord會幫你把它轉成daemon程序。
簡單操作如下:
Dockerfile:
FROM ubuntu:13.04 MAINTAINER ttxsgoto <[email protected]> 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應用都已啓動成功。