学习如何监控Docker容器

367 阅读6分钟

本教程的重点是查看你正在运行的容器内发生了什么。有几个docker命令可以做到这一点,最常见的是docker container topdocker container inspectdocker container stats。top命令是一个容器中的进程列表。inspect命令相当有趣,因为它提供了一个容器如何启动和如何配置的细节。stats命令可以用来查看所有正在运行的容器的统计信息,或者以实时流的方式一次输出到终端。让我们来看看这些命令的一些操作。


运转几个容器

为了测试docker容器的监控命令,首先,我们需要启动几个容器来工作。我们已经看过如何运行多个容器,所以让我们再次启动几个容器。我们可以启动一个Nginx容器,一个MySQL容器,然后列出它们的运行状态。

$ docker container run -d --name nginx nginx
d4f849b858a9df134f7f907c6e929c2ef1e89b86df8f851c8f209f6d6ac7a9e1

$ docker container run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql
e9263551f40fb30deb0b09434bf26697fce3eaf3370141d01c209d997c73885b

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
e9263551f40f        mysql               "docker-entrypoint.s…"   26 seconds ago      Up 25 seconds       3306/tcp, 33060/tcp   mysql
d4f849b858a9        nginx               "/docker-entrypoint.…"   49 seconds ago      Up 48 seconds       80/tcp                nginx

Docker容器顶部

在Linux中,top命令是用来显示Linux进程的。它提供了一个运行系统的动态实时视图。我们可以在Docker中做一个类似的事情。

$ docker container top nginx
PID                 USER                TIME                COMMAND
1493                root                0:00                nginx: master process nginx -g daemon off;
1551                101                 0:00                nginx: worker process

$ docker container top mysql
PID                 USER                TIME                COMMAND
1569                999                 0:01                mysqld

Docker容器检查

inspect命令可以在一个或多个镜像或容器上运行。名称或ID都可以用来识别一个镜像或容器。这里我们检查我们环境中的Nginx容器。输出是JSON格式,包含了关于容器是如何启动的所有数据。

$ docker container inspect nginx
[
    {
        "Id": "d4f849b858a9df134f7f907c6e929c2ef1e89b86df8f851c8f209f6d6ac7a9e1",
        "Created": "2020-10-01T14:57:13.6068591Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1493,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-10-01T14:57:14.3647252Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d",
        "ResolvConfPath": "/var/lib/docker/containers/d4f849b858a9df134f7f907c6e929c2ef1e89b86df8f851c8f209f6d6ac7a9e1/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/d4f849b858a9df134f7f907c6e929c2ef1e89b86df8f851c8f209f6d6ac7a9e1/hostname",
        "HostsPath": "/var/lib/docker/containers/d4f849b858a9df134f7f907c6e929c2ef1e89b86df8f851c8f209f6d6ac7a9e1/hosts",
        "LogPath": "/var/lib/docker/containers/d4f849b858a9df134f7f907c6e929c2ef1e89b86df8f851c8f209f6d6ac7a9e1/d4f849b858a9df134f7f907c6e929c2ef1e89b86df8f851c8f209f6d6ac7a9e1-json.log",
        "Name": "/nginx",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Capabilities": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                30,
                149
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/6a6f3b5f81d2b454cbcc7651b3c40c90f8da991e9b55add4cfa8de2e3a57cd4d-init/diff:/var/lib/docker/overlay2/b873da3ee35fed4ed5b663d42705f29857e467ef7fc70d4f01b34e8593c90a2d/diff:/var/lib/docker/overlay2/c37b3ca864167a02502bc473d368823bdf2fdddf7ef3ff0fda126aae98ccf5c3/diff:/var/lib/docker/overlay2/d0b819fd09a7a62a2fc9858b4a015cd5594a240caefce77cad9a6b0f596f0dca/diff:/var/lib/docker/overlay2/5d3260b5420b271959560369b58594ca2be7fd8ae7bd74822c24c765c8ebeafc/diff:/var/lib/docker/overlay2/d874cfda684973a0d7f77e451987cd726723eab53aabf2ef285000ff32101e3d/diff",
                "MergedDir": "/var/lib/docker/overlay2/6a6f3b5f81d2b454cbcc7651b3c40c90f8da991e9b55add4cfa8de2e3a57cd4d/merged",
                "UpperDir": "/var/lib/docker/overlay2/6a6f3b5f81d2b454cbcc7651b3c40c90f8da991e9b55add4cfa8de2e3a57cd4d/diff",
                "WorkDir": "/var/lib/docker/overlay2/6a6f3b5f81d2b454cbcc7651b3c40c90f8da991e9b55add4cfa8de2e3a57cd4d/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "d4f849b858a9",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.19.2",
                "NJS_VERSION=0.4.3",
                "PKG_RELEASE=1~buster"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "nginx",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "ca6953bd7a7a11a50091be348a1414f9891d28fef9dcc241cc96332651fa0132",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/ca6953bd7a7a",
            "SecondaryIPAddresses": null,
            "EndpointID": "2044cf6b4ded03757b71a40d21b727f0287ac1b1c1f5edbe1f767d5fffa67456",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "0099dce04d4e730d272d5c774970a65704c8df6869dfadba2c2363e532c4caf9",
                    "EndpointID": "2044cf6b4ded03757b71a40d21b727f0287ac1b1c1f5edbe1f767d5fffa67456",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

过滤检查输出

由于输出非常大,你可以用管道将结果输送到Powershell的[Select-String]或bash的[grep]。 比如说:

$ docker container inspect nginx | Select-String -Pattern IPAddress

            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

Docker Container Stats

当使用stats命令时,你可以一起查看所有正在运行的容器,或者只指定一个你想看的容器。输出的是实时流数据,实时更新cpu、内存、io等信息。

$ docker container stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
e9263551f40f        mysql               0.13%               332MiB / 6.087GiB     5.33%               866B / 0B           0B / 0B             38
d4f849b858a9        nginx               0.00%               3.973MiB / 6.087GiB   0.06%               1.05kB / 0B         0B / 0B             2
$ docker container stats nginx
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
d4f849b858a9        nginx               0.00%               3.973MiB / 6.087GiB   0.06%               1.05kB / 0B         0B / 0B             2
$ docker container stats mysql
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
e9263551f40f        mysql               1.98%               332MiB / 6.087GiB   5.33%               866B / 0B           0B / 0B             38

Docker监控命令总结

我们现在知道了如何使用docker容器top命令来列出将在单个容器中运行的所有进程。我们还学习了docker container inspect来查看容器的运行情况以及它的选项和配置是什么。docker container stats命令给我们提供了一个实时更新的终端输出,包括CPU使用率、内存使用率、网络IO和块IO。