前言
本讲是从Docker系列讲解课程,单独抽离出来的一个小节,重点介绍:Docker容器生命周期,虽然这知识点,平时开发很少用到,但是在运维过程中,看到相关服务状态,要了解这些状态具体是什么含义,我们一起来学习一下吧!
概述
一叶障目,不见泰山,我们就先从一叶,一叶的小细节开始吧,最后自然可以窥见泰山全貌,直至最后消灭容器,一切状态化为灰飞烟灭。
一、生命周期相关指令
1.docker kill和docker stop的区别与联系
相同点:两者都是停掉容器,并把容器状态指定到stopped。
不同点:
被kill杀死容器,进入stopped状态被重新start后,会开启新的进程号;
被stop停掉的容器,再次被重新start后,进程号不变,还是原来的。kill命令比较生猛,不管容器死活,直接给系统发送SIGKILL的系统信号强行kill掉进程,就是要用kill -9干掉容器;
stop比较温柔,先给容器发送一个TERM信号,给容器充足时间(默认10秒)保存数据,让容器自动安全停止运行,超时后再给系统发送SIGKILL的系统信号强行kill掉进程,最后转变为stop状态。
使用docker stop -t [s, default 10],可调整超时时间(docker stop -t 20 mynginx)
2.docker pause/ unpause 暂停和取消暂停(不太常用)
pause 暂停容器中所有的进程,状态为Pause(暂停对外提供服务)
unpause 取消暂停,将容器恢复为Up上线状态
使用场景:在各个容器之间调试时使用。
语法:docker pause
docker pause mynginx
二、生命周期演示
更好的展示效果,先停掉Docker服务
#service docker stop
或者
#systemctl stop docker
1.docker create 状态为create创建状态
docker create tomcat:8.5.46-jdk8-openjdk #创建容器(并没有启动)
docker ps #查看容器列表(只显示已启动的)
docker ps -a #查看所有容器(可以看到状态是Created的容器)
发现:create命令,创建容器后,#docker ps 并看不到该容器,因为ps命令不带任何任何参数时,只显示状态为Up的容器。此时的容器状态是Created。
2.docker start 状态为up上线状态
docker start bf88214f5f6d #根据容器id启动容器
docker ps #可以看到容器状态为up,已上线状态
发现:start命令后,容器状态由Created变为Up
3.docker pause/unpause 状态为pause暂停/上线状态
docker pause bf88214f5f6d #根据容器id启动容器
docker ps #可以看到容器状态为up(pause),已上线(暂停)状态
docker unpause bf88214f5f6d #取消暂停容器
docker ps
发现:pause命令后,容器状态从Up变为Paused;unpause命令后,状态又切回Up状态。
4.docker stop 停掉容器
docker stop bf88214f5f6d
docker ps -a
发现:stop命令后,容器状态从Up变为Exited,退出状态。
5.docker rm -f 强制删除容器
docker rm -f bf88214f5f6d
docker ps -a
发现:容器被rm命令移除后,docker ps -a 看不到任何容器。皮之不存毛将焉附?
三、泰山图,全貌
下图中,椭圆代表容器的状态,方块代表状态切换过程中,所产生的事件。
图片描述,形象具体,以椭圆为中心,仔细对照学习一下吧!
注:图片中左下有个菱形(restart policy should restart?)触发该事件的源头一般是,容器内存溢出等异常。该策略通过 docker run --restart=always时来控制;也可以在docker编排yml文件中配置。
尾言
本讲内容是从 Docker入门到进阶里面抽离出来的内容,从而使原文更加有序、重点突出。