【docker系列6】容器生命周期管理(下)

这是本专栏的第二部分:容器篇,共 6 篇,帮助你们由浅入深地认识和掌握容器。上一篇和本篇,我会为你介绍容器生命周期管理相关的内容,带你掌握容器生命周期。下面咱们一块儿进入第二篇的内容,主要涉及容器状态的变化。git

删除容器

上一篇已经介绍了容器的建立,暂停以及中止等操做,而且通常状况下即便容器被 stop 掉它仍然存在于机器上,经过docker ps -a仍然能够查看到其记录,而且可随时经过 docker start 将其从 Exited 的状态更换为 Running。github

那如何能够删除掉一个不须要的已经中止的容器呢?redis

使用 docker rm 便可。docker

仍然以一个实际例子入手:shell

(MoeLove) ➜  ~ docker run -d redis
516b4ac5d642e9766e40f5b41e4b8bbf3ebfcfcc8bd134dfea94a533678e8800
# 查询容器状态
(MoeLove) ➜  ~ docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS       NAMES
516b4ac5d642        redis               "docker-entrypoint.s…"   5 seconds ago       Up 4 seconds        6379/tcp    silly_merkle

先中止该容器,而后对它作删除操做:tcp

# 中止该容器
(MoeLove) ➜  ~ docker stop $(docker ps -ql)
do516b4ac5d642
# 查询状态已经为 Exited
(MoeLove) ➜  ~ docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
516b4ac5d642        redis               "docker-entrypoint.s…"   2 minutes ago       Exited (0) 5 seconds ago                       silly_merkle
# 删除容器
(MoeLove) ➜  ~ docker rm 516b4ac5d642 
516b4ac5d642
# 验证查询无结果
(MoeLove) ➜  ~ docker ps -a |grep 516b4ac5d642
(MoeLove) ➜  ~

是否还有其余方式呢?spa

有,能够在docker run或者docker create时,传递--rm的选项,以便在容器退出时可自动删除。rest

(MoeLove) ➜  ~ docker create --rm redis
998381d619b2e105043b169a2abb635d3ad8594c68fff52cbf5decb38496d80b
(MoeLove) ➜  ~ docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
998381d619b2        redis               "docker-entrypoint.s…"   4 seconds ago       Created                                 awesome_black
(MoeLove) ➜  ~ docker start $(docker ps -ql)
998381d619b2
(MoeLove) ➜  ~ docker ps -l                 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
998381d619b2        redis               "docker-entrypoint.s…"   21 seconds ago      Up 1 second         6379/tcp            awesome_black
(MoeLove) ➜  ~ docker stop $(docker ps -ql)
998381d619b2
(MoeLove) ➜  ~ docker ps -a |grep 998381d619b2

除此以外还有更方便的方式吗?code

有,能够用docker container prune直接批量删除所有已经中止的容器。component

(MoeLove) ➜  ~ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

当输入docker container prune后,会有个提示,输入 y 确认,则开始删除所有已中止的容器。

源码中的容器状态

前面的内容都是经过实践,让你体验到了如何管理容器的生命周期,如今咱们深刻源码来看看在源码中容器的状态。

关于容器状态相关的代码都在container/state.go

func (s *State) StateString() string {
    if s.Running {
        if s.Paused {
            return "paused"
        }
        if s.Restarting {
            return "restarting"
        }
        return "running"
    }


    if s.RemovalInProgress {
        return "removing"
    }


    if s.Dead {
        return "dead"
    }


    if s.StartedAt.IsZero() {
        return "created"
    }


    return "exited"
}

能够看到其中的 Created、Running、Paused、Exited 等状态,在前面的实验中都已经接触过了,没有涉及到的状态包括 Dead、 Removing 和 Restarting,其实 Removing 咱们也算接触过了,前面的docker rm执行过程当中便会将容器状态设置为 Removing,只不过过程比较快,因此不容易捕获到。

至于 Restarting 状态,是在docker run或者docker create可经过传递--restart参数来设置重启策略,在容器执行异常,或是 Docker 后台进程重启之类的状况下,会按照重启策略进行重启。

最后就是 Dead 状态了,这个状态多数时候是个中间状态,好比要删除容器的时候,会将其状态设置为 Dead,可是当删除过程失败,则容器会保持 Dead 状态了

总结

本篇介绍了容器的删除操做,以及经过源码展现了容器几种状态的关系:Paused 和 Restarting 时,容器的实际表现实际上是在 Running 的。

下图展现了容器各类状态间的切换关系,但愿能对你有所帮助。

在这里插入图片描述

相关文章
相关标签/搜索