为什么说容器是单进程模型?
在继续讲解之前,我介绍几个概念:
- 父进程:父进程拥有一系列的子进程。
- 子进程:父进程所管理的进程称为子进程。当一个子进程结束时,正常的情况下,父进程会对子进程进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)。
- 僵尸进程:当一个子进程终止时,其父进程没有对其进行善后处理,此时我们称这个子进程为僵尸进程。僵尸进程会一直等待父进程来处理自己,如果父进程没有对其进行处理,会造成资源的浪费。
- 孤儿进程:一个进程都有一个父进程来管理(系统进程除外),如果父进程在子进程结束之前终止,那么我们就称这个子进程为孤儿进程(失去了父亲)。
我们说 Docker 容器是”单进程模型”,并不代表容器只能运行一个进程,而是指容器没有回收孤儿进程的能力。
通常容器会起一个/bin/sh 进程(称为容器的 1 号进程),如果我们继续在容器中创建进程,那么新的进程都是这个 1 号进程的子进程。Docker 判断一个容器是否启动正常,是判断 Docker 容器的 1 号进程的状态,如果 1 号进程启动正常,那么就认为容器运行正常,否则,容器运行失败。
因此,如果在容器内部启动了过多的进程,那么当容器的 1 号进程结束之后,由于 1 号进程不具有管理多进程,多线程的能力,所以在容器内部创建的其他进程都会处于没有人接管的状态,此时这些进程都会变为孤儿进程。