重要なDockerコマンドの1つは、dockerinspectです。さまざまなDockerオブジェクトに関する情報を抽出できます。その使用方法は、全員です。 知っておくべきです。
ご参考までに、Dockerオブジェクトまたはリソースは、単にコンテナー、ボリューム、ネットワークなどです。
inspect
の主な強み そのフォーマット機能から来ています。
たとえば、実行中のコンテナのIPアドレスを調べて、特定の方法でフォーマットすることで、そのIPアドレスを抽出できます。
➟ docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx
172.17.0.2
Dockerは、出力のフォーマットにgo-templatesを使用します。
この記事では、最初にDocker inspectコマンドの基本を説明し、次に特定のニーズに合わせて出力をフォーマットする方法に焦点を当てます。
Dockerは何を検査しますか?
Inspectは、dockerによって管理されるすべての異なるオブジェクトに関する一連のメタデータを提供します。情報の種類はオブジェクトごとに異なります。
たとえば、ボリュームを検査すると、ボリュームがいつ作成されたか、使用中のボリュームドライバー、ホストファイルシステム内の場所、ラベルなどに関連する情報が得られます。
検査しているのがネットワークの場合は、サブネット、ゲートウェイ、接続されているコンテナとそのIPアドレス、ラベル、その他の情報などを取得できます。
特定のオブジェクトに対してinspectが提供するものをよりよく理解するには、コマンドを実行して自分で確認することをお勧めします。
検査できるオブジェクトは何ですか?
dockerでは、オブジェクトまたはオブジェクトタイプは、dockerによって制御されるすべての構成要素です。これには以下が含まれます:-
- コンテナ。
- 画像。
- ネットワーク。
- ボリューム。
- コンテキスト。
- プラグイン。
- ノード(群れオブジェクト)。
- サービス(群れオブジェクト)。
- シークレット(群れオブジェクト)。
- 構成(スウォームオブジェクト)。
Dockerinspectコマンドの使用
inspect
を使用する方法は2つあります サブコマンド。
-
docker inspect [object] [options]
-
docker [object_type] inspect [object] [options]
2番目の方法は、常に使用する必要がある方法です。 。 inspect
サブコマンドはJSON出力を提供します。これについては、すぐに説明します。
unique
という名前のボリュームを作成します 。
docker volume create unique
次に、同じ unique
という名前のネットワークを作成します。 。
docker network create unique
それでは、 unique
という名前のオブジェクトを調べてみましょう。 最初の構文を使用します。
docker inspect unique
私の出力:-
➟ docker inspect unique
[
{
"Name": "unique",
"Id": "09a7e2163ee058b1057d95599f764d571ec6a42a5792803dc125e706caa525b0",
"Created": "2021-05-07T15:47:20.341493099+05:30",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
私のシステムでは、ご覧のとおり inspect
ネットワークを検査しましたが、ボリュームを検査するつもりだった場合はどうなりますか?
これはdockerinspect
の問題です 、同じ名前の2つの異なるオブジェクトがある場合、 docker inspect [object_name]
を使用することはできません。 。必要なものを正確に検査するには、オブジェクトのIDを使用するか、-type =[object_type]
を使用する必要があります。 オプション。 -type
を使用して前のコマンドを記述できます そのようなオプション:-
docker inspect --type=volume unique
これは機能しますが、他の構文がすでにあるので、これは不要だと思います。ここで行っているように、オブジェクト固有のサブコマンドを使用できます:-
docker volume inspect unique
書くのは少なく、読むのはずっと簡単です。
このセクションでは、一般的なクエリのリストと、それらの情報を取得するために関連するinspectコマンドがどのように表示されるかを記録します。
例として、サンプルのnginxコンテナーを実行し、すべてのコマンドをこの実行中のコンテナーに対して実行します。このコンテナを実行するために使用したコマンド:-
docker container run \
--rm --name nginx \
-p target=80,published=127.0.0.1:8081,protocol=tcp \
-p target=80,published=[::1]:8081,protocol=tcp \
-e ENV_VAR=somevalue \
-e ENV_VAR2=linux \
-v $PWD:/mnt:ro \
-v /tmp:/tmp:ro \
-d nginx
1。名前によるコンテナのID
次のコマンドを使用して、コンテナのIDを取得できます。-
docker container inspect -f'{{.Id}}' [container_name]
例:-
➟ docker container inspect -f '{{.Id}}' nginx
0409779fc2d976387170d664a6aed5ee80a460f8a8dd02c44a02af97df0bb956
2。コンテナのメインプロセス
メインコンテナプロセスは基本的にENTRYPOINT
+ CMD
。
docker container inspect -f '{{printf "%s " .Path}}{{range .Args}}{{printf "%s " .}}{{end}}' [container_name|id]
例:-
➟ docker container inspect -f '{{printf "%s " .Path}}{{range .Args}}{{printf "%s " .}}{{end}}' nginx
/docker-entrypoint.sh nginx -g daemon off;
3。ポートバインディングの一覧表示
次のコマンドは、すべてのコンテナからホストへのポートバインディングを一覧表示します。
docker container inspect -f '{{range $target, $published := .NetworkSettings.Ports}}{{range $published}}{{printf "%s -> %s:%s\n" $target .HostIp .HostPort}}{{end}}{{end}}' [container_name|id]
例:-
➟ docker container inspect -f '{{range $target, $published := .NetworkSettings.Ports}}{{range $published}}{{printf "%s -> %s:%s\n" $target .HostIp .HostPort}}{{end}}{{end}}' nginx
80/tcp -> ::1:8081
80/tcp -> 127.0.0.1:8081
docker container port
でも同じことができます コマンド。
4。 IPアドレスの一覧表示
コンテナは複数のネットワークに接続できます。これらの多くのIPアドレスの1つを印刷する代わりに、このコマンドを使用してそれらのIPアドレスをすべて印刷できます。
docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_name|id]
例:-
➟ docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx
172.17.0.2
5。環境変数の一覧表示
コンテナの環境変数を一覧表示することもできます。
docker container inspect -f '{{range .Config.Env}}{{printf "%s\n" .}}{{end}}' [container_name|id]
例:-
➟ docker container inspect -f '{{range .Config.Env}}{{printf "%s\n" .}}{{end}}' nginx
ENV_VAR=somevalue
ENV_VAR2=linux
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.19.10
NJS_VERSION=0.5.3
PKG_RELEASE=1~buster
6。ボリューム/バインドマウントとモードの一覧表示
次のコマンドは、バインドマウントを「[source]-> [destination]、mode:[mode]」の形式で出力します。
docker container inspect -f '{{range .Mounts}}{{printf "%s -> %s, mode: %s\n" .Source .Destination .Mode}}{{end}}' [container_name|id]
例:-
➟ docker container inspect -f '{{range .Mounts}}{{printf "%s -> %s, mode: %s\n" .Source .Destination .Mode}}{{end}}' nginx
/home/debdut -> /mnt, mode: ro
/tmp -> /tmp, mode: ro
data-dir / volume
にあるホストの場所を知ることを除いて、ボリュームを検査することはあまりありません。 。次のコマンドでその情報を取得できます:-
docker volume inspect -f '{{.Mountpoint}}' [volume_name|id]
例:-
➟ docker volume create unique
unique
~
➟ docker volume inspect -f '{{.Mountpoint}}' unique
/var/lib/docker/volumes/unique/_data
私が個人的に頻繁に行っているクエリは2つあります。1つは、ネットワークサブネットと、そのネットワークに接続されているすべてのコンテナ、およびそれらに関連付けられているIPを知っていることです。
このために、 docker network create unique
を使用して単純なネットワークを作成しました コマンド。
1。サブネットの取得
サブネットを取得するには、次のコマンドを使用します。-
docker network inspect -f '{{range .IPAM.Config}}{{.Subnet}}{{end}}' [network_name|id]
例:-
➟ docker network inspect -f '{{range .IPAM.Config}}{{.Subnet}}{{end}}' unique
172.21.0.0/16
2。接続されているコンテナとそのIPアドレスを一覧表示する
コマンドは次のようになります
docker network inspect -f '{{range .Containers}}{{printf "%s -> %s\n" .Name .IPv4Address}}{{end}}' [network_name|id]
例:-
➟ docker network inspect -f '{{range .Containers}}{{printf "%s -> %s\n" .Name .IPv4Address}}{{end}}' unique
cranky_wescoff -> 172.21.0.5/16
nginx -> 172.21.0.2/16
upbeat_carson -> 172.21.0.3/16
objective_jones -> 172.21.0.4/16
Dockerinspectコマンドの出力をフォーマットする
inspect
出力用のJSON配列を提供します。これは、 jq
などを使用してフィルタリングできます。 。したがって、 jq
の経験がある場合 、あなたはそれを使いたいかもしれません。 jq
の問題 docker .. inspect
のデフォルトのフォーマットメカニズムは、ほとんどのLinuxディストリビューションにプリインストールされていないということです。 すでにそこにあり、非常に強力です。
Dockerは、go-templatesを使用して出力をフォーマットします。この記事ではgo-templatesについては説明しませんが、詳細を知りたい場合は、ここで読むことができます。
内部的には、JSONはさまざまなGoデータ構造を使用して表されます。これが、goテンプレートが実際にgoデータ型で機能する理由です。これらのデータ構造が何であるかを説明したくないので、これらの用語を使用する代わりに、JSON用語を使用して理解しやすくします。
次のようなJSONオブジェクトについて考えてみます。-
{
"mary": 43,
"john": 44
}
キーmary
に関連付けられている情報を抽出するとします。 。これを行うには、ドット[。]表記を使用します。この表記では、キーの前にドットを付け、ネストされたキーに対して再帰的にキーを追加します。これはjq
と同じです 。つまり、 .mary
ここでは43になります。
次のJSONを今すぐ検討してください。
{
"mary": {
"jane": 43,
"soyas": 56
},
"john": 65
}
この場合、 .mary.jane
43になり、同様に .mary.soyas
56になります。
同様の構文をgo-templatesで使用できます。出力をフォーマットするには、テンプレートを -f
に渡す必要があります または--format
inspect
のオプション サブコマンド。ボリューム検査の出力を修正しましょう。
[
{
"CreatedAt": "2021-05-07T15:53:10+05:30",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/unique/_data",
"Name": "unique",
"Options": {},
"Scope": "local"
}
]
Mountpoint
を知りたい場合 、次のコマンドを使用します:-
docker volume inspect -f '{{.Mountpoint}}' unique
➟ docker volume inspect -f '{{.Mountpoint}}' unique
/var/lib/docker/volumes/unique/_data
おそらくそこにある中括弧に気付いているでしょう。これらはブロックのようなもので、式はこれらのブロック内にカプセル化されています。
今ネストされたものを試してみましょう。ネットワークを調べて、 IPAM
を探します セクション。
➟ docker network inspect unique
<snipped>
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
<snipped>
これを見ると、このネットワークのドライバーが何であるかを非常に簡単に理解できます。ただし、このように探す代わりに、JSON出力全体からフォーマットすることができます。
Driver
に注目してください キーはIPAM
内にネストされています 。したがって、ドライバーを抽出するためのドット式は、 .IPAM.Driver
になります。 。実際の動作をご覧ください:-
➟ docker network inspect -f '{{.IPAM.Driver}}' unique
default
オブジェクトまたはリスト(範囲)をループする
JSONオブジェクトは、Bashまたはハッシュの連想配列のようなもので、キーは文字列であり、値は任意のデータ型にすることができます。
このことを少しわかりやすくするために、実際の例から始めます。 .NetworkSettings.Networks
について考えてみましょう。 コンテナの検査結果のセクション。コンテナが接続されているネットワークと、ネットワークごとに、IPアドレスなどの関連する詳細が一覧表示されます。
誰かがあなたにコンテナのIPアドレスを教えてくれるように頼んだら考えてみてください。 1つのネットワークと関連付けられたIPだけを選択することはあまり意味がありません。より良いのは、すべてのネットワークに関連付けられているすべてのIPアドレスをリストすることです。
これは、 ifの単純なbashforループで実現できます。 あなたはすでにネットワーク名を知っています。私の場合のように、私は次のようなことをすることができます:-
for network in bridge unique; do
docker container inspect -f \
"{{.NetworkSettings.Networks.$network.IPAddress}}" nginx
done
ただし、すべてのネットワーク名を常に覚えているとは限らないため、これは明らかに大規模な制限です。
テンプレートアクションrange
を使用すると、この問題を軽減できます。 。 range
マップ(連想配列またはJSONオブジェクト)を調べて、キーではなく、各反復の値を提供します(この動作は変更可能です)。
したがって、この場合、 {{range .NetworkSettings.Networks}}
のようなブロックを記述できます。 各ネットワークの値または各ネットワークに関連付けられたデータをループし、そこから通常のJSONのような構造から行うようにIPアドレスを抽出できます。つまり、{{。IPAddress}}}コード> 。覚えておくべきことの1つは、
range
で始まるテンプレート全体を常に終了することです。 、 {{end}}
。
これらすべてをまとめると、前のforループを次のように書き直すことができます。-
docker container inspect -f \
'{{range .NetworkSettings.Networks}}
{{.IPAddress}}{{end}}' nginx
サンプル出力:-
➟ docker container inspect -f \
> '{{range .NetworkSettings.Networks}}
> {{.IPAddress}}{{end}}' nginx
172.17.0.2
172.21.0.2
インデックス
の使用 配列とオブジェクトの関数
index
を使用できます JSONオブジェクトまたは配列からパーツを抽出する関数。構造がJSONオブジェクトの場合は、 {{index .Field "key"}}
を使用します。 、構造がJSON配列の場合は、 {{index .Field index}}
を使用します 。
前の例では、コンテナのすべてのIPアドレスを出力しました。接続されているネットワーク(ブリッジ)の1つを知っていて、そのネットワークに関連付けられているIPアドレスを出力するとします。 index
でそれを行うことができます このように機能します:-
docker container inspect -f '{{(index .NetworkSettings.Networks "bridge").IPAddress}}' nginx
出力:-
➟ docker container inspect -f '{{(index .NetworkSettings.Networks "bridge").IPAddress}}' nginx
172.17.0.2
json
の使用 機能
フォーマット後にエクスポートされたデータはない JSONでは、goデータ構造になっています。ただし、 json
を使用して、これをJSONに変換できます。 機能。
JSONオブジェクトの最上位はです。
。したがって、次のようなことを行うように印刷するには:-
docker network inspect -f '{{.}}' unique
➟ docker network inspect -f '{{.}}' unique
{unique 09a7e2163ee058b1057d95599f764d571ec6a42a5792803dc125e706caa525b0 2021-05-07 15:47:20.341493099 +0530 IST local bridge false {default map[] [{172.21.0.0/16 172.21.0.1 map[]}]} false false false {} false map[2646cbbde5efc218bb6f3a5c882f8eb9e3e4331d090ad46ccc0a2eec9c2eea1b:{nginx c0291394a48f7e8e8aa98fd31631eb00e68daacbee9cf24bac530f16359d051d 02:42:ac:15:00:02 172.21.0.2/16 }] map[] map[] [] map[]}
ここに表示されているのは、他の構造体の基本的なデータ型とマップで構成される大きな構造体です。これらはあまり読みやすくなく、外出先でも使用できません。ただし、 json
を使用してこれらをJSONに変換できます 働き。フィールドの前にjson
を追加するだけです 私がここでやっているように:-
➟ docker network inspect -f '{{json .}}' unique
➟ docker network inspect -f '{{json .}}' unique
{"Name":"unique","Id":"09a7e2163ee058b1057d95599f764d571ec6a42a5792803dc125e706caa525b0","Created":"2021-05-07T15:47:20.341493099+05:30","Scope":"local","Driver":"bridge","EnableIPv6":false,"IPAM":{"Driver":"default","Options":{},"Config":[{"Subnet":"172.21.0.0/16","Gateway":"172.21.0.1"}]},"Internal":false,"Attachable":false,"Ingress":false,"ConfigFrom":{"Network":""},"ConfigOnly":false,"Containers":{"2646cbbde5efc218bb6f3a5c882f8eb9e3e4331d090ad46ccc0a2eec9c2eea1b":{"Name":"nginx","EndpointID":"c0291394a48f7e8e8aa98fd31631eb00e68daacbee9cf24bac530f16359d051d","MacAddress":"02:42:ac:15:00:02","IPv4Address":"172.21.0.2/16","IPv6Address":""}},"Options":{},"Labels":{}}
見栄えを良くするには、 jq
にパイプします。 。
➟ docker network inspect -f '{{json .}}' unique | jq
{
"Name": "unique",
"Id": "09a7e2163ee058b1057d95599f764d571ec6a42a5792803dc125e706caa525b0",
"Created": "2021-05-07T15:47:20.341493099+05:30",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"2646cbbde5efc218bb6f3a5c882f8eb9e3e4331d090ad46ccc0a2eec9c2eea1b": {
"Name": "nginx",
"EndpointID": "c0291394a48f7e8e8aa98fd31631eb00e68daacbee9cf24bac530f16359d051d",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
それですか?絶対違う。 goテンプレートの使用方法について読むことを強くお勧めします。
ここでは、goテンプレートについてまったく知らなくても、使用を開始しようとしました。私は成功したと思います。
ご不明な点がございましたら、コメントセクションをご利用ください。