PID=1与僵尸进程
当将jenkins搬进容器,该容器经常会停止响应,需要定时重启。但是在虚拟机中却并没有这种问题,通过ps aux发现,jenkins容器存在大量的僵尸进程。当僵尸进程占用大量的进程表空间时,就会无法启动新的进程。
在Linux系统中,PID为1的进程是特殊的,负责收割僵尸进程。虚拟机中,PID为1的进程通常是Systemd、SysVinit或upstart,它们能自动收割僵尸进程。在容器里,PID为1的进程通常是用户自己写的程序,可能并不会收割僵尸进程。
Docker Daemon
Docker Daemon可以收集容器的标准输出,然后通过syslog或json-file等log-driver处理。由于这个架构是中心化的,Docker Daemon会成为日志收集的瓶颈。
当容器的标准输出过多时,Docker Daemon不能及时处理,就会影响这个容器的正常运行;同时Docker Daemon对标准输出的处理会阻塞其他操作,比如docker ps和docker stop等命令。
常用进程管理工具
进程管理工具 |
---|
僵尸进程 | 重定向标准输出并自动 rotate | |
---|---|---|
S6 | 收割 | 支持 |
tini | 收割 | 不支持 |
systemd | 收割 | 支持,但为二进制 |
phusion-baseimages | 收割 | 不支持 |
daemontools | 不收割 | 支持 |
supervisor | 不收割 | 支持 |
S6包含s6-svscan、s6-supervise和s6-log等组件
在准备阶段,s6-overlay准备环境变量和创建s6工作目录/var/run/s6/services
当启动PID为1的s6-svscan时,它将管理该目录下的服务
s6-svscan -t0 /var/run/s6/services
为适应LAIN的需求,将Dockerfile的CMD写入/etc/services.d/app/run
阶段2
s6-overlay将/etc/services.d
目录的文件复制到s6-svscan运行时目录/var/run/s6/services
,然后出发对目录的搜索
s6-svscanctl -a /var/run/s6/services
阶段3
s6-supervise会监听SIGTERM信号,当接收到该信号后会运行/var/run/s6/services/app/finish