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 [email protected]
#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 [email protected]
查看容器中运行的进程发现 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