Docker
容器
检查

检查一个docker容器

在这篇文章中,我们将学习如何使用docker容器检查命令。 我将总结一下如何检查docker容器的IP、端口、名称、状态、内部路径、容量、日志和网络。

1. 验证Docker容器命令

有两个命令可以用来检查Docker容器的一般信息。

1.1. 检查命令,了解详细信息

第一个命令是inspect命令,用于查看容器的详细信息。 你可以这样使用它,以JSON格式获取一个或多个容器的详细信息。

$ docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

如果你直接输入命令,你会得到很多东西要滚动浏览。 下面是一些大的内容

[
    {
        "id": "72256fae4d38ad302a4788771e0155b03c315a8389fe4327af3912d9e2ae0415",
        "Created": "2023-05-27T01:32:38.177055001Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
        "Status": "running",
        "Running": true,
        "Paused": false,
        ...
        "Pid": 3403,
        "ExitCode": 0,
        "Error": "",
        "StartedAt": "2023-05-27T01:32:38.380814543Z",
        "FinishedAt": "0001-01-01T00:00:00Z"        },
        "Image": "sha256:c42efe0b54387756e68d167a437aef21451f63eebd9330bb555367d67128386c",
        "Name": "/pedantic_cray",
        "ResolvConfPath": "/var/lib/docker/containers/72256fae4d38ad302a4788771e0155b03c315a8389fe4327af3912d9e2ae0415/resolv.conf"
        ,        "HostnamePath": "/var/lib/docker/containers/72256fae4d38ad302a4788771e0155b03c315a8389fe4327af3912d9e2ae0415/hostname",
        "HostsPath": "/var/lib/docker/containers/72256fae4d38ad302a4788771e0155b03c315a8389fe4327af3912d9e2ae0415/hosts",
        ...
        "HostConfig": {},
        "GraphDriver": {},
        "Mount": [],
        "Config": {},
        "NetworkSettings": {}
    }
]

IdName项是容器的唯一ID和名称,PathArgs项是容器被创建时执行的文件或命令、 State项表示容器的当前状态。 ResolveConfPathHostnamePathHostsPathHostConfig项包含配置Docker主机环境的文件路径或配置语句、 ImageNetworkSettingsGraphDriver项显示容器的镜像、网络和存储环境。

由于Docker inspect命令被设计为显示容器的所有信息,当你想看具体信息时,它可能会让人不知所措。 出于这个原因,它提供了--format选项,允许你使用Go语言的`text/template'包,只输出你想要的信息。

1.2. 使用Go模板的--format选项

因为Docker是用Go语言编写的,而Go语言在控制并发性方面非常出色,所以你会注意到一些对Go语法的借用。 inspect命令的--format选项就是一个借用Go语法的例子。

下面是一个Go中--text/template的简单例子,但不要试图去理解它,只是看看它。 关键部分是那一行t, _ = t.Parse("Name: { {.Name} }, Age: { {.Age} }n")。 你可以看到Go模板用两个大括号和一个小圆点获取Person结构的每个属性。

package main
 
import (
    "os"
    "text/template"
)
 
type Person struct {
    Name string
    Age  int
}
 
func main() {
    t := template.New("person template")
 
    t, _ = t.Parse("Name: { {.Name} }, Age: { {.Age} }\n")
    p := Person{Name: "Alice", Age: 30}
 
    t.Execute(os.Stdout, p)
}
 

Docker也使用同样的语法。 你可以把输出的JSON文件看作是一个大的结构,把每个字段看作是这个结构的一个属性,从而建立一个模板。

例如,让我们打印容器的Status记录。Status元素在顶层的State字段内。 所以我们可以这样输入

$ docker container inspect --format='{ {.State.Status} }' CONTAINER

命令,它将返回以下结果

$ docker container inspect --format='{ {.State.Status} }' 7225
running

如你所见,你可以通过使用Go模板语法来定制输出。

要自定义输出,请看Docker官方文档中的【格式化命令和日志输出页面 (opens in a new tab)。它的解释很直观,所以你应该马上就能理解。

1.3. stats命令检查实时信息

stats命令可以实时显示所有正在运行的容器的CPU、内存使用情况和进程数,以及通过网络或块接口的累计I/O。

要使用它,请键入以下命令

$ docker container stats [OPTIONS] [CONTAINER...]

你会被带到一个显示实时信息的单独屏幕,如下图所示。

CONTAINER ID   NAME            CPU %  ...
72256fae4d38   pedantic_cray   0.00%  ...

如果你只想打印当前的信息,而不是实时更新的信息,请添加--no-stream选项。 你会注意到,信息打印完毕后,提示会返回。

docker container stats --no-stream run result

现在我们来看看如何根据这两条命令依次输出具体信息。

2. 获取名称和状态

你可以使用ls命令和inspect命令来打印一个容器的名称和状态。 前者表达的是相对时间,后者表达的是绝对时间,所以你可以根据你的需要选择其中一个。

2.1. ls显示相对时间

有几种方法可以获得一个容器的名称和状态。 第一个是docker container ls (--all)命令,我们已经在Run a containerStop/Exit a container中看到了它。

如下图所示,你可以得到一个容器名称和状态的简单列表。只要看一下STATUS'条目和NAMES条目就可以了。

$ docker container ls
CONTAINER ID   ...   STATUS       NAMES
72256fae4d38   ...   Up 5 hours   pedantic_cray

ls命令也可以使用--format选项,我们在第1.2节中了解到。 下面是一个只输出容器名称和状态的命令,是一个列表。

$ docker container ls --format='table { {.Names} }\t{ {.Status} }'
NAMES           STATUS
pedantic_cray   Up 6 hours

关键字tablet是像表格一样输出的命令。见 1.2节

###2.2.检查以输出绝对时间

如果1ls1命令如上所示输出相对时间,可以使用inspect命令来输出准确的状态、 名称、创建时间、开始时间等等。

$ docker container inspect --format ' Container name: { {println .Name}} } State: { {println .State.Status} } Created at: { {println .Created}} } Started at: { { {println .State.StartedAt}} }' 7225
Container name: /pedantic_cray
State: running
Created at: 2023-05-27T01:32:38.177055001Z
Started at: 2023-05-27T01:32:38.380814543Z

println关键字在当前条目后添加一个换行符。

3. 检查IP、端口

3.1. 检查容器的IP

检查容器的IP使用inspect命令。

docker container inspect --format='{ {range $network, $config := .NetworkSettings.Networks} }[{ {$network} }]: { {println $config.IP Address} }{ {end} }' 7225
[bridge]: 172.17.0.2

range关键字和{ {end} }关键字在Go模板中充当了一个循环。 由于Docker容器有多个IP地址,这取决于它们所连接的网络,我们使用range关键字来打印它们。 默认的IP可以通过检查网络中的IPAddress条目找到,通常称为bridge

3.2. 检查容器端口

提供了检查容器端口的命令,因此你可以很容易地检查它们,如下所示。

$ docker container port 7225
80/tcp -> 0.0.0.0:8000

第3.1节所示,你可以使用inspect命令和Go模板产生同样的输出。 如果你有时间,可以试试。

4. 检查容器内的路径

有两种方法来检查容器内的路径:从容器外和从容器内。

4.1. 从容器外检查内部路径

docker container exec命令提供了一种方法,可以从容器外部向容器外壳发出所需的命令。

例如,下面的命令将打印当前容器的工作目录的路径。

$ docker container exec 7225 pwd
/

你还可以浏览你想要的文件和目录。

$ docker container exec -u root 7225 ls /usr/share/nginx/html
50x.html
index.html

添加-u root选项将以root权限运行该命令。

4.2. 检查容器内的内部路径

如果你想访问一个容器的内部,查看它的内部路径,用-it选项运行容器的shell。

$ docker container exec -it 7225 /bin/sh
# pwd
/
# ls /usr/share/nginx/html
50x.html  index.html
# exit

像上面例子中的最后一个提示,输入exit退出shell。

5. 检查容量

检查本地环境中所有容器的总容量的命令如下

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         2         181.8MB   0B (0%)
Containers      3         1         3.281kB   2.186kB (66%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

它显示了Docker环境中所有镜像、容器、卷和缓存目前所占用的空间量,其中RECLAIMABLE项表示每个对象未被使用的空间量。

6. 检查日志

检查容器的日志的命令如下。如果你想实时检查日志,请使用-f (--follow)选项。 如果你想只看到最近的日志和旧容器的输出,你可以用-n (--tail)选项指定一个数字。 --since选项也很有用,可以只打印过去50s(秒)、30m(分钟)和5h(小时)的日志。

$ docker container logs --since 10h --tail 5 --follow 7225
2023/05/27 01:32:38 [notice] 1#1: start worker processes
2023/05/27 01:32:38 [notice] 1#1: start worker process 29
2023/05/27 01:32:38 [notice] 1#1: start worker process 30
2023/05/27 01:32:38 [notice] 1#1: start worker process 31
2023/05/27 01:32:38 [notice] 1#1: start worker process 32

7. 核查网络

检查一个容器的网络的过程如下。 首先,检查连接到该容器的网络列表,然后检查这些网络的细节。

检查连接到一个容器的网络列表的命令是

$ docker container inspect --format='{ {range $network, $config := .NetworkSettings.Networks} }{ {println $network}  }{ {end} }' 7225
bridge
db-net

这个命令可以打印出一个网络名称的列表,如上图所示。现在,使用下面的网络名称命令来查看其细节。

$ docker network inspect db-net
[
    {
        "Name": "db-net",
        "Id": "74b2026af3ee7d328aab14d33894d1c9fc31cd21176051c7c90cab1440342ae7",
        ...

关于网络信息的更详细讨论将在未来的Docker网络文章中涉及。

8. 最后的思考

在这篇文章中,我们了解了Docker容器的验证命令。 我希望当你需要知道如何验证一个Docker容器的IP时,这对你有帮助、 端口、名称、状态、内部路径、容量、日志和网络。

copyright for docker container inspect

© 2023 All rights reserved.