xianlubird / mydocker

<<自己动手写docker>> 源码

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

第五章 针对docker daemon退出导致容器关闭的疑问

yybear opened this issue · comments

书不在身边,凭记忆描述下问题:
第五章 第一节说docker daemon退出会导致容器关闭,原因是容器都是docker deamon fork出来的。
然后说1.12? 之后做了改进(runc?),docker daemon退出不会导致容器退出了,然后借着mydocker的代码说了下原理,大体就是docker daemon退出后容器进程会被init接管,所以不会退出。

那么问题来了,我的理解子进程在父进程退出后被init接管,这个是linux本身就自带的机制,那么为什么1.12?之前的docker daemon反而能忽略这个机制,自己退出了还顺带把子进程也搞退出呢?

请指教,谢谢!

这里涉及很多状态管理的问题,如果Docker退出了容器还在运行,容器后续的状态变化Docker就无法感知到,在再次启动后就会导致不预期的问题,Docker 在1.12后才加入很多启动后restore的机制,所以才允许了容器在Docker退出后继续运行,但也是需要再daemon中手动打开'live-restore'选项。

@BSWANG 我是想知道为什么daemon退出能把它的子进程(容器进程)搞退出。我对这块不熟悉,搜了下好像父进程退出子进程跟着退出不是很容易能做到的。我就是想知道docker daemon是怎么做到这点的,书上面一句容器会跟着docker daemon一起退出,因为容器进程是docker daemon fork出来的,没有讲明白,希望你能详细的讲解下其中的机制

没有打开live-restore之前,Docker在停止的时候会停止Docker所管理的容器