GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

DockerInspectコマンドの使用方法

重要な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によって制御されるすべての構成要素です。これには以下が含まれます:-

  1. コンテナ。
  2. 画像。
  3. ネットワーク。
  4. ボリューム。
  5. コンテキスト。
  6. プラグイン。
  7. ノード(群れオブジェクト)。
  8. サービス(群れオブジェクト)。
  9. シークレット(群れオブジェクト)。
  10. 構成(スウォームオブジェクト)。

Dockerinspectコマンドの使用

inspectを使用する方法は2つあります サブコマンド。

  1. docker inspect [object] [options]
  2. 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

書くのは少なく、読むのはずっと簡単です。

いくつかの便利なDocker検査コマンドの例

このセクションでは、一般的なクエリのリストと、それらの情報を取得するために関連する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テンプレートについてまったく知らなくても、使用を開始しようとしました。私は成功したと思います。

ご不明な点がございましたら、コメントセクションをご利用ください。


Docker
  1. LinuxでSuコマンドを使用する方法

  2. DockerComposeの使用方法

  3. プロキシを使用するように docker を構成する方法

  1. vmstatコマンドの使用方法

  2. WindowsでTelnetを使用する方法

  3. docker logs コマンドで --since オプションを使用する方法

  1. LinuxでDisownコマンドを使用する方法

  2. LinuxSSコマンドの使用方法

  3. Linuxnohupコマンドの使用方法