动态

详情 返回 返回

Docker 入門私人筆記(八)使用 Supervisor 管理容器多進程 - 动态 详情

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 進程在前台啓動運行。
image.png

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

image.png

運行命令 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

Add a new 评论

Some HTML is okay.