新しいコンテナが作成された後、ホストから直接コンテナのIPアドレスを取得するために実行できるコマンドはありますか?
基本的に、Dockerがコンテナーを作成したら、独自のコードデプロイメントおよびコンテナー構成スクリプトをロールバックします。
新しいコンテナが作成された後、ホストから直接コンテナのIPアドレスを取得するために実行できるコマンドはありますか?
基本的に、Dockerがコンテナーを作成したら、独自のコードデプロイメントおよびコンテナー構成スクリプトをロールバックします。
回答:
の--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を使用している場合は、中括弧"
を一重引用符ではなく二重引用符で'
囲みます。
<no value>
Fig / Boot2Dockerを使用してMacで応答を取得する
<no value>
実行されていないコンテナに対してこれを実行しようとすると取得されます。これを行う前に、コンテナが実行されていることを確認してください。
{{ .NetworkSettings.Networks.$network.IPAddress }}
。デフォルトはブリッジのように見えますが、docker-composeでは、これはアプリの名前に依存する特定の名前になります(--project-nameフラグから考えますが、これはネットワーク構成のタイプにも依存します)あなたが設定した)。私はここの回答で、完全な答えを書いたstackoverflow.com/questions/17157721/...
使用できますdocker inspect <container id>
。
例えば:
CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
docker inspect $CID | grep IPAddress | cut -d '"' -f 4
。これは正常に機能します:)
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'
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
新しい構文です。-format
は非推奨です--format
。
最初にコンテナIDを取得します。
docker ps
(最初の列はコンテナーID用です)
コンテナIDを使用して実行します。
docker inspect <container ID>
下部の[NetworkSettings]の下に、[IPAddress]があります。
またはちょうど行います:
docker inspect <container id> | grep "IPAddress"
docker run -it MYCONTAINER /bin/bash
)では、の出力にinspect
セクションがありませんNetworkSettings
!
docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
... | grep IP
IPを取得するために必要なすべてのフォーマットの詳細に対するソリューションを非常に好みます。+1
docker run -it MYIMAGE
(コンテナー名ではありません)です。あなたがしなければdocker inspect MYIMAGE
、あなたはについての静的な情報を取得します画像を。実行中のコンテナの名前を見つける必要があります(または他の人が示唆するようにそのIDを使用します)。私のシステムでは、そのイメージから作成された最初のコンテナはデフォルトでname MYIMAGE_1
に設定されているため、docker inspect MYIMAGE_1
NetworkSettingsがあります。
docker inspect CONTAINER_ID | grep "IPAddress"
-i
大文字と小文字を区別しないようにgrepに追加すると、次のように動作します。
docker inspect CONTAINER_ID | grep -i "IPaDDreSS"
すべてのコンテナ名とその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
{{.NetworkSettings.IPAddress }}
に{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'
です。sed(1)
コンテナの存在のために、空の行を削除しますが、IPアドレスを持っていません。
このシェルスクリプトを~/.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}}' "$@"
}
Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings"
source ~/.bash_profile
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
docker exec [container-name-or-id] ip a
docker exec [container-id or container-name] ipconfig
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"
}
}
]
実行:
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」
私が気に入ったいくつかの回答に基づいて、すべての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
下で実行されて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を独自のネットワーク名に変更する必要があります。
これが簡単に機能する答えです:
コンテナの名前またはIDを取得します。
docker container ls
次に、IPを取得します。
docker inspect <container_ID Or container_name> |grep 'IPAddress'
ポートを取得します。
docker inspect <container_ID Or container_name> |grep 'Port'
DockerはGoで記述されており、クエリの目的でもGo構文を使用します。
特定のコンテナのIPアドレスを検査するには、次のコマンドを実行する必要があります(-f
「フォーマット」用):
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name
コンテナーIDまたは名前については、コマンドを実行できます
docker container ls
実行中のすべてのコンテナがリストされます。
docker inspect container
JSON出力をデータソースとして使用して、今日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
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}'
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'
docker ps -q
を避けるために使用しますtail
、そして--format
のgrepを避けるために。またdocker inspect
、シェルでループするのではなく、複数のコンテナIDを渡すことができます。
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でした。
docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
Docker Toolboxを使用してDockerをインストールした場合は、Kitematicアプリケーションを使用してコンテナーのIPアドレスを取得できます。
docker inspect
docker toolboxを実行すると機能しないことに注意してください。IPアドレスを報告しますが、サービスが使用する正しいアドレスではありません。
注意!!!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ファイルの使用:
--cidfile
パラメータでコンテナを実行すると、app.cid
ファイルの内容は次のようになります。
a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
ファイルの内容を使用して、Dockerコンテナーを検査できます。
blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
インライン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の方法」を参照してください。
これにより、ホスト上のすべてのコンテナIPが一覧表示されます。
sudo docker ps -aq | while read line; do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
Docker inspectを使用して、すべてのコンテナIPとそのそれぞれの名前を出力します
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
完全を期すために:
私はこの--format
オプションが本当に好きですが、最初はそれを意識していなかったので、単純なPythonワンライナーを使用して同じ結果を得ました。
docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
使用する:
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
以下のためのWindowsのコンテナの使用
docker exec <container> ipconfig
どこ<container>
で名前やIDコンテナのは。
を使用docker ps
してコンテナのIDを見つけることができます。
コンテナーIDを忘れた場合、またはシェルコマンドで操作したくない場合は、PortainerのようなUIを使用することをお勧めします。
$ 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に関するすべての情報を見つけることができます。