检查一个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": {}
}
]
Id
和Name
项是容器的唯一ID和名称,Path
和Args
项是容器被创建时执行的文件或命令、
State
项表示容器的当前状态。
ResolveConfPath
、HostnamePath
、HostsPath
和HostConfig
项包含配置Docker主机环境的文件路径或配置语句、
Image
、NetworkSettings
和 GraphDriver
项显示容器的镜像、网络和存储环境。
由于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
选项。
你会注意到,信息打印完毕后,提示会返回。
现在我们来看看如何根据这两条命令依次输出具体信息。
2. 获取名称和状态
你可以使用ls
命令和inspect
命令来打印一个容器的名称和状态。
前者表达的是相对时间,后者表达的是绝对时间,所以你可以根据你的需要选择其中一个。
2.1. ls显示相对时间
有几种方法可以获得一个容器的名称和状态。
第一个是docker container ls (--all)
命令,我们已经在Run a container和Stop/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
关键字table
和t
是像表格一样输出的命令。见 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时,这对你有帮助、 端口、名称、状态、内部路径、容量、日志和网络。
