系列文章目录
本系列主要分为以下六大部分,正在更新中,尽请期待!
- 『 云原生·生之门』
- 『 云原生·前置知识』
- 『 云原生·Docker』
- 『 云原生·Kubernetes』
- 『 云原生·KubeSphere』
- 『 云原生·DevOps』
提示:已经更新的或正在更新的文章前面打勾了哈!
前言
经过前两篇对容器基本命令的学习,相信大家对于容器的命令已经非常熟悉了,本篇将继续带大家了解一些容器的高级使用命令。
一、容器的生命周期
对于一个Docker容器可以具有以下状态:
- created:初建状态
- running:运行状态
- stopped:停止状态
- paused: 暂停状态
- deleted:删除状态
接下来我们使用之前学习的Docker命令来对这些容器状态进行一个演示:
- 使用
docker container run
新建一个容器,名称为text
docker container run --name text -it ubuntu:latest /bin/bash
接下来我们对容器进行操作,在容器内部 Shell 中,执行下面的步骤来将部分数据写入到 tmp 目录下的某个文件中,并确认数据是否写入成功
d tmp
ls -l
echo "DevOps FTW" > newfile
ls -l
cat newfile
如下:
按 Ctrl-PQ 组合键退出当前容器。
- 现在使用
docker container stop
命令来停止容器运行,切换到暂停状态
docker container stop text
现在运行 docker container ls
命令列出全部处于运行中状态的容器。我们会发现新建的容器没有在上面的列表中出现,说明暂停成功了,如下:
- 使用
docker container start
命令可以将容器重新启动
docker container start text
然后我们在使用 docker container ls
命令列出全部处于运行中状态的容器,会发现我们常见的text容器又在运行状态了,如下:
- 现在我们使用
docker container exec
命令连接到重启后的容器,确认一下之前创建的文件是否还存在
docker container exec -it text bash
#进入目录查看
cd tmp
ls -l
cat newfile
如下:
我们惊奇的发现之前创建的文件依然存在,并且文件中包含的数据正是离开的数据。
这证明停止容器运行并不会损毁容器或者其中的数据。
- 现在停止该容器并从系统中删除它。
- 通过在
docker container rm
命令后面添加-f
参数来一次性删除运行中的容器是可行的。 - 但是,删除容器的最佳方式还是分两步,先停止容器然后删除。这样可以给容器中运行的应
用/进程一个停止运行并清理残留数据的机会。
docker container stop text
docker container rm text
然后我们使用docker container ls -a
命令查看所有的容器,发现没有text了,说明我们已经成功删除了
总结一下容器的生命周期。可以根据需要多次停止、启动、暂停以及重启容器,并且这些操作执行得很快。但是容器及其数据是安全的。直至明确删除容器前,容器都不会丢弃其中的数据。就算容器被删除了,如果将容器数据存储在卷中,数据也会被保存下来。
二、容器的重启策略
docker的容器运行后并不会是永远就运行了,这和宿主机的资源分配等等都有关系,各种意外会导致容器意外退出,手动重启容器肯定是非常愚蠢的一件事情。那么,我们是应该有一套针对容器意外退出的补救策略了(也就是重启策略)。
通常建议在运行容器时配置好重启策略。这是容器的一种自我修复能力,可以在指定事件或者错误后重启来完成自我修复。
重启策略应用于每个容器,可以作为参数被强制传入 docker-container run
命令中或者在Compose文件中声明(在使用 Docker Compose以及 Docker Stacks的情况下)容器支持的重启策略包括 always
、unless-stopped
和on-failed
。
Docker容器的重启策略如下:
-
always
:在容器退出时总是重启容器,直到正常; -
unless-stopped
:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器,也就是说,如果docker的守护进程启动后,然后因为一些其它原因导致容器退出,将不会重启容器; -
on-failure
:在容器非正常退出时(退出状态非0),才会重启容器,------退出状态码非0的时候重启,直到状态码为0为止,不限次数的重启;
三、快速清理容器
这种处理方式会强制删除所有的容器,并且不会给容器完成清理的机会。但是咬住哟这种操作一定不能在生产环境系统或者运行着重要容器的系统上执行。
在 Docker 主机的 Shell 中运行下面的命令,可以删除全部容器。
docker container rm $(docker container ls -aq) -f
解释一下这个命令为什么可以删除全部容器:
-
该命令的工作方式就跟用于删除某台 Docker 主机上全部容器的命令
rm $(docker image ls -q)
一样,docker container rm
命令会删除容器。 -
如果将
$(docker container ls -aq)
作为参数传递给docker container rm
命令,等价于将系统中每个容器的 ID 传给该命令。 -
-f
标识表示强制执行,所以即使是处于运行状态的容器也会被删除。接下来,无论是运行中还是停止的容器,都会被删除并从系统中移除。
上面的命令在 Windows Docker 主机的 PowerShell 终端内同样生效。
看看本专栏文章有哪些吧!
本系列文章目录:
- 『 云原生·生之门』
- 『 云原生·前置知识』
- 『 云原生·Docker』
- 『 云原生·Kubernetes』
- 『 云原生·KubeSphere』
- 『 云原生·DevOps』
可以看出来本系列文章将会带你从-1到1的学习云原生的,一起加油吧!
总结
容器是直接提供应用服务的组件,也是 Docker整个技术栈中最为核心的概念。围绕容器,Docker提供了十分丰富的操作命令,允许用户高效地管理容器的整个生命周期。