新しいコンテナが作成された後に、ホストからコンテナのIPアドレスを取得するために実行できるコマンドはありますか?
基本的に、Dockerがコンテナーを作成したら、私は自分のコード展開とコンテナー構成スクリプトをロールバックしたいと思います。
Inspectの--format
オプションが助けになります。
Modern Dockerクライアントの構文:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
旧Dockerクライアントの構文:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
これはIPアドレスだけを返します。
コメントで述べたように、もしあなたが Windows 上にいるのなら、中括弧のまわりに一重引用符"
の代わりに二重引用符'
を使ってください。
あなたはdocker inspect <container id>
を使うことができます
例:
CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
まずコンテナIDを取得します。
docker ps
(最初の列はコンテナIDです)
実行するにはコンテナIDを使用します。
docker inspect <container ID>
下部の「NetworkSettings」の下に、「IPAddress」があります。
またはただしてください:
docker inspect <container id> | grep "IPAddress"
docker inspect CONTAINER_ID | grep "IPAddress"
1つのコマンドですべてのコンテナ名とそのIPアドレスを取得します。
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
このシェルスクリプトを~/.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}}' "$@"
}
すべてのコンテナのIPアドレスを表示します。
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Docker 1.3以降では、以下の手順で確認することもできます。
実行中のDockerを入力してください。
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
Dockerバージョン1.10.3以降、ビルド20f81dd
Dockerに特に指示がない限り、Dockerは常にブリッジネットワークでコンテナーを起動します。だから、あなたは以下のこのコマンドを試すことができます:
docker network inspect bridge
これはその実行中のコンテナのIPアドレスを表示するコンテナセクションを返します。
[
{
"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 run ... --name pg-master
それから名前でIPアドレスaddressをつかみます:
MASTER_Host=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
DockerはGoで内部的に作られており、クエリの目的でもGo構文を使います。
特定のコンテナのIPアドレスについて調べるには、コマンドを実行する必要があります(フォーマットオプションの場合は-f)。
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name
コンテナーIDまたは名前の場合は、コマンドdocker container ls
を実行できます。実行中のすべてのコンテナが一覧表示されます。
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を自分のネットワーク名に変更する必要があります。
これが私が今日Pythonで開発した、「docker inspect container」JSON出力をデータソースとして使用したソリューションです。
私は検査しなければならない多くのコンテナとインフラストラクチャを持っています、そしてどんなコンテナからでも基本的なネットワーク情報を速くそして かなり 入手する必要があります。だから私はこのスクリプトを作ったのです。
重要: バージョン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 Toolboxを使ってDockerをインストールした場合は、Kitematicアプリケーションを使ってコンテナのIPアドレスを取得できます。
Sudo docker container ls
Sudo docker inspect <container_ID Or container_name> |grep 'IPAddress'
Sudo docker inspect <container_ID Or container_name> |grep 'Port'
Windows 10の場合:
docker inspect --format "{{ .NetworkSettings.IPAddress }}" containerId
コンテナのIPアドレスとホストポートを取得するには
docker inspect containerId | awk '/IPAddress/ || /HostPort/'
出力:
"HostPort": "4200"
"HostPort": "4200"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
NOTE !!! Docker Composeの使用法:
Docker Composeはクラスタごとに独立したネットワークを作成するため、以下のメソッドはdocker-compose
では機能しません。
最もエレガントで簡単な方法は、Shell関数を最も投票された回答として定義することです。 @ WouterD's :
dockip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Dockerは、LinuxプログラムのようにコンテナIDをファイルに書き込むことができます。
--cidfile=filename
パラメーターを指定して実行すると、DockerはコンテナーのIDをこのファイルにダンプします。
--cidfile="app.cid": Write the container ID to the file
--cidfile
パラメータ、app.cid
ファイルの内容でコンテナを実行すると、以下のようになります。a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
ファイルの内容を使ってDockerコンテナを調べることができます。
➜ blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
コンテナIPのインラインPythonスクリプトの抽出:
$ 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'])
http://networkstatic.net/10-examples-of-how-to-get-docker-container-ip-address/ /
ここではDockerコンテナのIPアドレスを取得するための10の選択肢があります。
完全を期して
--format オプションは本当に好きですが、最初はそのオプションを知らなかったので、同じ結果を得るために単純なPythonワンライナーを使用しました。
docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
Dockerイメージ名に基づいてコンテナーIDを見つけることと前の答えを組み合わせます。
docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
もしあなたがコンテナ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に関するすべての情報を見つけることができます。
Windowsコンテナ use
docker exec <container> ipconfig
<container>
はコンテナの name または id です。
docker ps
を使ってコンテナのIDを見つけることができます。
つかいます:
docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
これにより、ホスト上のすべてのコンテナIPが一覧表示されます。
Sudo docker ps -aq | while read line; do Sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
(スクリプトではなく)端末からコマンドを実行するための解決策を見つけるためにGoogleから来た人のために、 jid (オートコンプリートと提案による対話型JSONドリルダウンutil)は、より少ないタイピングで同じことを実現させます。
docker inspect $CID | jid
タイプ tab 。ネット tab そして、あなたは次のように見えるでしょう:
[Filter]> .[0].NetworkSettings
{
"Bridge": "",
"EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"HairpinMode": false,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"Aliases": null,
"EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
.IPAと入力します。 tab そして、あなたは次のように見えるでしょう:
[Filter]> .[0].NetworkSettings.IPAddress
"172.17.0.2"
docker inspect <container id> | grep -i ip
例えば:
docker inspect 2b0c4b617a8c | grep -i ip
点検は私のために働かなかった。 -net Host
といくつかの名前空間を使っていたのかもしれません。
とにかく、私はこれがうまく機能することがわかりました:
docker exec -i -t NAME /sbin/ifconfig docker0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
展開スクリプトでさらに使用するには、docker container nameでdocker container IP Adressを抽出する必要がありました。この目的のために、私は次のbashコマンドを書きました。
docker inspect $(Sudo docker ps | grep my_container_name | head -c 12) | grep -e \"IPAddress\"\:[[:space:]]\"[0-2] | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
引数としてmy_container_nameを使用するbashスクリプトに配置すると便利な場合があります。
DockerはすべてのコンテナーIPアドレスとそれぞれの名前を印刷するために使用を検査します
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
特定のコンテナIPを取得するために特定の便利なエイリアスが必要な場合は、この回答を使用してください。
alias dockerip='f(){ docker inspect $1|grep -i "ipaddress.*[12]*\.[0-9]*"|sed -e "s/^ *//g" -e "s/[\",]//g" -e "s/[*,]//g" -e "s/[a-zA-Z: ]//g" | sort --unique; unset -f f; }; f'
それからあなたはあなたのコンテナのIPを取得することができます
dockerip <containername>
Containernameの代わりにcontaineridを使用することもできます。
ところで、私はそれを編集して次のように使用しています。
alias dockerips='for NAME in $(docker ps --format {{.Names}}); do echo -n "$NAME:"; docker inspect $NAME|grep -i "ipaddress.*[12]*\.[0-9]*"|sed -e "s/^ *//g" -e "s/[\",]//g" -e "s/[_=*,]//g" -e "s/[a-zA-Z: ]//g "| sort --unique;done'
編集: コメントに従ってPython 3.7に更新。
まだDocker Python APIを提案した人はいません。 IPアドレスを取得するDocker APIソリューションは非常に簡単です。
import docker
client = docker.DockerClient(base_url='unix://var/run/docker.sock')
x_container = client.containers(filters={"name":"x_container"})[0]
x_ip_addr = x_container["NetworkSettings"]["Networks"]["NETWORK_NAME"]["IPAddress"]
見つけるのはそれほど難しくありませんでしたが、役に立ちます。さらにこれは、さまざまなネットワーク上のコンテナに割り当てられているすべてのIPを見つけるために簡単に変更できます。
承認された回答は、コンテナごとに複数のネットワークを使用するとうまく機能しません。
> docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cc54d96d63ea
172.20.0.4172.18.0.5
次の最良の答えは近いです。
> docker inspect cc54d96d63ea | grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.20.0.4",
"IPAddress": "172.18.0.5",
私はネットワークJSONを解析するのにjq
を使うのが好きです。
> docker inspect cc54d96d63ea | jq -r 'map(.NetworkSettings.Networks) []'
{
"proxy": {
"IPAMConfig": null,
"Links": [
"server1_php_1:php",
"server1_php_1:php_1",
"server1_php_1:server1_php_1"
],
"Aliases": [
"cc54d96d63ea",
"web"
],
"NetworkID": "7779959d7383e9cef09c970c38c24a1a6ff44695178d314e3cb646bfa30d9935",
"EndpointID": "4ac2c26113bf10715048579dd77304008904186d9679cdbc8fcea65eee0bf13b",
"Gateway": "172.20.0.1",
"IPAddress": "172.20.0.4",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:14:00:04",
"DriverOpts": null
},
"webservers": {
"IPAMConfig": null,
"Links": [
"server1_php_1:php",
"server1_php_1:php_1",
"server1_php_1:server1_php_1"
],
"Aliases": [
"cc54d96d63ea",
"web"
],
"NetworkID": "907a7fba8816cd0ad89b7f5603bbc91122a2dd99902b504be6af16427c11a0a6",
"EndpointID": "7febabe380d040b96b4e795417ba0954a103ac3fd37e9f6110189d9de92fbdae",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.5",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:05",
"DriverOpts": null
}
}
すべてのコンテナのIPアドレスを一覧表示すると、次のようになります。
for s in `docker ps -q`; do
echo `docker inspect -f "{{.Name}}" ${s}`:
docker inspect ${s} | jq -r 'map(.NetworkSettings.Networks) []' | grep "IPAddress";
done
/server1_web_1:
"IPAddress": "172.20.0.4",
"IPAddress": "172.18.0.5",
/server1_php_1:
"IPAddress": "172.20.0.3",
"IPAddress": "172.18.0.4",
/docker-gen:
"IPAddress": "172.18.0.3",
/nginx-proxy:
"IPAddress": "172.20.0.2",
"IPAddress": "172.18.0.2",
このスクリプトは、さらに処理したり結果を解釈したりすることなく、実行中のすべてのコンテナのIPv4アドレスを取得します。コンテナー名も必要ない場合は、単に "echo -n $ NAME:"という行を削除してください。自動化や変数の入力に最適です。
#!/bin/sh
for NAME in $(docker ps --format {{.Names}})
do
echo -n "$NAME:"
docker inspect $NAME | grep -i "ip.*[12]*\.[0-9]*" | \
sed -e 's/^ *//g' -e 's/[",]//g' -e 's/[a-zA-Z: ]//g'
done
このようにしたい場合は、エイリアスを作成することもできます。
alias dockerip='for NAME in $(docker ps --format {{.Names}}); do echo -n "$NAME:"; docker inspect $NAME|grep -i "ip.*[12]*\.[0-9]*"|sed -e "s/^ *//g" -e "s/[*,]//g" -e "s/[a-zA-Z: ]//g"'
すべてのDocker IPアドレスをすばやく確認したい場合、またはインスタンス名を入力せずに、これをdocker ps
ファイルに追加する~/.bashrc
コマンドをハッキングすることができます。
function docker-ips() {
docker ps | while read line; do
if `echo $line | grep -q 'CONTAINER ID'`; then
echo -e "IP ADDRESS\t$line"
else
CID=$(echo $line | awk '{print $1}');
IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" $CID);
printf "${IP}\t${line}\n"
fi
done;
}
これは Andrew Johnstone Docker GitHubでの提案から来ています: https://github.com/docker/docker/issues/8786
docker inspect --format "{{ .NetworkSettings.Networks.mynetwork.IPAddress }}" <containername or containerID here>
上記は、ネットワークが設定されているWindowsコンテナ用です。
docker create network mynetwork
Windows PowerShellを試してください。
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" <container id>
受け入れられた答えは正確にタイプするべきものを正確にカバーします、しかしここにマイナーな改良があります:
docker container inspect \
--format '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' \
$container_id_or_name
Dockerはコマンド内で名詞+動詞の構文に移動し、検査対象の曖昧さを排除するため、これはより一般的なdocker container inspect
の代わりにdocker inspect
を使用します。コンテナーは複数のIPアドレスを持つ複数のDockerネットワーク上にある可能性があるため、IPアドレスの後にスペースも入れました。それはあなたにとって意味のある他の文字や文字列と交換することができます。
他の値を検索する方法を知りたい人のために、私はよく以下のものを使用して、docker形式の構文をjsonに出力します。
docker container inspect --format '{{json .}}' $container_id_or_name | jq .
これを機能させるにはjq
をインストールする必要があるかもしれません。あるいは、jsonを1行の長い行として読むために末尾のコマンドを省略することができます。この出力を見ると、それぞれのキー名とその親を見ることができますので、あなたが望むものを出力するためにあなた自身のフォーマット文字列を作成することができます。フォーマット構文は、 golangのテンプレート を使用して実装されています。 追加のdocker特有の関数が含まれています 。
基本的に、Dockerがコンテナーを作成したら、私は自分のコード展開とコンテナー構成スクリプトをロールバックしたいと思います。
私の答えの主な理由は、このコメントが私にとって大きな赤い旗を持っているということです。これは、アプリケーションを実行するのに必要なものすべてがイメージに含まれていないことを示しています。これは、コンテナーを扱うときの大きなアンチパターンです。何十年ものクライアントがいる中で、私はまだより良い選択肢を持たなかったdocker Hostからの内部IPアドレスでコンテナに直接接続するための現実的なユースケースを見つけることができていません。代わりに、実行する必要がある起動後の設定がコンテナ内にある場合、これは多くの場合エントリポイントスクリプトで行われます。
あなたがdockerのネットワークモデルを迂回しているという赤い旗もあります。 Dockerネットワーキングでは、2つの選択肢があります。まず、コンテナー間の通信では、コンテナーの再作成時に変更されるIPアドレスではなく、ユーザーが作成したネットワークと、dockerの組み込みDNSを使用して名前またはネットワーク別名でコンテナーに接続します。そして、dockerの外部からコンテナへ通信するためには、docker Hostからコンテナへポートを公開し、次にコンテナではなく直接そのポート上のHostに接続することによって行われます。この2つの方法をそのまま使用すれば、内部IPアドレスを知らなくてもアプリケーションにアクセスできるはずです。
このスクリプトを確認してください: https://github.com/jakubthedeveloper/DockerIps
コンテナ名とIPを次の形式で返します。
abc_nginx 172.21.0.4
abc_php 172.21.0.5
abc_phpmyadmin 172.21.0.3
abc_mysql 172.21.0.2
これは私のために働いた、私はWindows 10 Home Editionで、docker-toolbox 18.09.3で実行しています:
タイプコマンド「docker-machine ls」
λdocker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default * virtualbox running tcp://192.168.98.100:2376 v18.09.6
uRL列の下に実際のIPが表示されます。例えば。 「192.168.98.100」