docker ps

docker ps 命令查看当前宿主机上容器列表。

帮助

$ docker ps --help
Usage: docker ps [OPTIONS]
List containers
Options:
  -a, --all Show all containers (default shows just running)
  -f, --filter filter Filter output based on conditions provided
      --format string Pretty-print containers using a Go template
  -n, --last int Show n last created containers (includes all states) (default -1)
  -l, --latest Show the latest created container (includes all states)
      --no-trunc Don't truncate output
  -q, --quiet Only display numeric IDs
  -s, --size Display total file sizes

选项

选项 描述
-a, –all=false 列出所有状态容器,不带 -a 则输出当前正在运行的容器。容器状态有7种:created(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)、paused(暂停)、exited(停止)、dead(死亡)。
-f, –filter=[] 根据条件过滤显示的内容。
–format string 指定返回值的模板文件
-n, –last int 列出最近创建的 n 个容器
-l, –latest=false 列出最后创建的容器包含停止的容器
–no-trunc 不截断输出,输出容器的完整 ID 等信息
-q, –quiet=false 静默模式,只显示容器编号
-s, –size 显示总的文件大小

过滤条件:

-f, --filter=[] 根据条件过滤显示的内容。过滤条件的是 key=value 对的格式,如果有多个过滤条件需要多次指定参数,例如 --filter "foo=bar" --filter "foo2=bar2"

当前支持的过滤器有如下:

过滤条件 描述
id 容器的 ID
name 容器的名字
label 可以为任意的字符串组成的一个关键字 KEY 或者键值对 KEY=VALUE
exited 只在 –all 模式中过滤退出时状态码
status 过滤指定状态的容器。状态有7种:created(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)、paused(暂停)、exited(停止)、dead(死亡)
ancestor 过滤有相同祖先镜像的容器,一般格式是 <image-name>[:<tag>], <image id>, or <image@digest>
before or since 过滤某个容器(容器ID或名字)创建之前,或者创建之后创建的容器
volume 使用一个volumeid或者挂载点镜像过滤
network 通过网络配置进行过滤
publish or expose 通过开放的端口或者协议进行过滤,<port>[/<proto>] or <startport-endport>/[<proto>]
health 基于容器的健康状态进行过滤。状态要求是 starting/healthy/unhealthy/none其中一种
isolation 仅在Windows系统下的服务可用。要求是default/process/hyperv其中的一种
is-task Boolean值True或者False过滤一个服务是否是一个task

示例

  • 显示当前运行中的容器

docker ps 命令默认只显示当前运行中的容器。显示所有容器时需要指定产生 -a

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c01db0b339c ubuntu:12.04 bash 17 seconds ago Up 16 seconds 3300-3310/tcp webapp
d7886598dbe2 crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db

输出解释

名称 描述
CONTAINER ID 容器 ID
IMAGE 容器运行时使用的镜像
COMMAND 启动容器时运行的命令
CREATED 容器的创建时间
STATUS 容器状态,状态有7种:created(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)、paused(暂停)、exited(停止)、dead(死亡)
PORTS 容器的端口信息和使用的连接类型(tcp\udp)
NAMES 自动分配的容器名称

docker ps 默认会聚合端口暴露显示的信息。例如一个容器暴露了 TCP 的端口 100/101/102,那么将会在 PORTS 列显示 100-102/tcp 。

  • 显示最后被创建的 n 个容器

这里不限状态

docker ps -n 5
  • 显示最后被创建的容器

相当于 docker ps -n 1

docker ps -l
  • 显示完整输出

即不会截断输出。该选项有点长,其中 trunc 算是 truncate 的缩写

docker ps --no-trunc
  • 显示所有状态的所有容器,且只显示容器ID
# docker ps -a -q
b1a073e41e7d
f46fb1dc520fd
a63b45597de3
6a4aaa2e947b
  • 显示容器文件大小
docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
643e145fe382 coredns "/coredns -conf /etc…" 3 weeks ago Up 3 weeks k8s_coredns_coredns-6d99995b7f-s9rcf_kube-system_7153cb3c-3d1c-11ea-94c1-fa163e95902d_0 0B (virtual 40.3MB)

该命令可以获得 2 个数值:一个是容器真实增加的大小,一个是整个容器的虚拟大小。 容器虚拟大小 = 容器真实增加大小 + 容器镜像大小 注意,该命令会统计磁盘上文件大小,会有IO请求,请求会有一定的等待

  • filter使用label过滤容器

label可以为任意的字符串组成的一个关键字KEY或者键值对KEY=VALUE。

例如,过滤label是color的容器

$ docker ps --filter "label=color"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
673394ef1d4c busybox "top" 47 seconds ago Up 45 seconds nostalgic_shockley
d85756f57265 busybox "top" 52 seconds ago Up 51 seconds high_albattani

过滤出label是color的容器,且color的值为blue的容器

$ docker ps --filter "label=color=blue"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d85756f57265 busybox "top" About a minute ago Up About a minute high_albattani
  • filter使用name过滤容器

使用filter过滤功能过滤容器名称是nostalgic_stallman的容器

$ docker ps --filter "name=nostalgic_stallman"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b6247364a03 busybox "top" 2 minutes ago Up 2 minutes nostalgic_stallman

也可以使用容器名称字符串的一部分字符进行过滤

$ docker ps --filter "name=nostalgic"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
715ebfcee040 busybox "top" 3 seconds ago Up 1 second i_am_nostalgic
9b6247364a03 busybox "top" 7 minutes ago Up 7 minutes nostalgic_stallman
673394ef1d4c busybox "top" 38 minutes ago Up 38 minutes nostalgic_shockley
  • filter使用EXITED进行容器过滤

exited是基于容器的退出状态码进行过滤的。

例如,过滤出退出时是正常退出的容器

$ docker ps -a --filter 'exited=0'
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea09c3c82f6e registry:latest /srv/run.sh 2 weeks ago Exited (0) 2 weeks ago 127.0.0.1:5000->5000/tcp desperate_leakey
106ea823fe4e fedora:latest /bin/sh -c 'bash -l' 2 weeks ago Exited (0) 2 weeks ago determined_albattani
48ee228c9464 fedora:20 bash 2 weeks ago Exited (0) 2 weeks ago tender_torvalds

过滤退出时的状态码是137,即信号量 SIGKILL(9) 的容器

$ docker ps -a --filter 'exited=137'
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3e1c0ed5bfe ubuntu:latest "sleep 1000" 12 seconds ago Exited (137) 5 seconds ago grave_kowalevski
a2eb5558d669 redis:latest "/entrypoint.sh redi 2 hours ago Exited (137) 2 hours ago sharp_lalande

137 退出码一般的情况有:

  1. 通常情况下 init 进程被 killed
  2. docker kill 杀死的容器
  3. docker 服务进程重启时杀死的所有容器
  • filter 使用 STATUS 状态进行过滤

status 是基于容器的运行状态来进行过滤的。

状态有7种:created(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)、paused(暂停)、exited(停止)、dead(死亡)。

例如,过滤 running 运行中的容器

$ docker ps --filter status=running
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
715ebfcee040 busybox "top" 16 minutes ago Up 16 minutes i_am_nostalgic
d5c976d3c462 busybox "top" 23 minutes ago Up 23 minutes top
9b6247364a03 busybox "top" 24 minutes ago Up 24 minutes nostalgic_stallman

过滤 paused(暂停)状态的容器

$ docker ps --filter status=paused
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
673394ef1d4c busybox "top" About an hour ago Up About an hour (Paused) nostalgic_shockley
  • filter 基于先祖 ancestor 容器进行过滤

ancestor 过滤基于容器的基础镜像进行过滤,或者说过滤出基于某个镜像创建的容器。过滤内容是

  1. image
  2. image:tag
  3. image:tag@digest
  4. short-id
  5. full-id

指定一个 tag 时,默认会使用 latest 最新的镜像。例如过滤使用最新版本 Ubuntu 镜像创建的容器

$ docker ps --filter ancestor=ubuntu
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
919e1179bdb8 ubuntu-c1 "top" About a minute ago Up About a minute admiring_lovelace
5d1e4a540723 ubuntu-c2 "top" About a minute ago Up About a minute admiring_sammet
82a598284012 ubuntu "top" 3 minutes ago Up 3 minutes sleepy_bose
bab2a34ba363 ubuntu "top" 3 minutes ago Up 3 minutes focused_yonath

过滤容器,基于 Ubuntu 的 tag12.04.5 版本

$ docker ps --filter ancestor=ubuntu:12.04.5
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82a598284012 ubuntu:12.04.5 "top" 3 minutes ago Up 3 minutes sleepy_bose

基于 layer 层进行过滤,使用到该 layer 层的容器都会被过滤到

docker ps --filter ancestor=d0e008c6cf02
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82a598284012 ubuntu:12.04.5 "top" 3 minutes ago Up 3 minutes sleepy_bose
  • filter 基于 create 时间过滤

创建时间有 before 和 since 两种过滤方式,例如列出当前容器列表如下

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c3527ed70ce busybox "top" 14 seconds ago Up 15 seconds desperate_dubinsky
4aace5031105 busybox "top" 48 seconds ago Up 49 seconds focused_hamilton
6e63f6ff38b0 busybox "top" About a minute ago Up About a minute distracted_fermat

使用 before 进行过滤。before 过滤出给定容器创建之前的容器。

$ docker ps -f before=9c3527ed70ce

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4aace5031105 busybox "top" About a minute ago Up About a minute focused_hamilton
6e63f6ff38b0 busybox "top" About a minute ago Up About a minute distracted_fermat

使用 since 进行过滤。since 过滤出给定容器创建之后创建的容器

$ docker ps -f since=6e63f6ff38b0

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c3527ed70ce busybox "top" 10 minutes ago Up 10 minutes desperate_dubinsky
4aace5031105 busybox "top" 10 minutes ago Up 10 minutes  
  • filter 基于 volume 过滤

volume 基于指定的 volume 或者 volume 的 Mount 挂载点进行过滤。例如:

$ docker ps --filter volume=remote-volume --format "table {{.ID}}\t{{.Mounts}}"
CONTAINER ID MOUNTS
9c3527ed70ce remote-volume

$ docker ps --filter volume=/data --format "table {{.ID}}\t{{.Mounts}}"
CONTAINER ID MOUNTS
9c3527ed70ce remote-volume
  • filter 基于 network 过滤

network 过滤出连接到指定网络上的容器列表,可以使用网络名称或者网络 ID。

列出所有连接到net1网络名的容器

$ docker run -d --net=net1 --name=test1 ubuntu top
$ docker run -d --net=net2 --name=test2 ubuntu top

$ docker ps --filter network=net1

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d4893ed80fe ubuntu "top" 10 minutes ago Up 10 minutes test1

使用ID的方式进行过滤

$ docker network inspect --format "{{.ID}}" net1

8c0b4110ae930dbe26b258de9bc34a03f98056ed6f27f991d32919bfe401d7c5

$ docker ps --filter network=8c0b4110ae930dbe26b258de9bc34a03f98056ed6f27f991d32919bfe401d7c5

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d4893ed80fe ubuntu "top" 10 minutes ago Up 10 minutes test1
  • filter 基于 publish 或 expose 进行过滤

基于 publish 开放的端口或者 expose 声明的端口,协议进行过滤。支持单个端口,一段 range 端口,和协议,默认协议是 TCP。

过滤开放端口是80的所有容器

$ docker run -d --publish=80 busybox top
$ docker run -d --expose=8080 busybox top

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9833437217a5 busybox "top" 5 seconds ago Up 4 seconds 8080/tcp dreamy_mccarthy
fc7e477723b7 busybox "top" 50 seconds ago Up 50 seconds 0.0.0.0:32768->80/tcp admiring_roentgen

$ docker ps --filter publish=80
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc7e477723b7 busybox "top" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp admiring_roentgen

过滤声明协议是 TCP 且端口范围是8000-8080端口的容器

$ docker ps --filter expose=8000-8080/tcp

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9833437217a5 busybox "top" 21 seconds ago Up 19 seconds 8080/tcp dreamy_mccarthy

过滤声明的端口是 80,且协议是 UDP 的端口。如下无法获取到符合条件的容器

$ docker ps --filter publish=80/udp
CONTAINER ID IMAGE COMMAND CREATED STATUS  
  • formatting 使用 go 模板进行输出渲染

使用 –format 选项时,docker ps 会对输出的结果按照参数进行结果渲染过滤处理。

合法的参数如下

参数 描述
.ID 容器ID
.Image 镜像ID
.Command 引用的命令
.CreatedAt 容器创建的时间
.RunningFor 容器从创建到终止的时间
.Ports Exposed 的端口
.Status 容器的状态
.Size 容器的大小
.Names 容器的名称
.Labels 容器分配的所有label
.Label 指定的label,例如:’{{.Label “com.docker.swarm.cpu”}}'
.Mounts 容器的volume挂载点
.Networks 该容器连接的网络

显示所有容器的 ID 和 Command,并且中间使用冒号进行格式排版

$ docker ps --format "{{.ID}}: {{.Command}}"
a87ecb4f327c: /bin/sh -c #(nop) MA
01946d9d34d8: /bin/sh -c #(nop) MA
c1d3b0166030: /bin/sh -c yum -y up
41d50ecd2f57: /bin/sh -c #(nop) MA

显示所有容器的 ID 和 Labels,并使用tab进行格式排版

$ docker ps --format "table {{.ID}}\t{{.Labels}}"

CONTAINER ID LABELS
a87ecb4f327c com.docker.swarm.node=ubuntu,com.docker.swarm.storage=ssd
01946d9d34d8
c1d3b0166030 com.docker.swarm.node=debian,com.docker.swarm.cpu=6
41d50ecd2f57 com.docker.swarm.node=fedora,com.docker.swarm.cpu=3,com.docker.swarm.storage=ssd