查看容器(ps)

在运行容器之前,我们需要知道如何查看运行中的容器:

1
2
3
4
5
6
7
# Management Commands(推荐)
docker container ps
# 或者
docker container ls

# Commands
docker ps

使用此方法只能看到运行中的容器,对于以及停止的容器,还需要使用-a参数,比如:

1
docker container ps -a

容器运行(run, 无参数)

前面有说过,容器是镜像的实例。学习 docker 最终目的就是就是运行它。

1
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

运行第一个测试容器:

1
2
3
4
5
# Management Commands(推荐)
docker container run hello-world

# Commands
docker run hello-world

如图所示:

hello-world 容器是一个测试容器,在输出一些文字之后就会退出,通过这个过程,我们可以发现:

  1. 对于运行容器,如果镜像不存在,则会去 registry 中自动下载。
  2. 使用 ps 查看容器的时候,如果不使用 -a 参数是看不到状态属于 Exited 的容器的。
  3. 使用 ps 可以简单的看到容器的 ID,使用的镜像,执行的命令,创建时间,运行状态,端口,容器的名字等信息。

容器运行(run -d,守护态)

在运行容器时,需要确定这个容器是运行在前台模式还是后台模式。

-d,--detach,守护态运行。能够将容器运行在后台模式。这样所有的 IO 都只能通过网络资源或存储卷来进行交互。容器不再监听执行 docker run 这个命令行的窗口。有点类似于 Linux 启动程序时候的nohup或者 &组合。

1
docker container run -d hello-world

如图所示:

可以发现,hello-world 容器加了 -d 参数后不在输出它的信息,只是返回了一长串字符,其实就是完整的 Container ID,用法类似 Image ID。

同时由于 hello-world 容器本身的特性,程序在后台执行完成之后就直接退出了,容器也跟着退出了。

再次运行以 nginx 容器为例:

1
docker container run nginx

如图所示:

可以发现以下信息:

  1. 由于没有跟 TAG,默认会以 latest 版本执行。在 docker 中,如果是运行 latest 版本,docker 都会去仓库试着拉取,而不是直接使用本地的镜像,因为本地的 latest 不一定是真正的 latest。
  2. 容器在运行之后会以前台模式运行,所有它 hung 在了命令行。
  3. 此时如果我们新开一个窗口来查看,可以发现容器处于 Up 状态,如下图所示:

  1. 如果我们去 docker run 的窗口使用 Ctrl + c 中断,然后再次查看容器运行状态,可以发现容器已经退出,这就是前台运行的问题,如图所示:

如果使用后台运行模式运行该容器:

1
docker container run -d nginx

运行效果如图所示:

容器被放在了后台运行,不会 hung 在命令行。当然所有的输出信息也不能直接看到了。

容器运行(run -it,交互式运行)

在使用 -d 参数之后,容器就不会 hung 在命令行窗口,而是以后台方式运行。但是这同时也有一个问题,某些时候我们是需要进入容器查看相关启动等信息的。此时就需要另外的参数配合使用:

  • -i,--interactive:打开一个交互式界面。
  • -t,--tty:打开一个 TTY 终端。
    将这个两个参数结合就是打开一个交互式的 TTY 终端。
1
docker container run -it nginx /bin/bash

如图所示:

通过该方法在创建容器的时候指定运行命令,然后以 bash 进入容器内部的命令行。可以发现:

  1. 容器内部就是 linux 的目录结构,但是是一个很简化的 linux,很多基础命令都没有。
  2. 当退出容器命令行,容器也跟着退出。原因是我们重写容器内部的命令为 bash 之后,nginx 就没有启动了,当退出 bash 之后,容器内部就没有进程了,所有容器就退出了。
  3. 这种方式用的比较少,一般都是容器运行之后,使用专门的命令进入容器。

容器运行(run –name,容器命名)

在创建容器的时候,如果不给容器指定一个名字,容器会生成一个随机的名字,一般都是以 xxx_xxx 的格式。

1
docker container run -d --name demo01 nginx

如图所示:

针对容器的名字,我们可以根据自己的需求指定相关的命名规范,以此来实现统一管理的目的。

容器运行(run –rm,退出删除)

某些容器可能是一次性容器,在运行之后,容器退出。同时不保留在 ps 中,此时就需要使用到 --rm 参数。

1
docker container run --rm --name rm_test hello-world

如图所示:

容器运行(run –restart,重启规则)

为了保障在以外的停止之后能够自动恢复,就需要对它配置相关--restart规则:

  • on-failure:容器停止时,容器出现报错,则容器会被重启。但是如果 docker 服务被重启了该配置就不会生效。
  • unless-stopped:容器停止,如果没有报错,则容器会被重启。即使重启了 docker 服务,该配置也生效。
  • always:不管如何,容器只要停止就重启。
1
docker container run -d --restart always --name busybox_test busybox /bin/sh -c "sleep 60"

busybox 镜像是一个精简的 Linux,非常小,适合用来做测试。结果如下:

通过过一段时间查看,发现在容器内部 sleep 60 之后退出,然后被重启拉起一个新的。

以上就是容器运行的基本参数,至于容器的存储卷,网络等内容,后面会单独分节介绍。

查看详情(inspect)

通过该命令可以查看容器的详细信息:

1
docker container inspect busybox_test

详细信息中需要关注的点包括:

  • Image:使用的镜像。
  • Volumes:数据存储卷。
  • IPAddress:容器的 IP 地址。
  • Ports:端口信息。

状态管理

通过该命令可以查看容器的运行时状态,如 Up,Exited 等:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建容器但不运行
docker container create --name demo02 nginx

# 启动容器
docker container start demo02

# 暂停容器
docker container pause demo02

# 继续运行容器
docker container unpause demo02

# 停止容器
docker container stop demo02

# 重启容器
docker container restart demo02

结果如图所示

进入容器(attach)

通过该命令可以连接到一个运行中的容器:

1
docker container attach --sig-proxy=false demo02

使用--sig-proxy=false的目的是为了避免Ctrl + C或者Ctrl + D使容器退出。

该命令会对容器进行监听,命令行处于交互式界面,此时从新窗口请求该容器的 nginx:

可以看到日志直接输出到屏幕,Ctrl + C就可以退出该界面且保持容器继续运行。

进入容器(exec)

上面的方法是将输出直接输出到屏幕上,无法操作,如果想将容器当虚拟机一样使用,则需要 exec:

1
docker exec -it demo02 /bin/bash

注意,exec 后面需要跟执行命令,由于是命令行,则需要使用 /bin/bash 或者 /bin/sh。

查看日志(logs)

通过该命令可以实时查看容器运行的日志:

1
docker container logs -f demo02

如图所示:

使用-f的参数可以让它像linux中的tail命令一样。否则就是一次性查看,跟cat一样。

文件拷贝(cp)

通过该命令可以实现容器和宿主机之间文件传输:

1
2
3
4
5
6
7
8
9
10
11
# 拷贝文件到容器
docker container cp anaconda-ks.cfg demo02:/tmp/

# 拷贝文件到容器并改名
docker container cp anaconda-ks.cfg demo02:/tmp/1.txt

# 拷贝目录到容器
docker container cp demo demo02:/tmp/

# 拷贝文件到本地
docker container cp demo02:/tmp/1.txt .

如图所示:

查看端口(port)

通过该命令可以查看容器和宿主机的端口映射关系:

1
docker container port demo02

查看状态(stats)

通过该命令可以查看容器内部系统资源使用情况:

1
docker container stats demo02

如图所示

查看进程(top)

通过该命令可以查看到容器内部运行的进程:

1
docker container top demo02

如图所示

提交镜像(commit)

该命令可以将现有的容器提交成镜像:

1
docker container commit -a "Trover <admin@buerya.cn>" -m "Copy file" -p demo02 trover/nginx-copy-file:v1.0

参数说明:

  • -a:作者信息。
  • -m:提交信息,有点像 git commit -m
  • -p:生成镜像时容器暂停。
    如图所示:

停止容器(kill)

该命令相较于 stop 更暴力杀死一个或多个容器:

1
docker container kill demo02

如图所示:

重命名容器(rename)

该命令可以对容器重命名:

1
docker container rename demo02 demo03

如图所示:

导出容器(export)

该命令可以将容器当前的状态导出:

1
docker container export -o /tmp/demo03.tar demo03

如图所示:

查看系统变化(diff)

该命令可以查看容器目前的文件和文件系统本身的差异:

1
docker container diff demo03

如图所示:

删除容器(rm)

该命令可以删除指定的一个或多个容器:

1
2
3
4
5
# 删除停止的容器
docker container rm a7851616b54c

# 删除运行中的容器
docker container rm -f 338a3419e42e

如果容器在运行,需要使用-f强制删除:

批量删除(rm)

对于容器或者镜像,都可以使用条件筛选的方式对它进行批量删除:

1
2
3
4
5
6
7
8
# 删除所有容器
docker container rm $(docker container ls -aq)

# 删除所有 redis 镜像
docker image rm $(docker image ls -aq redis)

# 删除所有在 mongo:3.2 之前的镜像
docker image rm $(docker image ls -aq -f before=mongo:3.2)

使用-q参数能够增加筛选条件。

删除容器(prune)

该命令可以删除没有使用的容器:

1
docker container prune

可以通过-f参数直接删除,不用确认。

到此,容器的大部分操作都已经体验完毕。接下来将讲解如何制作镜像!