功能介绍

我们将会使用 detach 功能去实现创建完成容器后,mydocker 进程就会退出,但是容器依然继续运行的功能。

原理

容器,在操作系统看来,其实就是一个进程。当前运行命令的 mydocker 是主进程,容器是被当前 mydocker 进程 fork 出来的子进程。子进程的结束和父进程的运行是一个异步的过程,即父进程永远不知道子进程到底什么时候结束。如果创建子进程的父进程退出,那么这个子进程就成了没人管的孩子,俗称孤儿进程。为了避免孤儿进程退出时无法释放所占用的资源而僵死,进程号为 1 的进程 init 就会接受这些孤儿进程。
简而言之,当 mydocker 进程退出后,容器进程就会被进程号为 1 的 init 进程接管,这时容器进程还是运行着的,这样就实现了 mydocker 退出、容器不宕掉的功能。

实现

在 main-command.go 里面添加了 -d 标签,表示这个容器启动的时候在后台运行。
原本有个 parent.Wait() 用于父进程等待子进程结束,在添加了 -d 标签后,就不能再去等待,创建容器之后,父进程就已经退出了。因此,这里只是将容器内的 init 进程启动起来,就己经完成工作,紧接着就可以退出,然后由操作系统进程 ID 为 1 的 init 进程去接管容器进程。