搜索
❏ 站外平台:

容器:向死而生的一生

译者: 灵雀云 周小璐

| 2016-07-20 20:54   评论: 7 收藏: 2    

不能承受的容器之轻The unbearable lightness of being a container

就像 Linux 一样,可以用 kill 命令停止一个不正常或空闲的容器,并且无需注销或重启底层的服务器。Kill 命令会向容器中的主进程发送一个 SIGKILL 的 Linux 信号,同样 stop 命令会发送 SIGSTOP 的Linux 信号。这些在 Brian DeHamer 的文章中有详细的描述,本文将重点分析上图中其它的命令和事件:pause,OOM 和 destroy。 

暂停Making a pause

为什么要 pause 一个容器?好吧,你可能需要暂停一个拖慢进度的容器,或者想对这个容器做一下备份。 

有人预测 docker pause 未来可以用在容器的热迁移上。理论上,容器的热迁移是没有意义的,因为它们是无状态的,一次性的,还可以随时重启,但是…… 

避免“拥堵”Defending yourself from being choked

默认情况下,所有的容器都是平等的:它们享有同样的 CPU 周期和 IO,还能自由地使用内存。但某些情况下,我们需要用一些限制参数打破这种平等的待遇。比如,为了防止某些容器一直占用内存,造成 OOM(Out Of Memory)事件,“堵塞”服务器。但是,需要先去设置内存的限制。

首先我们来模拟下 OOM 的情景,来看下如果设置了内存限制,Docker Engine 是如何发挥作用的:


这个例子基于《Docker in Practice》一书中 301 的一个实例,在第一种情况下,被杀死的是进程(非主进程),而第二种情况下才是容器,为什么? 

健康检查Health checks that could save your container

要注意 Linux 内核在异常情况(比如资源不足)下只会 kill 一个进程,可能这样做已经太迟了。为什么不在应用出现问题前,提前检查呢?

在 Docker 1.12 中,不但可以在运行时进行限制,还能在启动容器时添加用户自定义的健康检查探针。比如,我们可以周期性地验证一个 web 服务是否在正常工作,而不仅仅是避免紊乱情况或内存溢出。

可以将健康检查作为 docker run 的选项,或写在 Dockerfile 中,docker ps 命令除了容器的常规状态,也会显示其“健康状况”。如下所示,第一次 docker ps 执行时,监控探针还是 starting 的状态,当第一个探针通过后变成 healthy 的状态。接下来我们用 docker inspect 查看容器的健康状况。我们通过删除一个配置文件制造不健康的假象,在一系列的探针失败后,最终容器被加上了 unhealthy 的标志。 

在当前的 Docker Engine 版本(1.12r3)中,容器不会在 unhealthy 的状态下重启,所以要检测容器的状态,手动地重启容器。


返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。