ドッカーコンテナの検査
この記事では、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": {}
}
]
Id
と Name
の項目はコンテナの一意な ID と名前であり、Path
と Args
の項目はコンテナの作成時に実行されるファイルやコマンドである、
State
項目はコンテナの現在の状態を示す。
ResolveConfPath
、HostnamePath
、HostsPath
、HostConfig
項目には、Docker ホスト環境を設定するファイルパスや設定文が格納される、
Image
、NetworkSettings
、GraphDriver
項目には、コンテナのイメージ、ネットワーク、ストレージ環境が表示される。
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
オプションを追加する。
情報が出力された後、プロンプトが戻ることに気づくだろう。
では、この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
table
と tablet
というキーワードは表のように出力するコマンドである。セクション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を確認する方法を知りたいときにお役に立てれば幸いです、 ポート、名前、ステータス、内部パス、容量、ログ、ネットワーク。
