Docker
コンテナ
調べる

ドッカーコンテナの検査

この記事では、docker container inspectコマンドの使い方を学ぶ。 dockerコンテナのIP、ポート、名前、ステータス、内部パス、容量、ログ、ネットワークをチェックする方法をまとめます。

1. Dockerコンテナの確認コマンド

Dockerコンテナの一般的な情報を確認するには、2つのコマンドがあります。

1.1.詳細情報のためのinspectコマンド

最初のコマンドは、コンテナの詳細を表示する inspect コマンドである。 このコマンドを使うと、1つまたは複数のコンテナの詳細を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. formatオプションにGoテンプレートを使う [#1.2].

DockerはGo言語で書かれており、並行性のコントロールに優れているため、Goの構文を借りていることに気づくでしょう。 inspectコマンドの--formatオプションは、そのようなGo構文の借用の一例です。

以下は Go の text/template の簡単な例だが、理解しようとしないで、ただ見てほしい。 重要なのは t, _ = t.Parse("Name: {.Name} }, Age: {.Age} }n") という行です。 Goテンプレートが中括弧2つとドット1つで 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公式ドキュメントのFormatting commands and log output page (opens in a new tab)を参照してください。直感的に説明されているので、すぐに理解できるはずです。

リアルタイムな情報を確認できる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つのコマンドに基づいて特定の情報を出力する方法を順番に見ていきましょう。

2. 名前とステータスの取得

ls コマンドと inspect コマンドを使用すると、コンテナの名前とステータスを出力できます。 前者は相対時間、後者は絶対時間を表すので、必要に応じてどちらかを選択すればよい。

ls は相対時間を表示する。

コンテナの名前と状態を取得する方法はいくつかある。 一つ目は docker container ls (--all) コマンドである、 コンテナの実行コンテナの停止/終了で既に見た。

以下に示すように、コンテナ名とステータスの簡単なリストを取得できます。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

tabletablet というキーワードは表のように出力するコマンドである。セクション1.2 を参照。

inspect による絶対時間の出力

上記のように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} }キーワードは囲碁テンプレートのループとして機能する。 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 オプションを付けて実行する。

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

上の例の最後のプロンプトのように、シェルを終了するには exit とタイプする。

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 オプションは、直近の 50 s (秒)、30 m (分)、5 h (時間) のログだけを表示するのにも便利である。

$ 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

このコマンドは、上記のようにネットワーク名のリストを表示する。ここで、ネットワーク名の詳細を表示するには、次のように Network Name with コマンドを使用する。

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

ネットワーク情報のより詳細な議論については、今後のDocker Networkの投稿で取り上げる予定である。

8. 最終的な考察

この投稿では、Dockerコンテナの検証コマンドについて学んだ。 DockerコンテナのIPを確認する方法を知りたいときにお役に立てれば幸いです、 ポート、名前、ステータス、内部パス、容量、ログ、ネットワーク。

copyright for docker container inspect

© 2023 All rights reserved.