Docker 实战笔记:容器

Docker 容器之基本命令

$ docker container run #启动新容器的命令,可按需求内嵌参数
Ctrl+PQ #断开Shell和容器终端的命令,退出之后保持容器的运行状态
$ docker container ls #列出当前主机处于运行状态的容器
$ docker container ls -a #列出当前主机所有的容器,运行状态和停止状态都会被显示
$ docker container stop #停止容器
$ docker container start #启动容器
$ docker container rm #删除已经停止运行的容器
$ docker container inspect #显示容器的配置细节和运行时信息

初探容器

下面展示了一些 Docker 的基本操作,帮助我们从0到1学习这项伟大的技术!

$ docker image ls #查看当前主机的镜像
$ docker container run -it ubuntu:latest /bin/bash #拉取镜像并启动容器,-it参数表示切换到容器的shell
root@e1sdk4e81486:ps -elf #查看容器内进程

需要注意的是,此时在容器内使用ps -elf查看进程的命令,会显示两个UID都是root的进程。在我的运行环境上,PID1代表的是/bin/bash进程,该进程是通过docker container run命令来通知容器运行的;PID10代表的是ps -elf进程,查看当前运行中进程所使用的命令。但是当ps命令退出之后,就意味着容器内长期运行的进程其实只有/bin/bash

通过Ctrl-PQ组合键,可以在退出容器的同时还保持容器的运行,此时 shell 就已经返回到 docker 主机(指宿主机)终端;依旧可以通过使用docker container ls查看当前 docker 主机内全部处于运行状态的容器。

$ docker container ls #查看当前主机正在运行的容器

执行docker container exec命令,可以将当前 docker 主机的 Shell 连接到指定运行中的容器终端:

$ docker container exec 容器名/ID bash #所属ID可以通过`docker container ls`查看

执行组合键Ctrl+PQ,返回至 docker 主机,执行docker container stop命令停止容器

$ docker container stop 容器名/ID

执行docker container rm命令杀死的容器

$ docker container rm 容器名/ID

此时在 docker 主机上执行docker container ls -a,指定-a参数是让 Docker 列出所有容器,包括那些原来处于停止状态的容器。

$ docker container ls -a 

执行docker container start启动处于停止状态的容器,接着再用命令查看当前容器的状态已经变成运行时

$ docker container start

镜像命名和标签

只要给出镜像的名字和标签,就能在官方仓库中(docker-hub)中定位一个镜像(采用 “ : ” 分隔)。从官方拉取镜像时,docker image pull命令格式如下:

$ docker image pull alpine:latest #从alpine仓库中拉取了latest标签的镜像
$ docker image pull ubuntu:latest #从ubuntu仓库中拉取了latest标签的镜像
  • 首先,如果在没有仓库名称后指定具体的镜像标签,则 Docker 会假设用户希望拉取标签为latest的镜像
  • 其次,标有latest标签的镜像不保证这是仓库中最新的镜像,它和别的普通的标签没什么两样!例如,Alpine仓库中最新的镜像通常标签是edge。因此,在使用latest标签之前需要谨慎!

从非官方仓库拉取镜像也是类似的,只需要在仓库名称前面加上 Docker Hub 的用户名或者组织名称即可。例如,现在需要从tu-demo仓库中拉取v2这个镜像,其中镜像的拥有者是 Docker Hub 账户sunling,这是不被信任的第三方账户:

$ docker image pull sunling/tu:demo:v2 #仓库名是tu-demo,镜像名是v2,账户拥有是sunling

如果希望从第三方镜像仓库服务获取镜像(非 Docker Hub),则需要在镜像仓库名称前加上第三方镜像仓库服务的 DNS 名称。假设这里的示例镜像位于 Google 容器镜像仓库服务(GCR)中,则需要在仓库名称前面加上gcr.io

$ docker pull gcr.io/sunling/tu-demo:v2 #gcr.io是DNS名称

【注】:上述所说的示例镜像tu-demo:v2均不存在,只是为了便于演示,在实际使用中,只需要把对应信息都替换即可

给镜像打标签

一个镜像可以根据用户需要打多个标签,因为标签是存放在镜像元数据中的任意数字或字符串。

过滤 docker image ls 输出内容

Docker 提供--filter参数来过滤docker image ls命令返回的镜像列表内容。

$ docker image ls --filter dangling=true #返回悬虚镜像

没有标签的镜像被称为悬虚镜像,在列表中展示为:

可以通过docker image prune命令移除全部的悬虚镜像,如果是添加-a参数,Docker 会额外移除没有被使用过的镜像(指那些没有被任何容器使用过的镜像)

Docker 目前支持如下的过滤器:

  • dangling:可以指定truefalse,仅返回悬虚镜像(true),或者非悬虚镜像(false)
  • before:需要镜像名称或者ID作为参数,返回在之前被创建的全部镜像
  • since:与before类似,区别在只返回了指定镜像之后创建的全部镜像
  • label:根据标注(label)的名称或者值,对镜像进行过滤。

【注】:使用label过滤器时,docker image ls命令的输出不显示标注的内容。

使用使用--format参数对输出内容进行格式化:

$ docker image ls --format "{{.Size}}" #返回Docker主机上镜像的大小属性

容器的生命周期

容器的生命周期——从创建、运行、休眠、直至销毁的整个过程。接下来会启动一个新的容器,这样就可以观察完整的生命周期,依旧是运行ubuntu:latest容器:

$ docker container run --name percy -it ubuntu:latest /bin/bash 
root@a1e64e8148c6:/#

--name参数表示指定容器的名称是percy(persistent),意为“持久化”。当然,percy这个名字和其他名字没什么两样,也不会带来什么额外的特性,这完全取决于用户。

在新容器内部中,写入一些数据到一个新文件上,测试数据是否写入成功:

root@a1e64e8148c6:/#:cd /tmp
root@a1e64e8148c6:/tmp#:ls -l
total 0
root@a1e64e8148c6:/tmp#:echo "Xiaoma" > newfile
root@a1e64e8148c6:/tmp#:ls -l
total 10
root@a1e64e8148c6:/tmp#:cat newfile
xiaoma

Ctrl+PQ退出当前容器,返回 docker 主机

$ docker container stop percy #停止容器
percy
$ docker container ls -a #查看容器生命周期 STATUS:Exited (0)
$ docker container start percy #启动容器
$ docker container exec -it perct /bin/bash #连接重启后的容器

进入容器内,随后我们cd/tmp目录,查看当前的文件:

root@a1e64e8148c6:/# cd /tmp/
root@a1e64e8148c6:/tmp# ls 
newfile
root@a1e64e8148c6:/tmp# cat newfile
Xiaoma

可以确认之前创建的文件依然存在,这证明停止容器运行并不会损毁容器或者其中的数据。这便是 Docker 容器持久化特性的重要体现,但要提及持久化,需要指出卷(volume)才是在容器存储持久化数据的首要方式

停止和删除容器

删除一个容器最好的办法是分两步走:先停止,再删除。这样可以给容器内运行的应用或进程一个停止运行并清理残留数据的机会,也给用户一个冷静思考的机会。

$ docker container stop percy #停止容器
percy
$ docker container rm percy #删除容器
percy
$ docker container ls -a #没有名为percy的容器

可以总结,直至容器被明确删除之前,容器都不会丢弃其中的数据。就算容器被删除了,如果将容器的数据存储在中,数据也会被保存下来。

利用重启策略对容器进行自我修复

建议在容器时配置好重启策略,这是容器自我修复的能力,可以在指定事件或者错误之后重启来完成自我修复。重启策略应用于每个容器,可以作为参数被强制传入docker-container run命令中、或者在Compose文件中声明(这是在使用Docker-Compose 和 Docker-Stacks 的情况下)。容器支持的重启策略有三种:

  • always 策略

    这是一种简单的重启策略方式,除非容器被明确停止,否则该策略会一直尝试重启处于停止状态的容器。

    例如,使用always重启策略运行一个名为xiaomaalpine容器,可以看到容器的启动时间16秒小于创建时间50秒,这是因为容器在输入exit命令的时候,容器被杀死,然后 Docker 又重新启动了容器。

    $ docker container run --name xiaoma -it --restart always alpine sh
    / # exit
    $ docker container ls
    CONTAINER ID        IMAGE        COMMAND       CREATED             STATUS             name  1edf4b09ac3f       alpine         "sh"        50 seconds ago      Up 16 seconds       xiaoma

    always 策略还有一个特性,当daemon重启的时候,停止的容器也会被重启,可以这样验证:

    $ docker container stop xiaoma #停止容器
    xiaoma
    $ docker container ls -a #查看容器
    CONTAINER ID        IMAGE     COMMAND       CREATED             STATUS                  name 1edf4b09ac3f       alpine     "sh"      15 minutes ago    Exited (137) 18 seconds ago  xiaoma
    $ service docker restart #重启daemon
    $ docker container ls -a #查看容器
    CONTAINER ID        IMAGE        COMMAND         CREATED             STATUS           name        1edf4b09ac3f       alpine         "sh"       15 minutes ago      Up 9 seconds       xiaoma
  • unless-stopped 策略

    unless-stopped策略与always策略最大的区别就是,被明确停止的容器不会随着daemon重启而启动,可以验证:

    $ docker container run --name xiaoma1 -it --restart unless-stopped alpine sh
    / # exit
    $ docker container ls -a 
    CONTAINER ID        IMAGE        COMMAND       CREATED             STATUS             name  41de8e6ab5e8        alpine         "sh"       36 seconds ago      Up 35 seconds        xiaoma1
    $ docker container stop xiaoma1
    xiaoma1
    $ service docker restart
    $ docker container ls -a
    CONTAINER ID      IMAGE     COMMAND     CREATED             STATUS                   name  41de8e6ab5e8      alpine    "sh"    5 minutes ago   Exited (137) 57 seconds ago     xiaoma1

    以上使用unless-stopped重启策略创建并运行了一个指定名称为xiaoma1的容器,接着退出容器,在 docker 主机执行停止该容器的命令,然后重启daemon,使用docker container ls -a命令查看该容器的状态仍然处于停止。

  • on-failure 策略

    on-failure重启策略会在退出容器时并且返回值不是 0(非正常退出状态 )的时候重启容器。

查看容器详情

当启动一个容器后,随之而来容器内可能会运行着许多应用,比如 Web 服务等,可以通过docker image inspect命令来查看运行时使用的镜像。

快速清理

接下来会介绍一种可以在 docker 主机上快速清理容器的方法,但是这种方法切记不能在生产环境或者运行着重要容器的系统上执行

$ docker container rm $(docker container ls -aq) -f #强制删除docker主机上的所有容器
41de8e6ab5e8    #返回被删除的容器ID
1edf4b09ac3f
$ docker container ls -a
CONTAINER ID        IMAGE        COMMAND       CREATED             STATUS             name  

rm $(docker container ls -aq)表示删除当前 docker 主机上的全部容器(等价于系统中每个容器ID都会传给该命令),而-f参数表示强制执行,即使是处于运行状态的容器也会被删除,并且不会返回任何需要用户确认的信息。

你可能感兴趣的:(docker,容器,运维)