ホストからDockerコンテナーのIPアドレスを取得する方法


1412

新しいコンテナが作成された後、ホストから直接コンテナのIPアドレスを取得するために実行できるコマンドはありますか?

基本的に、Dockerがコンテナーを作成したら、独自のコードデプロイメントおよびコンテナー構成スクリプトをロールバックします。


28
他の初心者が間違いを犯さないようにして、コンテナーではなくイメージからIPを取得しようとしただけです。CIDまたはコンテナーIDを取得し、それを照会してください。CIDは「docker ps」です。
Paul Gregoire

逆の方法は?ホストIPまたはコンテナーからの呼び出し?
Somnath Muluk、2018年

回答:


2330

--formatオプションがinspect助けになります。

最新のDockerクライアント構文は次のとおりです。

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

古いDockerクライアントの構文は次のとおりです。

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

これらのコマンドは、DockerコンテナーのIPアドレスを返します。

コメントで述べたように:Windowsを使用している場合は、中括弧"を一重引用符ではなく二重引用符で'囲みます。


34
これははるかに優れたソリューションです。可能であれば、必要なものだけを尋ねてください!
MikeyB 2014年

8
うーん。<no value>Fig / Boot2Dockerを使用してMacで応答を取得する
cevaris

2
@cevaris <no value>実行されていないコンテナに対してこれを実行しようとすると取得されます。これを行う前に、コンテナが実行されていることを確認してください。
TheJediCowboy 2015

55
!警告!これはもう機能しません。新しい形式はコンテナに固有であり、フォームに従います{{ .NetworkSettings.Networks.$network.IPAddress }}。デフォルトはブリッジのように見えますが、docker-composeでは、これはアプリの名前に依存する特定の名前になります(--project-nameフラグから考えますが、これはネットワーク構成のタイプにも依存します)あなたが設定した)。私はここの回答で、完全な答えを書いたstackoverflow.com/questions/17157721/...
ダンク

5
多分私は眠そうな羊ですが、二重引用符に関する警告は私の注意を引くのに十分なほど大胆で点滅していませんでした。LinuxとWindowsと明確にラベル付けされた2つの例を提供するかもしれません。私は文字通り例を入力し、単一引用符も使用するドキュメントチェックしてから、エラーをグーグル化しました。きっと一人じゃない。
Wyck

513

使用できますdocker inspect <container id>

例えば:

CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID

67
IPを抽出するために、次のようなことを行うことができますdocker inspect $CID | grep IPAddress | cut -d '"' -f 4。これは正常に機能します:)
2013年

9
すべて一緒にそれをもたらす、このシェルのエイリアスは、すべてのコンテナのIDとそのIPをリストする必要があります:alias dockerip='docker ps | tail -n +2 | while read cid b; do echo -n "$cid\t"; docker inspect $cid | grep IPAddress | cut -d \" -f 4; done'
KO-DOS

64
@ user3119830で言及されているように、検査する新しいオプションがあります。今、あなたはIpをより簡単に得ることができますdocker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
14:48に

16
ただのメモ。-formatが--formatになるように、単一のダッシュオプションは非推奨になっています。
jamtur01 14年

7
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}新しい構文です。-formatは非推奨です--format
Devy

408

最初にコンテナIDを取得します。

docker ps

(最初の列はコンテナーID用です)

コンテナIDを使用して実行します。

docker inspect <container ID>

下部の[NetworkSettings]の下に、[IPAddress]があります。

またはちょうど行います:

docker inspect <container id> | grep "IPAddress"

5
残念ながら、私のインスタンスの1つ(で始まるdocker run -it MYCONTAINER /bin/bash)では、の出力にinspectセクションがありませんNetworkSettings
Eric

3
これはWindows 10では機能しません。DocconfigでDockerNATのIPアドレスを調べる必要があります。
ntiedt 2017年

@Ericはまた、そのためのネットワークブリッジを検査することができます:docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
トマシュKapłoński

5
私は、... | grep IPIPを取得するために必要なすべてのフォーマットの詳細に対するソリューションを非常に好みます。+1
d8aninja

1
@Eric- コンテナーイメージを混同します。コマンドは実際にはdocker run -it MYIMAGEコンテナー名ではありません)です。あなたがしなければdocker inspect MYIMAGE、あなたはについての静的な情報を取得します画像を実行中のコンテナの名前を見つける必要があります(または他の人が示唆するようにそのIDを使用します)。私のシステムでは、そのイメージから作成された最初のコンテナはデフォルトでname MYIMAGE_1に設定されているため、docker inspect MYIMAGE_1NetworkSettingsがあります。
ToolmakerSteve

216
docker inspect CONTAINER_ID | grep "IPAddress"

-i大文字と小文字を区別しないようにgrepに追加すると、次のように動作します。

docker inspect CONTAINER_ID | grep -i "IPaDDreSS"

5
この回答は他の22とどのようによく/異なっていますか?
sds 2017年

これは間違いなく最良の答えではありません。WouterDの答えはあなたが探している答えです。
M.Vanderlee

7
@ M.Vanderleeこの回答には覚えやすいコマンドが含まれているため、IMOの方が適切な回答になります。
huysentruitw 2018

1
@WouterHuysentruitもちろん、複数のエントリと実際の「IPAddress」テキストを取得します。それ以上操作しないとスクリプトで使用できません。
M.Vanderlee 2018

あなたが正しい。質問の文脈では、他の答えの方が適しています。
huysentruitw 2018

133

すべてのコンテナ名とそのIPアドレスを1つのコマンドで取得します。

docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)

docker-composeコマンドを使用している場合は、次のようになります。

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

出力は次のようになります。

/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2

5
私はこれが本当に好きですが、Docker Composeでも機能しません。独自のネットワークがあるためです。代わり{{.NetworkSettings.IPAddress }}{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
clockworkgeek

使用するバリエーションは次のとおりdocker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'です。sed(1)コンテナの存在のために、空の行を削除しますが、IPアドレスを持っていません。
NYCeyes

97

このシェルスクリプトを~/.bashrc関連ファイルに追加します。

docker-ip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

次に、コンテナーのIPアドレスを取得するには、次のようにします。

docker-ip YOUR_CONTAINER_ID

Dockerの新しいバージョンについては、以下を使用してください。

docker-ip() {
        docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}

5
Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings"
saiyancoder 16

これは私にとっては機能しますが、必要がありますsource ~/.bash_profile
ペニーちゃん

1
実行中のコンテナを検査せず、画像だけを検査すると、このエラーが表示されます...画像にIPAddressがありません...恐ろしいエラーメッセージ、はい
dagelf

37

すべてのコンテナのIPアドレスを表示:

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

37

Docker 1.3以降では、次の方法でも確認できます。

実行中のDocker(Linux)を入力します。

docker exec [container-id or container-name] cat /etc/hosts
172.17.0.26 d8bc98fa4088
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.17 mysql

Windowsの場合:

docker exec [container-id or container-name] ipconfig

1
またはただdocker exec [container-name-or-id] ip a
ステファン・リヒター

Windows用docker exec [container-id or container-name] ipconfig
GreatAndPowerfulOz

27

Dockerバージョン1.10.3以降、20f81ddをビルドします

他にDockerに指示しない限り、Dockerは常にブリッジネットワークでコンテナーを起動します。したがって、以下のコマンドを試すことができます。

docker network inspect bridge

次に、実行中のコンテナのIPアドレスを表示するContainersセクションを返します。

[
    {
        "Name": "bridge",
        "Id": "40561e7d29a08b2eb81fe7b02736f44da6c0daae54ca3486f75bfa81c83507a0",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Containers": {
            "025d191991083e21761eb5a56729f61d7c5612a520269e548d0136e084ecd32a": {
                "Name": "drunk_leavitt",
                "EndpointID": "9f6f630a1743bd9184f30b37795590f13d87299fe39c8969294c8a353a8c97b3",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        }
    }
]

コンテナーセクションが空の場合はどういう意味ですか?しかし、コンテナは稼働しています。
StackEdd 2018年

24

実行:

docker ps -a

これにより、アクティブなDockerイメージが表示されます。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
3b733ae18c1c        parzee/database     "/usr/lib/postgresql/"   6 minutes ago       Up 6 minutes                 5432/tcp            serene_babbage

CONTAINER ID値を使用します。

docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1

「172.17.0.2」


23

私が気に入ったいくつかの回答に基づいて、すべてのIPアドレスを取得する関数と、特定のコンテナーの別のものをマージすることにしました。彼らは今私の.bashrcファイルにあります。

docker-ips() {
    docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}

docker-ip() {
  docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}

最初のコマンドはすべてのコンテナーのIPアドレスを与え、2番目のコマンドは特定のコンテナーのIPアドレスを与えます。

docker-ips
docker-ip YOUR_CONTAINER_ID

16

名前でコンテナを参照:

docker run ... --name pg-master

次に、IPアドレスを名前で取得します。

MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)

15

下で実行されてdocker-composeいるすべてのコンテナからIPアドレスのテーブルを取得するために、次のBashスクリプトを作成しました。

function docker_container_names() {
    docker ps -a --format "{{.Names}}" | xargs
}

# Get the IP address of a particular container
dip() {
    local network
    network='YOUR-NETWORK-HERE'
    docker inspect --format "{{ .NetworkSettings.Networks.$network.IPAddress }}" "$@"
}

dipall() {
    for container_name in $(docker_container_names);
    do
        local container_ip=$(dip $container_name)
        if [[ -n "$container_ip" ]]; then
            echo $(dip $container_name) " $container_name"
        fi
    done | sort -t . -k 3,3n -k 4,4n
}

変数networkを独自のネットワーク名に変更する必要があります。


1
ここからのTuong Le回答stackoverflow.com/questions/17157721/…dip()でネットワークを指定する必要を回避:docker inspect --format '{{range .NetworkSettings.Networks}} {{。IPAddress}} {{end} } '"$ @"
JoanComasFdz

1
@JoanComasFdzありがとうございます
Chagai Friedlander

14

これが簡単に機能する答えです:

コンテナの名前またはIDを取得します。

docker container ls

次に、IPを取得します。

docker inspect <container_ID Or container_name> |grep 'IPAddress'

ポートを取得します。

docker inspect <container_ID Or container_name> |grep 'Port'

13

DockerはGoで記述されており、クエリの目的でもGo構文を使用します。

特定のコンテナのIPアドレスを検査するには、次のコマンドを実行する必要があります(-f「フォーマット」用):

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name

コンテナーIDまたは名前については、コマンドを実行できます

docker container ls

実行中のすべてのコンテナがリストされます。


1
これは非常に便利です。独自のGoクエリを作成するためのドキュメントはどこにありますか?
マイケルホフマン

12

docker inspect containerJSON出力をデータソースとして使用して、今日Pythonで開発したソリューションを次に示します。

検査しなければならないコンテナとインフラストラクチャがたくさんあり、あらゆるコンテナから基本的なネットワーク情報を迅速かつ迅速に取得する必要があります。 きれいな方法でます。だから私はこのスクリプトを作りました。

重要:バージョン1.9以降、Dockerでは複数のネットワークを作成してコンテナに接続できます。

#!/usr/bin/python

import json
import subprocess
import sys

try:
    CONTAINER = sys.argv[1]
except Exception as e:
    print "\n\tSpecify the container name, please."
    print "\t\tEx.:  script.py my_container\n"
    sys.exit(1)

# Inspecting container via Subprocess
proc = subprocess.Popen(["docker","inspect",CONTAINER],
                      stdout=subprocess.PIPE,
                      stderr=subprocess.STDOUT)

out = proc.stdout.read()
json_data = json.loads(out)[0]

net_dict = {}
for network in json_data["NetworkSettings"]["Networks"].keys():
    net_dict['mac_addr']  = json_data["NetworkSettings"]["Networks"][network]["MacAddress"]
    net_dict['ipv4_addr'] = json_data["NetworkSettings"]["Networks"][network]["IPAddress"]
    net_dict['ipv4_net']  = json_data["NetworkSettings"]["Networks"][network]["IPPrefixLen"]
    net_dict['ipv4_gtw']  = json_data["NetworkSettings"]["Networks"][network]["Gateway"]
    net_dict['ipv6_addr'] = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6Address"]
    net_dict['ipv6_net']  = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6PrefixLen"]
    net_dict['ipv6_gtw']  = json_data["NetworkSettings"]["Networks"][network]["IPv6Gateway"]
    for item in net_dict:
        if net_dict[item] == "" or net_dict[item] == 0:
            net_dict[item] = "null"
    print "\n[%s]" % network
    print "\n{}{:>13} {:>14}".format(net_dict['mac_addr'],"IP/NETWORK","GATEWAY")
    print "--------------------------------------------"
    print "IPv4 settings:{:>16}/{:<5}  {}".format(net_dict['ipv4_addr'],net_dict['ipv4_net'],net_dict['ipv4_gtw'])
    print "IPv6 settings:{:>16}/{:<5}  {}".format(net_dict['ipv6_addr'],net_dict['ipv6_net'],net_dict['ipv6_gtw'])

出力は次のとおりです。

$ python docker_netinfo.py debian1

[frontend]

02:42:ac:12:00:02   IP/NETWORK        GATEWAY
--------------------------------------------
IPv4 settings:      172.18.0.2/16     172.18.0.1
IPv6 settings:            null/null   null

[backend]

02:42:ac:13:00:02   IP/NETWORK        GATEWAY
--------------------------------------------
IPv4 settings:      172.19.0.2/16     172.19.0.1
IPv6 settings:            null/null   null

スクリプトでpython2.7に変更してください。python3が一般的に使用されているか、2つのバージョンを記述しています
42n4

Gistを更新し、入手したらすぐにここに投稿します。実際、このラッパーはPython 2.7用に設計されました。フィードバックをお寄せいただきありがとうございます!
ivanleoncz

9
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>

上記は、コンテナがデフォルトのブリッジネットワークにデプロイされている場合に機能します。

ただし、カスタムブリッジネットワークまたはオーバーレイネットワークを使用している場合は、以下の方がうまくいくことがわかりました。

docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

9

ko-dosの回答を拡張するために、すべてのコンテナー名とそのIPアドレスをリストするエイリアスを次に示します。

alias docker-ips='docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect $name | grep IPAddress | cut -d \" -f 4; done'

1
それはかなり単純化することができます- docker ps -qを避けるために使用しますtail、そして--formatのgrepを避けるために。またdocker inspect、シェルでループするのではなく、複数のコンテナIDを渡すことができます。
ブライアン

1
docker ps -qコンテナの数値IDのみを表示しますが、名前を使用する方が良いと思います。tail最初の行(テーブルヘッダー)を削除するだけで、まだ必要です。私は使用することができ--formatますが、: docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect --format="{{.NetworkSettings.IPAddress}}" $name | cut -d \" -f 4; done。しかし、それは大きな改善のようには見えません... grepより読みやすいIMOでした。
マルコロイ

1
最初にIPをリストする、わずかに変更されたバージョン。コンテナー名と一緒に1行で表示されます:docker ps | 尾-n +2 | 読み取り中-aa; do name = $ {a [$(($ {#a [@]}-1))]}; docker inspect $ name | grep "IPAddress。* [0-9] \ +" | cut -d \ "-f 4 | tr" \ n "" "; echo -e" \ t $ {name} ";完了
ギリアド

終了docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
antogerva

9

私はこの簡単な方法を使用します

docker exec -it <container id or name> hostname -i

例えば

ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
10.0.1.5

7

Docker Toolboxを使用してDockerをインストールした場合は、Kitematicアプリケーションを使用してコンテナーのIPアドレスを取得できます。

  1. コンテナを選択
  2. 設定をクリックします
  3. [ポート]タブをクリックします。

私にとって、IPアドレスは[ホスト名/ポート]タブにありましたが、これは非常に役立つ回答でした。docker inspectdocker toolboxを実行すると機能しないことに注意してください。IPアドレスを報告しますが、サービスが使用する正しいアドレスではありません。
ヨーラン・Roseen

7

コンテナのIPアドレスとホストポートを取得するには:

docker inspect containerId | awk '/IPAddress/ || /HostPort/'

出力:

    "HostPort": "4200"
                    "HostPort": "4200"
        "SecondaryIPAddresses": null,
        "IPAddress": "172.17.0.2",
                "IPAddress": "172.17.0.2",

7

注意!!!Docker Composeの使用法:

Docker Composeはクラスタごとに分離されたネットワークを作成するため、以下の方法はでは機能しませんdocker-compose


最もエレガントで簡単な方法は、シェル関数を定義することです。現在最も投票されている回答は@WouterDです。

dockip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

DockerはLinuxプログラムのようなファイルにコンテナーIDを書き込むことができます。

で実行 --cidfile=filename、DockerはコンテナのIDを「filename」にダンプします。

詳細については、「DockerがPIDに相当するセクションを実行する」を参照してください。

--cidfile="app.cid": Write the container ID to the file

PIDファイルの使用:

  1. --cidfileパラメータでコンテナを実行すると、app.cidファイルの内容は次のようになります。

    a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
    
  2. ファイルの内容を使用して、Dockerコンテナーを検査できます。

    blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
    
  3. インラインPythonスクリプトを使用してコンテナIPを抽出できます。

    $ docker inspect `cat app.cid` | python -c "import json;import sys;\
    sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])"
    172.17.0.2
    

これはより人間に優しい形式です:

#!/usr/bin/env python
# Coding: utf-8
# Save this file like get-docker-ip.py in a folder that in $PATH
# Run it with
# $ docker inspect <CONTAINER ID> | get-docker-ip.py

import json
import sys

sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])

詳細については、「DockerコンテナのIPアドレスを取得する10の方法」を参照してください。



5

これにより、ホスト上のすべてのコンテナIPが一覧表示されます。

sudo docker ps -aq | while read line;  do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done

5

Docker inspectを使用して、すべてのコンテナIPとそのそれぞれの名前を出力します

docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'

5

完全を期すために:

私はこの--formatオプションが本当に好きですが、最初はそれを意識していなかったので、単純なPythonワンライナーを使用して同じ結果を得ました。

docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'

これが一番いい答えです。-また、別の答えを参照stackoverflow.com/a/36306632/432903
prayagupd

5

以前の回答とDockerイメージ名に基づくコンテナーIDの検索を組み合わせる:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`

4

使用する:

docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1

これは実際の単一行の適切なコマンドです。これが私が手に入れたものです。 $ docker inspect c4591485328d | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1 172.17.0.2
Jayant Bhawal

4

以下のためのWindowsのコンテナの使用

docker exec <container> ipconfig

どこ<container>名前IDコンテナのは。

を使用docker psしてコンテナのIDを見つけることができます。


「—rm」を使用することを忘れないでください。そうしないと、削除されていないレイヤーがあると、ハードドライブの容量が徐々に消費されます。ほとんどすべての場合、「-rm」と「run」をペアにすることをお勧めします。
Contango 2017年

@Contango:「docker exec」は、すでに実行中のコンテナでコマンドを実行します。--rmスイッチはありません。docs.docker.com/engine/reference/commandline/exec
kirodge

4

コンテナーIDを忘れた場合、またはシェルコマンドで操作したくない場合は、PortainerのようなUIを使用することをお勧めします。

https://portainer.io/

$ docker volume create portainer_data
$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

そこでは、コンテナとIPに関するすべての情報を見つけることができます。


4
このリンクは質問に回答する可能性がありますが、スタックオーバーフローではリンクのみの回答は推奨されませんが、リンクの重要な部分を取り、それを回答に入れることにより、この回答を改善できます。これにより、リンクが変更された場合でも回答が回答になります。または削除されました:)
WhatsThePoint
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.