use*_*095 33 supervisord docker
我不是在询问使用码头工人的主管,而只是想让我的理解得到验证.
我知道docker在运行时会运行一个进程.此外,当我们需要在容器内运行多个进程时,使用supervisor.
我看过几个例子,其中一个容器是从基本映像启动的,并且安装了几个服务,并且容器被提交以形成一个新的映像,所有这些都没有supervisor.
所以,我的基本疑问是两种方法之间的区别.
我的理解是当docker容器停止时它向PID进程发送一个kill信号,PID 1管理子进程并停止所有的子进程,这正是supervisor所做的,而我们可以安装多个进程而不需要supervisor 发出docker run时可以运行进程,当容器停止时,只有PID 1发送信号,其他正在运行的进程不会正常停止.
请确认我对使用supervisord的理解是否正确.
谢谢
Von*_*onC 51
虽然我们可以在没有主管的情况下安装多个进程,但是当发出docker run时只能运行一个进程,当容器停止时,只有PID 1将被发送信号,而其他运行进程将不会正常停止.
是的,虽然它取决于主进程的运行方式(前台或后台),以及它如何收集子进程.
这就是在"详细捕获信号Docker容器 "
docker stop通过发送SIGTERM信号来停止正在运行的容器,让主进程处理它,并在宽限期后使用SIGKILL终止应用程序.发送到容器的信号由正在运行的主进程(PID 1)处理.
如果应用程序位于前台,意味着应用程序是容器(PID1)中的主要进程,它可以直接处理信号.
但:
要发信号的过程可能是背景过程,您无法直接发送任何信号.在这种情况下,一种解决方案是将shell脚本设置为入口点,并协调该脚本中的所有信号处理.
" Docker和PID 1僵尸收割问题 "中进一步详述了该问题
Unix的设计方式是父进程必须显式"等待"子进程终止,以便收集其退出状态.僵尸进程一直存在,直到父进程使用
waitpid()系统调用系列执行此操作.在子进程上调用waitpid()以消除其僵尸的动作称为"收割".
该
init过程- PID 1 -有一个特殊的任务.它的任务是"采用"孤儿子进程.
操作系统也希望init进程能够收获被收养的子进程.
Docker问题:
我们看到很多人只在他们的容器中运行一个进程,他们认为当他们运行这个单一进程时,他们就完成了.
但最有可能的是,这个过程并不像正确的init进程那样编写.
也就是说,而不是正确地收获所采用的流程,它可能期望另一个init流程来完成这项工作,这是正确的.
使用图像phusion/baseimage-docker帮助管理一个(或多个)进程,同时保持主进程符合init.
它用于runit代替supervisord,用于多进程管理:
Runit不在那里解决收割问题.相反,它是支持多个流程.鼓励多个进程用于安全性(通过进程和用户隔离).
Runit使用的内存比Supervisord少,因为Runit是用C编写的,而Supervisord是用Python编写的.
在某些用例中,容器中的进程重新启动优于整个容器重新启动.
该图像包含一个处理"收割"问题的my_init脚本.
在baseimage-docker中,我们鼓励在单个容器中运行多个进程.但不一定是多种服务.
逻辑服务可以包含多个OS进程,我们提供了轻松实现这一功能的工具.
Von*_*onC 17
2016年9月更新码头1.12(2016年第4季度/ 2017年第1季度)
[]刚刚合并:有了
docker run --init,Rick Grimes会照顾你所有的僵尸.
参见PR 26061:" 为僵尸战斗和信号处理添加初始化过程 "(和PR 26736)
这增加了一个小的C二进制文件来对抗僵尸.它安装在/ dev/init下,并预先添加到用户指定的args中.您可以通过守护程序标志dockerd --init启用它,因为默认情况下禁用向后compat.
您还可以覆盖守护程序选项,或者在每个容器的基础上指定它
docker run --init=true|false.您可以通过运行像这样的进程作为容器中的pid 1来测试这一点,并查看容器在运行时出现的额外僵尸.
int main(int argc, char ** argv) {
pid_t pid = fork();
if (pid == 0) {
pid = fork();
if (pid == 0) {
exit(0);
}
sleep(3);
exit(0);
}
printf("got pid %d and exited\n", pid);
sleep(20);
}
Run Code Online (Sandbox Code Playgroud)
该码头工人守护现在有选项
--init
Run Code Online (Sandbox Code Playgroud)
在容器内运行init以转发信号并收集进程
| 归档时间: |
|
| 查看次数: |
22144 次 |
| 最近记录: |