如何在线升级Docker
发布网友
发布时间:2022-04-23 02:15
我来回答
共1个回答
热心网友
时间:2022-04-27 08:23
首先说一点,docker stop了,但是容器并不一定“没了”。
我理解的所谓的“没了”,就是指容器的进程不存在的。
所有的容器进程,都是docker daemon的子进程。当docker daemon直接挂了,容器的主进程(就是由Entrypoint或者CMD生成的那个进程),会有两种情况:
1. 直接消失。这种情况常见于CMD是/bin/bash的情形。直接消失的原因据我猜测是因为这是个有pty的进程,需要跟父进程(docker daemon)保持一定的联系。父进程挂了,这个子进程就直接没了。
2. 被1号进程托管(父进程变成了1号进程)。这种情况应该常见于CMD是sshd -D或者sleep 99999d的情况。
但是无论哪种情况,当docker daemon再次start时候,会直接去检查容器进程是不是running。如果running,那么清理容器遗留进程。这也就是为什么启动起来docker daemon,所有的容器都是关闭的原因了。
docker为什么要在启动时候关闭这些进程呢?他们running不好么?
根据我对docker源码的理解,docker不放心其他进程来管理。他一定要亲自管理这些容器,他是所有容器的父进程。这样有很多好处。最大的好处就是实时监控,一旦容器挂了,他立即可以知道,并重启(如果容器设置了restart=always的话)。
-----------------------------华丽的分割线-----------------------------------------
上面的只是铺垫,现在说正题:
我们的意愿是良好的。希望能够docker在线升级。我看来一个可能的解决方法就是,在docker daemon start的时候,去检查容器是不是running,如果running,那么清理容器遗留进程,接着再重新start容器。以保证仍然作为容器的父进程进行管理。当然,这就要求给docker新增这么一段代码以实现该功能。