【容器】关于docker容器中的init进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【容器】关于docker容器中的init进程相关的知识,希望对你有一定的参考价值。

参考技术A Docker在进程管理上有一些特殊之处,如果不注意这些细节中的魔鬼就会带来一些隐患。

Docker鼓励“一个容器一个进程(one process per container)”的方式。

这种方式非常适合以单进程为主的微服务架构的应用,然而由于一些传统的应用是由若干紧耦合的多个进程构成的,这些进程难以拆分到不同的容器中,所以在单个容器内运行多个进程便成了一种折衷方案。

此外在一些场景中,用户期望利用Docker容器来作为轻量级的虚拟化方案,动态的安装配置应用,这也需要在容器中运行多个进程,而在Docker容器中的正确运行多进程应用将给开发者带来更多的挑战。

tini是能想到的最简单的init。

tini一般在容器中运行,用于生成子进程,等待它退出,reap僵尸进程,并执行信号转发。

如果我使用docker容器init 进程,是不是就是容器的第一个进程?

init进程就是容器里的第一个进程。

容器里的第一个进程大部分情况应该是我们自己的进程,除非有容器用户有意识的去使用其他如果tini进程作为init进程。

init 进程自己退出,还是会调用do_exit()的。所以呢,为了保证子进程先收到转发的SIGTERM, 类似tini的做法是,自己在收到SIGTERM的时候不退出,转发SIGTERM给子进程,子进程收到SIGTERM退出之后会给父进程发送SIGCHILD, tini是收到SIGCHILD之后主动整个程序退出。

我们一直都是应用程序作为PID1来运行的,感觉用tini这种方式改动有点大!

信号对容器中进程的影响的多少,也有多方面的原因,比如程序本身对错误的容忍度比较高, 容器建立删除的频率不高,那么也就看不出有什么影响。

如果你的程序的容器化程度较高,几乎是一个容器一个进程的程度,那么不需要考虑用tini来做改动。

我觉得容器里的init进程,应该是具备这些信号处理的能力:

1. 至少转发SIGTERM给容器里其他的关键子进程。

2. 能够接受到外部的SIGTERM信号而退出,(这里可以是通过注册SIGTERM handler, 也可以像tini一样先转发SIGTERM 给子进程,然后收到SIGCHILD后自己主动退出)

3. 具有回收zombie进程的能力。

理解Docker容器的进程管理

https://www.cnblogs.com/ilinuxer/p/6188303.html

在entrypoint.sh中使用Tini的优势是什么?

https://zhuanlan.zhihu.com/p/59796137

从进程角度看docker容器

容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。

对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术则是用来修改进程视图的主要方法。

当 Docker 创建一个容器时,它会创建新的六种 namespace 的实例,然后把容器中的所有进程放到这些 namespace 之中,使得Docker 容器中的进程只能看到隔离的系统资源。

Linux Namespace的6大类型

类型 功能说明

  1. Mount Namespace 提供磁盘挂载点和文件系统的隔离能力
  2. IPC Namespace 提供进程间通信的隔离能力
  3. Network Namespace 提供网络隔离能力
  4. UTS Namespace 提供主机名隔离能力
  5. PID Namespace 提供进程隔离能力
  6. User Namespace 提供用户隔离能力

以上是关于【容器】关于docker容器中的init进程的主要内容,如果未能解决你的问题,请参考以下文章

关于docker容器和镜像的区别

Docker容器内多进程管理(草稿)

docker 命令详解:pause/unpause

Docker容器

Docker容器

来自守护进程的错误响应:无法停止容器 - 信号 init 进程导致“权限被拒绝”