実行中のDockerコンテナのIPアドレスは何ですか?実行中のコンテナを調べて、その情報を取得できます。
sudo docker container inspect container_name_or_ID
コンテナの名前やIDがわかりませんか?コマンドsudo docker ps
を使用します 。
inspect
コマンドは、検査しているコンテナに関する多くの詳細を提供します。最後に移動して、Networks
を調べます コンテナのIPアドレスを取得するセクション。
grepコマンドを使用して、文字列「IPAddress」に一致する行だけを取得することもできます。

コンテナに複数のIPアドレスがある場合でも心配する必要はありません。それは珍しいことではありません。それを理解するには、コンテナが互いにどのように通信するかを理解する必要があります。
次のセクションで説明し、続いて実行中のDockerコンテナのIPアドレスを取得する他の方法をいくつか説明します。
Dockerは、コンテナー化テクノロジーを使用してソフトウェアをパッケージ化し、大衆に配信するためのツールです。ソフトウェアには、単純なテキスト処理から、プライベートファイルをホストする完全なWebサーバーまで、さまざまな目的があります。これらの各ソフトウェアはマイクロサービスに分割され、コンテナーとしてパッケージ化されます。ソフトウェアの目的によっては、あるサービスが別のサービスと通信する必要がある場合があります。
たとえば、WordPressについて考えてみましょう。 2つのサービスがあります。1つはフロントエンドにサービスを提供するWebサーバーであり、もう1つはバックエンドであるデータベースです。フロントエンドはデータベースと通信する必要があります。そうしないと、機能しません。
この通信は、これら2つのコンテナのそれぞれに少なくとも2つのネットワークインターフェースを関連付け、両方のインターフェースを同じネットワークに接続することで実現されます。 このネットワークは「Dockerネットワーク」と呼ばれます。
Dockerネットワークは、利用可能なIPアドレスのプールと考えてください。 2つのコンテナが同じプールからIPアドレスを取得する場合、それらは相互に通信できるようになります。
ネットワークには主に、デフォルトまたは事前定義されたネットワークとユーザー定義ネットワークの2種類があります。
次のコマンドを使用して、ネットワークのリストを取得できます
docker network ls
以下の私のリストを検討してください:
❯ docker network ls
NETWORK ID NAME DRIVER SCOPE
272ff2e44dc2 bridge bridge local
5e4a3f5e99dd host host local
cdaef1e49ddc none null local
最後の2つを無視して、最初のネットワークに焦点を合わせます。 bridge
networkは、明示的に指定されていない場合、すべてのコンテナが接続されるデフォルトのネットワークです。 docker network inspect bridge
を実行すると、このネットワークの詳細を取得できます。 指図。
このデモンストレーションでは、inspect
するすべてのデータは必要ないため、出力をフィルタリングします。 爆発します。
❯ docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Subnet
172.17.0.0/16
jqがインストールされていない場合は、ディストリビューションのパッケージマネージャーを使用してインストールしてください。
bridge
の場合、これらの各Dockerネットワークにはサブネットがあります。 ネットワークの場合、このサブネットは172.17.0.0/16です。これは、合計65,534-1=65,533の使用可能なホストまたはIPアドレスがあることを意味します。 172.17.0.1がゲートウェイに割り当てられているので、1つ差し引きました。次のコマンドを使用して、それも確認できます
docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Gateway
コンテナに関連付けられているIPアドレスを確認する方法はいくつかあります。コマンド例を含むすべての方法のリストを次に示します。
方法1:コンテナを検査する
inspect
dockerのサブコマンドは非常に役立ちます。コンテナは、docker container inspect [CONTAINER ID]|[CONTAINER NAME]
を使用して検査できます。 指図。
コンテナを検査するということは、ポート、環境変数からマウントポイント、cgroupデータなど、コンテナに関するできるだけ多くの情報を取得することを意味します。IPアドレスはコンテナから抽出できます。
inspect
を実行した場合 コンテナでコマンドを実行すると、JSON形式で大量の情報を取得できます。キーNetworkSettings
が見つかるまで下にスクロールします 、サブキーIPAddress
を探します 。これがコンテナのIPアドレスです。
実行するコマンドは次のようになります
docker container inspect [CONTAINER ID]|[CONTAINER NAME]
これが私の出力です(切り捨てられました)
> docker container inspect ubuntu-ip
.
.
.
"NetworkSettings": {
.
.
.
"IPAddress": "172.17.0.2",
.
.
.
すべてをスクロールする代わりに、次のように出力をフィルタリングできます。
docker container inspect -f '{{ .NetworkSettings.IPAddress }}' CONTAINER_ID_OR_NAME
フィルタリングされた出力は次のとおりです。
❯ docker container inspect -f '{{ .NetworkSettings.IPAddress }}' ubuntu-ip
172.17.0.2
特定のネットワークに関連付けられたIPアドレスを取得する場合は、次のようなコマンドを使用します
docker container inspect -f '{{ .NetworkSettings.Networks.[NETWORK NAME].IPAddress }}' CONTAINER_ID_OR_NAME
サンプル出力:
❯ docker container inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' ubuntu-ip
172.17.0.2
方法2:コンテナのシェルを使用する
これは最も簡単な方法ですが、お勧めしない方法でもあります 。
このメソッドでは、stdin | stdoutをコンテナにアタッチし、ip
を実行します。 コマンド(またはNICに関連付けられたIPアドレスを表示するその他のコマンド)。
これをお勧めしない理由は、多くの画像が非常に軽量で、ip
が含まれていないためです。 コマンド(または同様のもの)。
ubuntu:20.04
を取得します 例として画像、次のようなコンテナを開始します
docker run --rm --name ubuntu-ip -d ubuntu:20.04 sleep 1d
コンテナを実行し続けるために、sleep 1d
を使用しました コマンド。
次に、コンテナ内でシェルプロセスを開始し、stdin|stdoutをそのようにアタッチします
docker exec -ti ubuntu-ip sh
このコンテナに入ったら、ip
を実行してみてください またはifconfig
。次のようなものが表示されます:
❯ docker exec -ti ubuntu-ip sh
# ip
sh: 1: ip: not found
# ifconfig
sh: 2: ifconfig: not found
これらのコマンドを機能させるには、関連するパッケージをインストールする必要があります。 ip
を取得するには コマンド、iproute2
をインストールします コマンドをパッケージ化してip a
として再実行します
# apt update -qq
6 packages can be upgraded. Run 'apt list --upgradable' to see them.
# apt install iproute2 -yqq
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
これで、カード[email protected]
に関連付けられたIPアドレスを確認できます。 172.17.0.2である
このコンテナが含まれているネットワークに注意してください。ユーザー定義のネットワークを作成してこのコンテナーに接続しなかったため、ブリッジネットワークに接続されました。これが、このIPのネットワークが172.17.0.0である理由です。
この方法は確かに機能しますが、作業量が多く、再現性はあまり高くありませんが、直感的です。次の方法は、これに比べてはるかに優れているはずです。
方法3:ネットワーク自体を検査する
コンテナがネットワークに接続されると、その接続されたコンテナは、それらのコンテナに割り当てられたIPアドレスとともにネットワークからも表示されます。
コンテナがブリッジネットワークに接続されているので、次のコマンドでネットワークを検査できます
docker network inspect [NETWORK NAME][NETWORK ID]
ここでは、IDの代わりに、bridge
という名前を使用します
docker network inspect bridge
Containers
までスクロールダウンする代わりに セクションでは、jq
を使用します 今回は出力をフィルタリングします。
❯ docker network inspect bridge | jq .[].Containers
{
"1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba": {
"Name": "ubuntu-ip",
"EndpointID": "44d6b85348d6274b4ee779f9d3617d184ccfd3bad228ee652141d9b4157c50ae",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"50a4f195d8eae6b6b714e8aa058c6058dbe91d0a272c8ca826d4442df1c63885": {
"Name": "ip",
"EndpointID": "d4e72a4df81ee7023386df9d96676d9c291e2902349eb453338b8e0145a610fd",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
}
これを示すために、ip
という名前の別のコンテナーをデプロイしました。 。上記のJSONオブジェクトでコンテナとIPアドレスを確認できます。ここで、特定のコンテナのIPを抽出するのは少し難しくなります。
コンテナIDがわかっている場合は、jq
を使用できます。 このように
docker network inspect bridge | jq '.[].Containers."[CONTAINER ID]".IPv4Address'
これが例です
❯ docker network inspect bridge | jq '.[].Containers."1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba".IPv4Address' -r
172.17.0.2/16
ほとんどの場合、コンテナIDを思い出せないため、コンテナ名のみからIPを取得する場合は、jq
の知識が必要です。 (または次のコマンドを再利用します)。
docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="[CONTAINER NAME]") | .IPv4Address else empty end' -r
コンテナ名をselect
に配置します 機能し、魔法が起こるのを見てください。
❯ docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="ubuntu-ip") | .IPv4Address else empty end' -r
172.17.0.2/16
どちらの方法が好きですか?方法1おそらく
これらはすべて、DockerコンテナのIPアドレスを取得するための方法でした。 2番目の方法は、直感的ではありますが再現性がありません。ほとんどの場合、これが最も簡単で作業を完了するために使用される最初の方法です。
ただし、特定のネットワークに接続されているコンテナを確認して、そのネットワークのIPアドレスを取得したい場合があります。その場合、ネットワークを検査してIPを取得することは理にかなっています。このようなネットワークから、割り当てられたすべてのコンテナ名とIPを取得できます
❯ docker network inspect -f '{{json .Containers}}' bridge | \
jq '.. | if type=="object" and has("Name") then {(.Name): .IPv4Address} else empty end'
{
"ubuntu-ip": "172.17.0.2/16"
}
{
"ip": "172.17.0.3/16"
}
bridge
を変更します 他のネットワークに接続すると、このようにすべてのコンテナとそのIPアドレスを取得できます。
今日は以上です。この記事がお役に立てば幸いです。ご不明な点がございましたら、下のコメント欄でお知らせください。