Supervisor 是一個 C/S 模式的進程管理工具。它使用 Python 開發。支持 Linux/Unix 系統,不支持 Windows 系統。它的功能包含監聽、啓動、停止、重啓一個或多個進程。用 Supervisor 管理進程,當一個進程掛掉並且被 supervisort 監聽到之後,可以自動將它重新拉起,即做到進程自動恢復的功能,不再需要寫 shell 腳本來控制。
實戰:製作 supervisor 鏡像
1. 新建 Dockerfile
cd /data/dockerfile/system/
mkdir centos-ssh-supervisor
cd centos-ssh-supervisor/
vim Dockerfile,Dockerfile 配置如下,對比前文中的製作的 docker 鏡像 system/centos:v2,本次僅在 Dockerfile 中增加了 supervisor 的安裝和啓動步驟:
#Base Image 指定基礎鏡像
FROM centos
#Maintainer 鏡像維護者的信息
MAINTAINER lu 13510182959@126.com
#Run
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y wget sudo git tree net-tools openssh-clients openssh-server openssh-devel supervisor && yum clean all
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key
#Set root password
RUN echo "root:lusibo@123" | chpasswd
#For supervisor
#已經提前準備好了現成的相關配置文件 supervisor.conf 和 sshd.ini 放到宿主機內,製作鏡像時從宿主機複製到鏡像內即可
ADD supervisord.conf /etc/supervisord.conf
ADD sshd.ini /etc/supervisord.d/sshd.ini
#Outside port
EXPOSE 22
#讓容器啓動後運行 supervisor
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
2. 準備配置文件 supervisord.conf
由於 supervisor 的配置文件 supervisord.conf 的內容非常多,為了製作鏡像方便以及編寫 Dockerfile 更省事,事先找一個測試機安裝一遍 supervisor(添加 elep 源後 yum 安裝即可),並獲取配置文件 supervisord.conf 放到宿主機內。也可以在網上搜索 supervisor.conf 的配置拿過來修改。在製作鏡像的過程中通過 Dockerfile 的 ADD 命令將配置文件複製到鏡像內即可。
3. 修改 supervisor.conf 和 編輯 sshd.ini
vim /etc/supervisord.conf
找到 nodaemon=false,改為 nodaemon=true ,使 supervisor 進程在前台啓動運行。
supervisor 最佳實踐:
vim /etc/supervisord.conf
找到如下配置內容:
[include]
files = supervisord.d/*.ini
這段代碼,可以方便的實現任何需要運行的進程的配置。如果希望 supervisor 管理哪個進程,就把該進程的配置寫成一個單獨的 ini 文件放到 /etc/supervisord.d/ 目錄下就行了。例如:對 sshd 的進程管理,可以在文件 /etc/supervisord.d/sshd.ini 中配置。類似 nginx 實例。
在 /etc/supervisord.conf 中找到如下代碼,這是 *.ini 的配置示例:
;[program:theprogramname]
;command=/bin/cat ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1 ; number of processes copies to start (def 1)
;directory=/tmp ; directory to cwd to before exec (def no cwd)
;umask=022 ; umask for process (default None)
;priority=999 ; the relative start priority (default 999)
;autostart=true ; start at supervisord start (default: true)
;autorestart=true ; retstart at unexpected quit (default: true)
;startsecs=10 ; number of secs prog must stay running (def. 1)
;startretries=3 ; max # of serial start failures (default 3)
;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT ; signal used to kill process (default TERM)
;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
;user=chrism ; setuid to this UNIX account to run the program
;redirect_stderr=true ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10)
;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false ; emit events on stdout writes (default false)
;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10 ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false ; emit events on stderr writes (default false)
;environment=A=1,B=2 ; process environment additions (def no adds)
;serverurl=AUTO ; override serverurl computation (childutils)
在 Dockerfile 的同級目錄內創建 sshd.ini 文件並配置:
vim /etc/supervisord.d/sshd.ini
[program:sshd]
command=/usr/bin/sshd -D
process_name=%(program_name)s
autostart=true
注意:
此時在目錄 /data/dockerfile/system/centos-ssh-supervisor 下應該有3個文件:
Dockerfile,sshd.ini,supervisord.conf
運行這個 Dockerfile 創建新的鏡像,此次將鏡像命名為 system/centos:v3:
docker build -t system/centos:v3 .
鏡像製作成功後,用它啓動一個容器:
docker run -d --name centos-ssh-supervisor -p 2222:22 system/centos:v3
通過 ssh 方式登錄這個容器:
ssh -p 2222 root@192.168.100.151
查看容器中運行的進程發現 PID 1 是 supervisord,這説明目的已經達到了。同時還能看到正在運行的 sshd 進程。
[root@2476182f0bce ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.3 115676 14804 ? Ss 07:54 0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 8 0.0 0.1 112864 4288 ? S 07:54 0:00 /usr/sbin/sshd -D
root 9 0.0 0.1 153152 5984 ? Ss 07:54 0:00 sshd: root@pts/0
root 11 0.0 0.0 15252 1992 pts/0 Ss 07:54 0:00 -bash
root 24 0.0 0.0 55172 1864 pts/0 R+ 07:57 0:00 ps aux
運行命令 supervisorctl status 可以看到 supervisor 目前管理了一個進程就是 sshd:
[root@2476182f0bce ~]# supervisorctl status
sshd RUNNING pid 8, uptime 0:09:54
附:來自網絡的案例,supervisor 配置可供參考如下:
為將要在docker內運行的的程序創建一個.conf文件,放在目錄"/etc/supervisor/conf.d/"下
[program:FileDown] ;程序名稱,終端控制時需要的標識
command=/usr/bin/filedown start ; 運行程序的命令
directory=/usr/bin/ ; 命令執行的目錄
autorestart=true ; 程序意外退出是否自動重啓
stderr_logfile=/var/log/filedown.err.log ; 錯誤日誌文件
stdout_logfile=/var/log/filedown.out.log ; 輸出日誌文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 進程環境變量
user=root ; 進程執行的用户身份
stopsignal=INT