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

DockerコンテナのIPアドレスを取得する方法

実行中のDockerコンテナのIPアドレスは何ですか?実行中のコンテナを調べて、その情報を取得できます。

sudo docker container inspect container_name_or_ID
コンテナの名前やIDがわかりませんか?コマンドsudo docker psを使用します 。

inspect コマンドは、検査しているコンテナに関する多くの詳細を提供します。最後に移動して、Networksを調べます コンテナのIPアドレスを取得するセクション。

grepコマンドを使用して、文字列「IPAddress」に一致する行だけを取得することもできます。

コンテナに複数のIPアドレスがある場合でも心配する必要はありません。それは珍しいことではありません。それを理解するには、コンテナが互いにどのように通信するかを理解する必要があります。

次のセクションで説明し、続いて実行中のDockerコンテナのIPアドレスを取得する他の方法をいくつか説明します。

Dockerコンテナーはどのように通信しますか?

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
DockerコンテナのIPアドレスを確認する

コンテナに関連付けられている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アドレスを取得できます。

今日は以上です。この記事がお役に立てば幸いです。ご不明な点がございましたら、下のコメント欄でお知らせください。


Docker
  1. 実行中のDockerコンテナでコマンドを実行する方法

  2. Dockerコンテナに静的IPを割り当てる方法

  3. Dockerコンテナを終了する方法

  1. Dockerを使用してWordPressをインストールする方法

  2. Dockerコンテナ内でプログラムを実行する方法は?

  3. Docker でコンテナに関する情報を取得する方法

  1. DockerコンテナでMySQLを実行する方法

  2. DockerコンテナにSSHで接続する方法

  3. DockerコンテナにVimをインストールする方法