Moby: コンテナからDockerホストに接続する方法を文書化する

作成日 2013年07月05日  ·  263コメント  ·  ソース: moby/moby

コンテナからDockerホストを接続する方法を理解するのに問題がありました。 ドキュメントが見つかりませんでしたが、 172.16.42.1の使用について何かを言っているircログが見つかりました。これは機能します。

この動作と、それがdocker0とどのように関連しているかが文書化されていれば便利です。

最も参考になるコメント

問題のタイトルから要件は明らかだと思います。 コンテナからホストと通信するための簡単で十分に文書化された方法が必要ですが、それは実装されています。

全てのコメント263件

network.goの内部を見ると、Dockerがルーティングされていない内部ネットワークをプローブしていることがわかります。

最初の172.16.42.1はブリッジアドレスとして推測され、次に他のアドレスとして推測されます。

したがって、これを文書化してもあまり役に立ちません。 その動的なスキームはあなたが信頼することはできません。

必要なのは、ブリッジとクライアントに使用されるアドレスを定義するためのより多くの方法だと思います。
それはできますか?

問題のタイトルから要件は明らかだと思います。 コンテナからホストと通信するための簡単で十分に文書化された方法が必要ですが、それは実装されています。

+1ホストシステムに接続するための良い方法があると本当にいいでしょう

+1、1.0ブランチはイントロスペクションAPIを定義し、各コンテナーがスコープと制御された方法でホストと対話できるようにします。

これは現在0.8で計画されています。


@solomonstre
@getdocker

2013年8月8日木曜日午後1時10分、EJ [email protected]
書きました:

+1ホストシステムに接続するための良い方法があると本当にいいでしょう

このメールに直接返信するか、GitHubで表示してください。
https://github.com/dotcloud/docker/issues/1143#issuecomment -22351792

では、コンテナ内からDockerホストに接続するにはどうすればよいですか? コンテナのプライベートIPではなく、ホストポートを介してDockerコンテナに接続しようとしています。

@gerhard :イントロスペクションAPIは0.8で計画されています。 一方、コンテナからDocker APIにアクセスする場合は、DockerブリッジのIPアドレスをリッスンするようにDockerを設定できます。

これを行うには、次のようにします。

  • 橋を作る

ip link add docker0 type bridge

  • それにIPアドレスを割り当てます

ip link set docker0 up
ip addr add 172.17.0.1/16 dev docker0

  • Dockerを起動し、APIをブリッジにバインドします

docker -d -H 172.17.0.1:4242

これで、コンテナからDockerAPIにアクセスできます。

現在(バージョン0.7)dockerは、コンテナーの1つに自身の制御ソケットへの無制限のアクセスを許可することを確実にサポートしていません。 このスレッドで説明されている回避策は、動作が保証されていないハックであり、動作する可能性がある場合は、本番環境で使用したり、サポートを期待したりしないでください。 文書化する公式の機能がないため、この文書の問題を修正することはできません。

不足している機能のハックと回避策について説明するには、_docker-user_メーリングリストまたはFreenodeの_#docker_ircチャネルのいずれかをお勧めします。

ハッピーハッキング

@shykesその場合、そのような機能の作成を追跡する別の問題はありますか?

ちなみに、このような機能の動機を与えるために:これは、サーバーをローカルでテストするときに役立ちます(以前はvagrantを使用していました)。コンテナー内のサーバーを、で実行されているデータベースまたは他のサーバーに接続します。私の開発マシン(Dockerホスト)。

私はすでにこの機能の価値で売られています:)

2013年12月2日月曜日午前9:09、カレブスペア[email protected]
書きました:

ちなみに、このような機能の動機を与えるために:これは、サーバーをローカルでテストするときに役立ちます(以前はvagrantを使用していました)。コンテナー内のサーバーを、で実行されているデータベースまたは他のサーバーに接続します。私の開発マシン(Dockerホスト)。

このメールに直接返信するか、GitHubで表示してください。
https://github.com/dotcloud/docker/issues/1143#issuecomment -29636528

DockerUIをセットアップするdocker0.7.2を搭載したFedora20を使用しています。 Dockerデーモンがリッスンするポートを開いて、ファイアウォールがそれをブロックしないようにする必要がありました。

  • Firewall-cmd --permanent --zone = trusted --add-interface = docker0
  • Firewall-cmd --permanent --zone = trusted --add-port = 4243 / tcp

その後、_docker-ui_はdockerデーモン制御ソケットに接続できました。

HTH
これは、そのような機能の明確で正当な必要性です。

ダイハードスレッドを存続させているのなら、ごめんなさい。

この号のタイトルには、 「Dockerコンテナからホストに接続する方法」と書かれています。
これがdocker inspect機能とどのように関連しているかわかりません。 私が間違っていなければ、検査機能はコンテナのIPを見つけるためにホスト側で使用されます。

bkadの問題は、コンテナ内からホストIPを見つけることだと思います。 確かに、私はネットワークウィザードではありませんが、(コンテナ内からの)IPゲートウェイがホストにマップされていると想定するのはかなり安全ではありません。
(ブリッジのセットアップなどを構成しないと仮定します)。

netstat -nr 0.0.0.0のゲートウェイを使用すると、ホストマシンで実行されているサーバーに到達するのに問題はありませんでした。 ゲートウェイIPが静的であると思われます(dockerが開始されると)、誰かがそれを確認できますか?

別の方法は、環境変数を使用してホストのパブリックIPをコンテナーに渡すことですが、パブリックIPは静的ではない可能性があります。 また、ホスト名は本番環境ではより適切に機能する可能性がありますが、ローカルで使用するのは困難です。

それでも、ループバックを介してDockerコンテナーからホストに呼び出し、ホスト上で127.0.0.1として表示される方法を希望します。 または、セキュリティが懸念される場合は、常に同じIPを持つ別のループバックデバイス。
それとも、私が見つけたものが私のコミュニケーションを一般に公開していないのでしょうか? 言ったように、私はネットワークウィザードではありません:)
ip-gatewayを使用してdockerhostを呼び出すことが「正しい方法」である場合、それを文書化できないことに注意してください。

コンテナ/proc/net/routeからゲートウェイIPを探している人にとっては、おそらくそれを読むのに適切な場所です。

この機能の動機には、さまざまなメタデータサービスが含まれます。 ec2メタデータサービスから物事を公開するといいでしょう。 クレデンシャルと、環境変数に適合しないより複雑な構造化データの配布。

@jonasfj :Dockerがホストからコンテナーへのバインドマウントファイルをサポートするようになったため、実際にはもっと簡単な方法があります。 Docker制御ソケットをバインドマウントできます。例: docker run -v /var/run/docker.sock:/var/run/docker.sock … ; これは、ネットワークルールをいじるよりも簡単です。

Dockerソケットがどのように役立つかわかりません。 私はまだ問題を再開する必要があると思います。次のシナリオのドキュメントはありません。

1)「ホスト」では、サービスはポート8080で実行されます(「etcd」など)
2)そのホストからDockerコンテナが開始されます
3)Dockerコンテナからホストのポート8080のサービスにアクセスするにはどうすればよいですか? URL / IPは何でしょうか?

@jpetazzo上記の問題を解決するために、docker.sockを設定するとどのように機能しますか?

@vrvolledocker.sockを公開しても、@ bkadで説明されている元の問題は解決されません。
ただし、ホストとdocker-container間の通信用に別のUNIXドメインソケットを公開します。

たとえば、ホストからmysqlを公開する場合は、mysqlソケット/tmp/mysql.sockを公開します。

または、コンテナがさまざまな有用なものについてホストにクエリを実行できるメタデータAPIがある場合は、独自のUNIXドメインソケットを作成してコンテナに公開します。 HTTP overunixドメインソケットは非常にうまく機能するはずです。 また、すべてのネットワーク構成の問題とセキュリティの問題があるわけではありません。

'unixドメインソケット'を読み上げる必要がありました。
しかし:

http://stackoverflow.com/questions/14771172/http-over-af-unix-http-connection-to-unix-socket

URLがないため、通常のクライアントはそのメカニズムをそのまま使用できないと主張しています。

一方で:

http://stackoverflow.com/questions/14771172/http-over-af-unix-http-connection-to-unix-socket

は、そのようなソケットを使用することがどういうわけか可能であることを示しています。

それでも、Docker内のプログラムで簡単に使用できるIPアドレスとポートを簡単に作成できるようにしたいと思います。 私は-今のところ-使用します

 netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

新しい問題を作成する必要がありますか、誰かがこれを再開できますか。

@vrvolle
私はネットワーキングの人ではありませんが、ローカルホストをUNIXソケットを介してコンテナにプロキシし、コンテナの内部でUNIXソケットをコンテナにプロキシするために実行できるいくつかのトリックがあると思います-ローカルホスト(ループバックデバイス)...

その方法を文書化するとよいでしょう。 ただし、Dockerがアクティブにサポートする必要があるのは必ずしも機能ではないようです。

正確に何を達成したいかに応じて、これに対処する方法は複数あります。

ホスト上で実行されているサービス(ホスト上で直接実行されるAPIやデータベースなど、あらゆる種類のサービス)に接続する場合は、ホストのIPアドレスを把握する必要があります。

1つの方法は、DockerホストがDockerブリッジのアドレスを介して到達可能であるという事実に依存することです。これは、コンテナーのデフォルトゲートウェイです。 つまり、その場合に必要なのはip route ls | grep ^defaultの巧妙な解析だけかもしれません。 もちろん、実装の詳細(デフォルトゲートウェイはDockerホストのIPアドレス)に依存しており、将来変更される可能性があります。

もう1つの方法は、DockerAPIを使用してその情報を取得することです。 次に、問題は「コンテナからDocker APIに接続するにはどうすればよいですか?」となり、考えられる解決策(多くのコンテナで使用されます!)は、ホストから/var/run/docker.sockをバインドマウントすることです。コンテナ。 これには大きな欠点があります。APIがコンテナで完全に利用可能になり、それが悪いことをする可能性があります。

長期的には、Dockerはより優れたイントロスペクションAPIを公開し、コンテナーにあまり多くの特権を与えることなくその情報にアクセスできるようにします。

TL、DR:短期、コンテナのデフォルトルートを確認してください。 長期的には、素晴らしいイントロスペクションAPIがあります。

私もスタートアップのために問題があります。 /var/run/docker.sockに何も見つかりません。 コマンド「-v / etc / run / docker.sock:/etc/run/docker.sock」を使用しましたが、何も起こりませんでした。
カーネルの機能に関するいくつかの新しい更新による問題だと思います。 この問題について簡単に説明してください。 そしてこれを解決するための完全なコマンド。 ありがとう

-v / var / run / docker.sockを使用します-/ etcではありません(通常はconfファイル用に予約されています)。

新しい1.0.0リリースでこれに関する更新はありますか?

nsenterがありますが、推奨される方法はこれでsshdを実行することだと思います
ステージ。

2014年6月13日金曜日、 CamiloAguilarnotifications @ github.comは次のように書いています。

新しい1.0.0リリースでこれに関するニュースはありますか?


このメールに直接返信するか、GitHubで表示してください
https://github.com/dotcloud/docker/issues/1143#issuecomment-45958769

マイケルDニール
ホーム: www.michaelneale.net
ブログ:michaelneale.blogspot.com

vrvolle、ありがとう。 私たちのような多くの人々は、このようなちょっとした情報を探しています

netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

Dockerは、ホストIPを持つすべてのコンテナー(たとえば172.17.42.1 )で/etc/hostsを自動更新し、たとえば$#$ dockerhost $#$と呼ぶと便利な修正になります。
今のところ私たちはnetstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'で立ち往生していると思います

/etc/hostsdockerhostの+1

/ etc / hostsのdockerhostの+1は、良い考えのように聞こえます

画像内のファイルの編集は、特に引数またはフラグを指定しない限り、絶対に行わないでください。 また、画像の100%がLSBに従うことは必須ではないため、 /etcディレクトリさえ存在しない可能性があります。 ホストIPを含めるために使用するファイル名も、コマンド引数で指定する必要があります。

docker --host /etc/hosts

/ etc / hostsのdockerhostの+1

/ ec / hostsエントリの+1

@Sepero dockerは、リンクされたコンテナーを/ etc / hostsに既に入力しているため、引数は実際には保持されません。

@matlehそれは本当ですが、正しい方法は/ etc / hostsに直接入力しないか、少なくとも場所がない場合に備えて場所を指定することです。

とにかく、ホストのdockerhostエントリ。

また、DockerホストIPを/etc/hostsに入れたいです。

/ etc / hostsのdockerhostIPで+1

おそらく、ホスト上のネットワークサービスへのアクセスを容易にするためのより良い方法は、ポートを逆に、つまりコンテナからホストに転送するiptablesエントリを簡単に設定できるようにすることです。 -pまたは--publishオプションは、逆の効果を持つ-sまたは--subscribeオプションによってうまく補完されると思います。 しかし、私はそれらを--forwardと--reverseと呼んでいたと思います。 あなたがそれを何と呼んでも、これは私にはここの他の提案よりもはるかに一貫したアプローチのようです。

これは明白なことを示しているかもしれませんが、現在機能し、おそらく実装にあまり依存しないこれを行う簡単な方法は、コンテナを起動する前にホストのIPアドレスを決定し、コンテナに環境変数を適切に設定することです。 これらの線に沿って:

#!/bin/bash
HOSTNAME=$(hostname)
HOST_IP=$(ip route | awk '/docker/ { print $NF }')
docker run -e HOST=$HOSTNAME -e HOST_PORT=tcp://$HOST_IP:8000 mycontainer

これは、基本的に--linkの動作と並行しています。 それでも、 /docker/と一致する名前のブリッジに依存し、そのようなブリッジは1つしかありませんが、Dockerデーモンの起動時にブリッジが設定されます。 docker infoで、使用中のブリッジの名前やホストのIPアドレスを教えていただければ幸いです。 もう1つの考えは、 --link-host PORTオプションをdocker runに追加することです。これにより、基本的に上記が実行されます。

IMOこれが最良のオプションです。 --link-hostを使用すると、コンテナーは、アクセスしているサービスがホスト上にあるのか、別のコンテナー内にあるのかを知る必要がありません。

他の人がどのようにコンテナを呼び出しているかはわかりませんが、 --net=hostで実行すると、Dockerホストと同じネットワーク設定を確認できます。 このスイッチがないと、 docker-runのマニュアルページで説明されているように、スタンドアロンのネットワークスタックが得られます。

$ docker run -i --net=host fedora ip route ls
default via 10.0.2.2 dev eth0  metric 1
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
127.0.0.1 dev lo  scope link
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1
192.168.59.0/24 dev eth1  proto kernel  scope link  src 192.168.59.103

スイッチなしで実行すると、次のようになります。

$ docker run -i fedora ip route ls
default via 172.17.42.1 dev eth0
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.4

私たちが探しているのは、10.0.2.15(Dockerホストのeth0 i / fのIP)または172.17.42.1(dockerのdocker0ブリッジi / fのIP)のいずれかのIPアドレスを取得する方法です。

コンテナの/ etc / hostsファイルにホストを追加するアプローチは特に気にしませんが、これは少しハッキーに思えます。 必要なときに取得できるように、この情報を内部で公開するのが、ここに行くためのより賢明な方法のように思われます。

--link-hostまたはその他の直感的な方法で+1

/ etc / hostsエントリの+1
かなり便利なようで、現在の通信規則に従います。

以前のコメントを明確にするために、 --link <container>:<alias>の優れている点は、_alias_を介して_service_を公開することです。 同様に、ホストをコンテナに公開するためのメカニズムは、IPアドレスだけでなく、特定のサービスへのアクセスを提供する必要があります。 コンテナはエイリアスを介してそのサービスにアクセスします。 サービスが実際にどこにあるかを知る必要はありません。 このオプションは、 -pの逆セマンティクスを持ち、 --linkのように動作する必要があります。 言い換えると、 --link-host <ip address>:<port>:<alias>はenv変数と/etc/hostsエントリを設定し、必要に応じてiptablesエントリを設定します。つまり、ホスト上のサービスが、他の方法ではアクセスできないIPアドレスをリッスンしている場合です。コンテナに。

@altaurogこのようなものはどうですか?

docker run --name someservice -d host-exposing-image --expose 8000

someserviceは、 --linkに接続できる任意の名前になり、 host-exposing-imageは、公開されたポートのホストポートを転送する特別なイメージになります。 おそらく、このアイデアは、ホストの/var/run/docker.sockをイメージと共有することで実装できるでしょう。

たぶん、このようなものはすでに存在している、わからない。

編集:

docker run --name someservice -d --expose 8000 host-exposing-image

上記を忘れて、ここですべてのコメントを読んでいません(まだ読んでいませんでした)。 これは、docker-osxで私のために機能するものです(代わりにメーリングリストに投稿しないことをお詫びします):

docker run --rm -ti -e HOST_IP="$(docker-osx ssh -c 'route -n' 2> /dev/null |
  awk '/^0.0/ { print $2 }')" debian:jessie

+1。 --link-hostは、 /etc/hostsdockerhostエントリを含めるだけでなく、良いアイデアです。

この問題は解決されていないため、新しい問題を作成しました(ただし、解決されていません):#8395

dockerhostまたはその他の便利な方法で+1。

便利な方法で+1

dockerhostアプローチがここでいくつかの票を獲得したので、そのようなホストエントリを持つために私が見つけた最も簡単な方法(コメントから3つの関連する問題#8395#10023まで)は引数--add-host=dockerhost:$(ip route | awk '/docker0/ { print $NF }')を追加することですイメージを実行するとき、例:

run --add-host=dockerhost:$(ip route | awk '/docker0/ { print $NF }')  ubuntu ping -c2 dockerhost

これにより、必要な/ etc / hostsエントリが追加されますが、デフォルトでdockerhostが存在しないのは残念です。 画像を配布するとき、私はどちらかを選択できます

  • 上記のパラメータを追加するようにユーザーに指示します
  • ルーティングテーブルに基づいて構成ファイルを適応させるコンテナで実行されるスクリプトを作成します

dockerhostがデフォルトで存在しない理由を個人的には理解していません。これにより、通常はホスト(XServer、CUPS、Puleaudio)上のサービスにアクセスするイメージの作成と配布が非常に便利になります。

dockerhostの場合は+1。 実際には、これをenv var、/ etc / hostsエントリ、およびcliフラグの両方として公開します。 それは多くの方法で使用されるに違いありません。

:+1:dockerhostの場合

コンテナ内:

cat << EOF > /etc/profile.d/dockerhost.sh
 grep dockerhost /etc/hosts || echo $(ip r ls | grep ^default | cut -d" " -f3) dockerhost >> /etc/hosts
EOF

ログインするたびに機能します(rootアカウントで)

dockerhostの+1

dockerhostの+1

dockerhostの+1

dockerhostの+1

dockerhostの+1:yum:

dockerhostの+1

dockerhostの+1:+1:

このスクリプトを書くことになったので、誰かがそれが役に立つと思うかもしれません:

#!/bin/bash

SED="$(which sed)"
NETSTAT="$(which netstat)"
GREP="$(which grep)"
AWK="$(which awk)"
CAT="$(which cat)"


$SED '/dockerhost$/d' /etc/hosts > /etc/hosts.tmp
DOCKERHOST="$($NETSTAT -nr | $GREP '^0\.0\.0\.0' | $AWK '{print $2}')"

echo "$DOCKERHOST dockerhost" >> /etc/hosts.tmp

$CAT /etc/hosts.tmp > /etc/hosts

rm -rf /etc/hosts.tmp

+ 1dockerhost

このトピックにはかなりの関心があるので、新しい機能のリクエストを開くためにクローズされたチケットについて議論する代わりに、それは理にかなっていると思います。

少し前にhttps://github.com/docker/docker/issues/8395を開きました-同様に閉じました。 まだ文書化された解決策はありません

回避策はありますが、主な理由はおそらく、ホストへのアクセスが部分的に分離されたユースケースであるためだと思います。

Dockerリンク機能があるので、ホストへのリンクを提供できるのは理にかなっていると思います。

おそらくhttps://github.com/docker/docker/pull/10902がそれを解決します

こんにちは!

参考までに、これは現在文書化されています:

注:Dockerホストに接続する必要がある場合があります。これは、ホストのIPアドレスを取得することを意味します。 次のシェルコマンドを使用して、このプロセスを簡略化できます。

$ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print \$2 }'"
$ docker run --add-host=docker:$(hostip) --rm -it debian

ありがとう、@ icecrime。

Dockerの担当者は、この問題をロックして、更新を停止することができますか?

dockerhostの+1

dockerhostの+ 1-ローカルコマンドエイリアスhostipを実行する必要があることは、docker-compose、docker-swarmなどと互換性がありません。

dockerhostの+1

@icecrime 、これは私のubuntuのホストIPではなくホストゲートウェイを提供します。 以下のコマンドだけではいけませんか?

$ ip address show

+1、コマンドを実行せずに使用できるものが理想的です

これはまだ解決されていないのですか? コンテナ内でコマンドを実行して、コンテナからホストへのネットワークを機能させることは、まったく受け入れられません。

単純なものは+1
ところで、 ipの回避策は、私のUbuntuでは機能しますが、OS Xでは機能しませんよね?

+1これは2年前の問題であり、便利な機能です。 コンテナ内からDockerリモートAPIに簡単に接続できる方法が必要です。

@ianchildressデーモンがソケット接続を受け入れるように構成されている場合は、ソケットをコンテナーにバインドマウントするだけです(例: docker run -d -v /var/run/docker.sock:/var/run/docker.sock myimage

dockerhostの+1
ユースケースのソリューションを参照するときにこの問題が見つかりました: xdebug.remote_host=dockerhost

dockerhostの+1

@thaJeztahと、そこからホスト名またはIPアドレスにアクセスするにはどうすればよいですか?

@mbonaciコンテナ内のDockerAPIに接続したい@ianchildressに応答していました(ソケット接続を使用するのが一般的なアプローチです)

よくわかりません。 上記の@icecrimeは、これは現在文書化されていると述べていますが、彼が提供したリンクは無効です。 ドキュメントの引用部分がすぐに見つかりません。 apt-cache-ngの例ではdockerhostを使用していますが、それが何であるかを定義していないことに注意してください(#11556)。 私が簡単に見つけた唯一の参照はこのスレッドでした。 Dockerのソースとドキュメントをすべて検索しましたが、このコンテキストでは言及されていないようです

@pwaller 3月以降、その巨大な長いドキュメントを個別の参照に分割しました。 この資料の新しい場所は次のとおりです。

http://docs.docker.com/reference/commandline/run/#adding -entries-to-a-container-hosts-file

dockerhostの+1

@moxiegirl --add-hostパラメータで十分だと思います。 ありがとう

そして、Dockerコンテナからホストに接続する方法は? たとえば、git pullを作成するには? ボリュームを使用せずに?

@ a93ushakovそれはすべて@moxiegirlが提供したリンクで説明されています。
docker runを実行する場合は、次のパラメーターを追加します。 --add-host=dockerhost:replace_with_docker_host_ip 。これにより、コンテナーの/etc/hostsファイルにエントリが作成されます。
もちろん、これは、そのコンテナ内からdockerhostという名前を使用してDockerホストを参照できることを意味します。

@mbonaci >これは、もちろん、dockerhostという名前を使用して、そのコンテナー内からdockerホストを参照できることを意味します。

sshを介して?

@thaJeztah >デーモンがソケット接続を受け入れるように構成されている場合、..。
これを行う方法?

@ a93ushakov SSH:ホストにインストールして実行している(そしてそのポートがブロックされていない)場合は、はい。

@ a93ushakov @thaJeztahは、Unixソケット接続を指します。 これがデフォルトだと思います。ホストに/var/run/docker.sockのファイルがあるかどうかを確認してください。

dockerhostの+1

dockerhostの+1

dockerhostの+1

dockerhostの+1
追加の手順なしでこのホスト名を取得すると便利です。

dockerhostの場合は1

dockerhostの+1

コンテナ内からDockerホストに接続できないようです。 私が間違っていることについて何か考えはありますか?

$ hostip=$(ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }')
$ nc -l -p 1234 &
[1] 17361
$ docker run --add-host=docker:$(hostip) --rm -it hiromasaono/curl curl docker:1234
curl: (7) Failed to connect to docker port 1234: Connection refused

dockerhostの+1

DockerブリッジのIPを追加すると、機能します。

最初にnetcatを使用してポート1234でリッスンします

$ nc -l -p 1234

ブリッジのIPを取得する

$ ifconfig docker0 | grep 'inet addr'
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0

次に接続します

$ docker run --add-host=docker:172.17.42.1 --rm -it hiromasaono/curl curl 172.17.42.1:1234

次に、応答が表示されます

GET / HTTP/1.1
User-Agent: curl/7.35.0
Host: 172.17.42.1:1234
Accept: */*

dockerhostの+1
地獄、いつ?

Macでも動作するdockerhostの場合は+1、つまりVMを透過的に処理する

コンテナ内からDockerAPIを呼び出す方法を教えてください。 私はLinuxの男ではありません。 すでに-v / var / run / docker.sock:/var/run/docker.sockでコンテナーを開始しました。
誰もがマウントの方法について話し合っていますが、内部でapiを呼び出す方法については誰も言及していません。

curlを使用して呼び出してみましたが、機能しませんでした。 ホストIPを使用しました。

curl -XGET http:// hostip :2375 / images / json

これが私のデーモンを始めた方法です。 つまり、docker -H unix:///var/run/docker.sock -H tcp://0.0.0.0 :2375

どんな助けでも大歓迎です。

@jprogn github Issue Trackerは、一般的なサポートの質問を対象としたものではありません。 これらの質問は、#docker IRCチャネル、Googleのdocker-usersグループ、またはforums.docker.comで行うことをお勧めします。

この質問は、完全には回答されていない元のトピックに関連しています。 上記のタイトルをご覧ください

誰かがコンテナから内部のdockerapiを呼び出す方法を返信できますか??????????????

@jprogn上記の私のコメントに従ってください。 これは問題追跡システムであり、バグや機能のリクエストを追跡するために使用されます。 Dockerを使用するためのサポートフォーラムではありません。 上記の他の方法を使用してくださいhttps://github.com/docker/docker/issues/1143#issuecomment-146924892

dockerhostの+1

CentOS7 Dockerホストで、コンテナーからホストへのルートを取得できません。

[root@docker-host-fkb slehmann]# ifconfig docker0 | grep 'inet'

inet 172.17.42.1  netmask 255.255.0.0  broadcast 0.0.0.0
inet6 fe80::42:a7ff:fe4d:4cb2  prefixlen 64  scopeid 0x20<link>


[root@docker-host-fkb slehmann]# docker run --add-host=docker:172.17.42.1 --rm -it hiromasaono/curl curl 172.17.42.1:1234

curl: (7) Failed to connect to 172.17.42.1 port 1234: No route to host

何か案は?

+ 1、このための環境変数があるはずです。

私自身も逆にしたいと思います。 ホストマシンからDockerコンテナへの名前によるリンク

dockerhost環境変数の+1

172.17.42.1をハードコーディングせずに、ホストにアクセスする特注のDNSエントリを組み合わせるのは非常に困難です。 例えば

extra_hosts:
     - "docker:172.17.42.1"

どこでもdockerhostの+1(ENVの/ etc / host)

+1これはまだ必要です!

すべてのプロジェクトにip route list dev eth0 | grep -Eo 'via \S+' | awk '{ print \$2 }'を追加するので(開発ではすべてのプロジェクトが同じホストにあり、互いに呼び出すことができる必要があるため)、私の+1も悪いハックのように見え始めています

Docker Swarmなど、コンテナーを実行するときにコンテナーがどのマシンに割り当てられるかわからないクラスターで、この問題をどのように解決しますか? docker0ゲートウェイIPは、swarmクラスター内のホストごとに異なる可能性があるため、1つのホストでip routeコマンドを実行して、IPがすべてのホストで同じであると想定することはできません。

また、docker0ブリッジのIPを知らなくても、コンテナポートをdocker0ブリッジのポートにマップできるようにしたいと思います。 このようなもの:

eval $(docker-machine env --swarm swarm-master-node)
docker run -d -p "$HOST_GATEWAY_IP:80:80" my-image

$HOST_GATEWAY_IPは、コンテナーが最終的にクラスターにデプロイされるホストでip routeコマンドを実行した場合と同じIPに置き換えられます。

これは、IPを含む他のコマンド(たとえば、$# docker run--dnsオプション)でサポートする必要があります。

このコマンドの方が簡単だと思いました。

ip ro | grep docker | sed 's|.* \(\([0-9]\+\(.[0-9]\+\)\{3\}\)\)\s*|\1|'

/ etc / hostsのdockerhostの+1

+ 1dockerhost

/ etc / hostsにdockerhostがある場合は+1

dockerhostの場合は+1000

+ 1dockerhost

+1

+1以上。

コンテナでWebサーバーを実行していて、ホストで実行されているmysqlに接続する必要があります。
ホストのIPはdhcpによって変更されるため、動的なものが必要です。

@wederbrand別のアプローチ(そしておそらくより良いパフォーマンス)は、例えばmysqlソケットに接続することかもしれません。

docker run -v /var/lib/mysql/mysql.sock:/mysql.sock mywebapp

これにより、MySQLソケットがコンテナ内で/mysql.sockとして使用可能になります

@thaJeztahそれはオプションかもしれません。 ただし、私が使用しているDockerイメージは、mysqlサーバーがリモートサーバー上にあり、イメージにデータベースのhost:portの構成がある他の環境でも使用されます。

コンテナを本番環境のコンテナにできるだけ近づけて動作させたいので、ホストとポートを設定する以外は接続プロパティをいじくり回さないでください。

+1

+1

+1

+1

@peterbollen @ radek1st @BradRuderman @aldarund @wederbrand @pataiadam @jllado @geniousphp @coreylenertz @dgtlmoon @xlight (2015年12月だけですべて+1)
_this_の問題は#8395と同様にクローズされます
古い問題に+1を追加しても効果はないと思います。 新しいルートを作成するか(私は#8395で行いました)、これに対処するために他のルートを試してください。

どうも!

+1

+ 1dockerhost

dockerhostの+1

dockerhostの+1

dockerhostの+ 1、c'mon .. ..

dockerhostの+1

群れでdocker-composeとスケーリングn-aryコンテナーを使用しても、当然、すべてのマシンでノードIPアドレスルックアップをオンザフライで実行する手段は提供されません。

上記のように、ゲートウェイに変更されたこれは、オプションではありません。

extra_hosts:
     - "docker:172.18.0.1"

👍dockerhostにも...

dockerhostの+1

+1

+1

+1

+ 1dockerhost

+ 1dockerhost

+ 1dockerhost

dockerhostの+1

dockerhostの+1

dockerhostの場合は+1。
この号はクローズされているため、新しいチケットを開きます。

+1

+1

docker-machineセットアップでホストを取得するには、次のコマンドを使用できます。

docker-machine ssh "${DOCKER_MACHINE_NAME}" 'echo ${SSH_CONNECTION%% *}'

sshを介して接続するマシンを報告するため、途中にNATがない限り、ローカルマシンとリモートマシンの両方で適切に機能するはずです。 技術的に実現可能であれば、 docker-machine inspectがこの値をどこかに報告するといいでしょう。

+1

dockerhostの場合は+1。 実装する努力がほとんどない貴重な機能のように聞こえます。

今のところ、制御するイメージから作成されたコンテナー内のdockerhostにアクセスする必要がある場合は、イメージのentrypoint.shスクリプトにこの要点を追加できます: https ://gist.github.com/dimitrovs/493678fd86c7cdf0c88312d9ddb4906b

または、イメージがエントリポイントとしてシェルスクリプトを使用していない場合は、/ etc /rc.localに追加できると思います。 この要点は、/ etc / hosts内のdockerhostをチェックし、存在しない場合は追加することです。 コンテナが起動するたびに発生するはずです。

/ proc / net / routeからゲートウェイIPを取得します。

export ipaddr=$(printf "%d." $(
  echo $(awk '$2 == "00000000" {print $3}' /proc/net/route) | sed 's/../0x& /g' | tr ' ' '\n' | tac
  ) | sed 's/\.$/\n/')

@dimitrovs設定例を表示できますか? 私はそれをいじくり回して、正しい結果を得ることができませんでした。

@amcdnlでどのような結果が得られましたか? リンクした要点をentrypoint.shファイルに入れて、コンテナーが起動するたびに実行されるようにするか、コンテナー内の/etc/rc.localに置くことができます。 イメージをビルドするときにこれを行う必要がありますが、コンテナーの起動時にスクリプト自体が実行されます。

Dockerホストの場合は+1

@dimitrovs実行時にコンポーズを生成するスクリプトを作成することになりました。

StartDocker.sh

#!/bin/bash
built_docker_file="docker-compose.dev.built.yml"

rm -rf docker-compose.dev.built.yml
localhost_ip="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"
sed -e "s/\${localhost}/$localhost_ip/" docker-compose.dev.template.yml > $built_docker_file

docker-compose -f $built_docker_file build
docker-compose -f $built_docker_file up

docker-compose.dev.template.yml

version: '2'

services:
  nginx:
    container_name: sw_nginx
    image: nginx:latest
    ports:
      - 80:80
    links:
     - search
    volumes:
      - ./Web/wwwroot:/var/www/public
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    extra_hosts:
      - "dockerhost:${localhost}"

@amcdnl良い回避策。 docker-composeは(環境)変数置換をサポートしていることに注意してください。

例(bash):

$ export localhost=$(...)
$ docker-compose (...)

@sebastiannm私の提案は、Dockerイメージ内で実行されるため、ホストから独立している必要がありますが、MacでVirtualBoxで実行している場合、取得するIPは、MacIPではなくVirtualBoxVMのIPです。 これが私たちが議論している要件だと思います。 Dockerインスタンス内からMacIPを知りたい場合は、別のアプローチが必要です。

dockerhostの場合は+1。

しかし今のところ、私は上記と同様のハックを行っています。これにより、LinuxとOSXの両方で機能する単純なスクリプトを使用してホストIPアドレスを動的に取得できます: http ://stackoverflow.com/questions/24319662/from-inside

dockerhostの場合は+1。

dockerhostの+1

+ 1 + 1 dockerhost

dockerhostの+1

dockerhostの+1

dockerhostの+1

--net=bridge (デフォルト)の場合、この問題で説明されているさまざまな手法を使用して、Dockerコンテナー内から基本的なホストnetcatサーバーに接続できません。

@frankscholten成功したnetcatテストを再現できません

正確な問題を説明するstackoverflowの問題を作成しました: http ://stackoverflow.com/questions/38936738/communicate-to-docker-host-from-docker-container
将来誰かに役立つ場合に備えて、ここに投稿したかった

これはすべて、ブリッジモードでdocker0 ipを使用してコンテナからホストに通信することについて説明していますが、コンテナがホストのパブリックIP(元のeth0 IPなど)とも通信できるかどうかを知りたいです。 返信に感謝します。 私はこれで成功していません。

@sburnwalホストのeth0IPと通信できない理由がわかりません。 コンテナはデフォルトゲートウェイ(docker0)にリクエストを送信し、ホストはIPを持っていることを知っているため、それ以上転送せずに応答する必要があります。 コンテナからeth0IPへのpingがタイムアウトしたり、ホストへのルートが取得されなかったり、何が起こっているのでしょうか。 コンテナはインターネットに接続できますか?

残念ながら、これは私にはうまくいきません。 ホストからコンテナIPにpingを実行できますが、コンテナからホスト(ホストのLAN / eth0)IPにpingを実行できません。 Docker1.9.1を使用しています。 ホストのeth0IPでのみリッスンしているWebサーバーと通信するためにコンテナーが必要なため、ここで立ち往生しています。

オプションを使用してdocker0をカスタマイズしました。
/ bin / dockerデーモン--bip = 169.254.0.254 / 24 --fixed-cidr = 169.254.0.0 / 24

だから私は私のホストにこれらのインターフェースを持っています(ここにveth *インターフェースをリストしていません):

[root@pxgrid-106 irf]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtg 1500
        inet 169.254.0.254  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::42:84ff:fe87:d510  prefixlen 64  scopeid 0x20<link>
        ether 02:42:84:87:d5:10  txqueuelen 0  (Ethernet)
        RX packets 512  bytes 150727 (147.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 653  bytes 281686 (275.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtg 1500
        inet 172.23.166.176  netmask 255.255.255.128  broadcast 172.23.166.255
        inet6 fe80::20c:29ff:fecc:7d0f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:cc:7d:0f  txqueuelen 1000  (Ethernet)
        RX packets 58462  bytes 12056152 (11.4 MiB)
        RX errors 0  dropped 69  overruns 0  frame 0
        TX packets 30877  bytes 18335042 (17.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

私のコンテナのIPは169.254.0.2で、ホストからこのコンテナのIPにpingを実行できます。 もちろん、コンテナからゲートウェイ169.254.0.254(docker0 ip)にpingを実行できますが、ホストeth0 ip172.23.166.176にpingを実行できません。

ファイアウォールを完全に停止してみましたが、これらの明示的なルールもファイアウォールにINPUTチェーンに追加しましたが、まだ運がありません。 誰がこれについて私を助けることができますか? それともこれはバグですか?

ACCEPT     all  --  172.23.166.176       169.254.0.0/24      
ACCEPT     all  --  169.254.0.0/24       172.23.166.176   

さらに、ホストで「iproute」出力も提供します。

[root@pxgrid-106 bin]# ip route
default via 172.23.166.129 dev eth0 
169.254.0.0/24 dev docker0  proto kernel  scope link  src 169.254.0.254 
172.23.166.128/25 dev eth0  proto kernel  scope link  src 172.23.166.176 

@ tn-osimis提案に感謝します、私は更新してうまく機能します、他の人のために私のコードをここに示します:

docker-compose.yml

version: '2'

services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    extra_hosts:
      - "dockerhost:${localhost_ip}"

StartDocker.sh

#!/bin/bash
dev_docker_file="docker-compose.yml"

export localhost_ip="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"

docker-compose -f $dev_docker_file build
docker-compose -f $dev_docker_file up

dockerhostの+1

dockerhostの+1

dockerhostの+1

@magicalbobソリューションは確かに魔法です🎉

dockerhostの+1

+1、ところで、なぜこれは閉じられているのですか? 問題/機能のリクエストはまだ解決されていません

これに関する更新はありますか? 正しい方法は何ですか?

+1

コンテナからホスト(docker0 interface ipではなくeth0ipのようなホストのパブリックIP)に接続する方法に関する最新情報はありますか?

@sburnwal docker run --add-host=publicip:$(hostname --ip) ubuntu ping -c2 publicip

@retog答えを参照してください

dockerhostの+1

dockerhostの+1

dockerhostの+1

多分それはあなたの少なくとも何人かを助けるのでここにそれを残します:

デフォルトのネットワークインターフェースは必ずしもdocker0である必要はないと言われましたが、 docker0 IPを取得することは、Linux以外のシステムでは機能しません。 Macを使用している開発者

そのため、魔法のスクリプトを使用してネットワーク接続からホストIPを取得する代わりに、プログラムでコンテナを見つけようとするのではなく、コンテナのネットワーク設定を強制することをお勧めします。

docker-composeファイルでdockerネットワーク設定を次のように構成しました。

`` `ネットワーク:
ディフォルト:
ドライバー:ブリッジ
ipam:
構成:
-サブネット:10.10.0.0/24
ゲートウェイ:10.10.0.1

if you are only running one container, you could first create a network (`docker network create`) and connect to it with `docker run --network=<network-name>|<network-id> <image name>`

BUT if you don't want to do this (i.e. force the docker network) and really want to get the default gateway IP, you could get it more cleanly than using `docker0` network interface, for example by parsing the `docker network inspect <network name>`, which outputs the gateway IP (among other things):

..。
"IPAM":{
「ドライバー」:「デフォルト」、
"構成":[
{{
"サブネット": "172.17.0.1/16"、
「ゲートウェイ」:「172.17.0.1」
}
]
}
..。

you could also use the `--format` option of `docker network inspect` to get only the fields that are of interest, like this:

$ docker network inspect bridge --format = '{{range .IPAM.Config}} {{。Gateway}} {{end}}'
$ 172.17.0.1
`` `

注: .IPAM.Configエントリがさらにある場合は、それらすべてが出力に含まれるため、適切なエントリを選択するための追加のロジックが必要になります。

dockerhostの+1

これは、明らかにコンテナー内でIDEを実行できないため、php-fpmコンテナー内でxdebugを使用してデバッグ用にIDEに接続する場合に非常に役立ちます。

dockerhostの+1

上記のハックアラウンドの私の要約:

docker-compose.yml

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  extra_hosts:
    # requires `export DOCKERHOST="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"` in ~/.bash_profile
    - "dockerhost:$DOCKERHOST"

~/.bash_profile

# see https://github.com/docker/docker/issues/1143
export DOCKERHOST="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"

nginx-conf

location / {
        proxy_pass http://dockerhost:3000;
        proxy_set_header host $host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}

この問題を回避するために、svendowideit / ambassadordockerイメージを使用する傾向があります。

たとえば、Dockerホストで実行されているelasticsearchノードにバインドする場合は次のようになります。

docker run --restart always -d --name elasticsearch --expose 9200 -e ELASTICSEARCH_PORT_9200_TCP=tcp://<host>:9200 svendowideit/ambassador

現在、他のDockerコンテナーは、-link Elasticsearchを使用してelasticsearchを見つけることができますが、elasticsearchがdockerコンテナーで実行されているか、ホスト上で実行されているか、どこで実行されているかはわかりません。

dockerhostの+1

...今のところあなたはこれを行うことができますが:

$ docker build --build-arg HTTP_PROXY=172.16.42.1 .

...またはdocker-composeを使用した同様のケースでは、次のようにします。

client:
        build: ./client
        extra_hosts:
            - "foobar:${HTTP_PROXY}"

ビルド時にホストを設定します。

export HTTP_PROXY=172.16.42.1 && docker-compose build

Macの@rattrayalex 、私はこれがIPを直接出力することを発見しました: ipconfig getifaddr en0

dockerhostの+1

dockerhostに対して+1を実行しているだけで、同じ性質の既存のコメントに親指を立てる(反応)ことができますか? +1コメントは、この問題のスレッドを不必要に拡張/埋めるだけです。 すでにたくさんあり、追加する必要はありませんが、いつでも親指を立てることができます! 👍

コメント投稿者は、これが一般的なユースケースであり、既知の回避策があることを強調するために広範な+1を書いていると思います。また、Dockerチームがコード化するには、時間単位で推定可能な時間が必要です。
それでも、3年からオープンしています👍

それで、それはもっと「私たちはまだここにいるのか」ということのように私には見えますか? 代わりに絵文字だけ

https://github.com/docker/docker/issues/1143#issuecomment -233152700の@magicalbobソリューションは、これまでに試したすべてのコンテナー設定とブリッジで問題なく機能します。

https://github.com/docker/docker/issues/1143#issuecommentのソリューション-70052272は、docker compose extra_hostsを使用すると機能しません

dockerhostの+1

まだdockerhostはありませんか?

dockerhostの+1

dockerhostの+1

それは起こらず、3年前に閉鎖され、彼らはこれを実装する予定はありません。 docker.sockがセキュリティのフットガンであるのと同じ理由で、dockerhostも同様です。 アプリケーション内から解決可能なドメイン名を持つことは、私見の主要なセキュリティ問題です。 必要な場合は、回避策を使用してください。IPによるホストサービスへのアクセスが攻撃対象領域の増加にならない場合にのみ選択してください。

それが起こらないことに異議を唱えないでください、しかしあなたが多くの簡単な回避策もシャットダウンしない限り、dockerhostがどのようにセキュリティリスクであるかはわかりません....⁣

BlueMailから送信

2016年12月16日17:58、17:58、 PauloCesarnotifications @ github.comは次のように書いています。

それは起こらないでしょう、それは3年前に閉鎖されました、そして彼らはこれまでにそうするつもりはありません
これを実装します。 docker.sockがセキュリティのためのフットガンであるのと同じ理由で、
dockerhostも同様です。 あなたの内部から解決可能なドメイン名を持っている
アプリケーションは私見の主要なセキュリティ問題です。 必要な場合は、
回避策、IPによるホストサービスへのアクセスができない場合にのみ選択的に
攻撃対象領域が増加します。

-
あなたが言及されたので、あなたはこれを受け取っています。
このメールに直接返信するか、GitHubで表示してください。
https://github.com/docker/docker/issues/1143#issuecomment -267655915

dockerhostの+1

dockerhostの+1

ホストマシンのIPは192.168.0.208です。

docker-composeファイルは次のとおりです。

version: '2'
 services:
   zl-tigervnc:
     image: zl/dl-tigervnc:1.5
     container_name: zl_dl_tigervnc
     restart: always
     tty: true
     ports:
       - "8001:8888"
       - "6001:6006"
       - "8901:5900"
       - "10001:22"
     devices:
       - /dev/nvidia0
     volumes:
       - ~/data:/root/data
       - /var/run/docker.sock:/var/run/docker.sock
     extra_hosts:
       - "dockerhost:192.168.0.208"

このスクリプトによってコンテナが起動されました。 コンテナは、ホストマシンのポート8080にアクセスしたいと考えています(例: 192.168.0.208:8080 )。 しかし、それは機能しません。

ただし、ポートフォワーディングを使用して、ホストマシンの8080 8080にマップします。 ルーターのIPは63.25.20.83た。 コンテナは、ポート転送によってホストマシンの8080にアクセスできます(例: 63.25.20.83:8080 )。

このページから多くの解決策を試しましたが、それでも機能しません。

これは、php-fpmコンテナ内でxdebugを使用したい場合に非常に便利です。
明らかにコンテナ内でIDEを実行することはできないため、デバッグのためにIDEに接続します。

まさに@colinmollenhour ! 追加の問題があることを除いて。 ホストにpingを実行することはできますが、実際にはホストのポートに接続することはできません(たとえば、9000で実行されているリモートデバッガー)。

ネット上には古いものや正しくないものがたくさんあります。 多くの人がエイリアスIPを設定してloインターフェースに接続することはうまくいくはずだと思っているようですが、そうではありません。

(ホスト上のnetcatとdockerコンテナー内のtelnetを使用してテストしているので、私はうまく機能していません)。

@bitwombatは、ホストのファイアウォールでポート9000ルールを確認します

@gregmartynまさにそれでした。 ありがとう! もっと簡単なセットアップで最初にチェックしたのはそれだったでしょう! 欺瞞のすべての層は私に奇妙なものをチェックさせました。

2013年7月から2017年。ほぼ4年、これはまだ機能ではないのですか? これは明らかに、孤立したユースケースではありません。

マルチホストデプロイメント管理ソリューションであるというDockerの戦略と一致しないため、これは機能ではありません。

私はまだ多くの有効なユースケースがあり、機能を追加してもDockerの戦略に害を及ぼすことはないと信じています。 とにかく、これはコンテナ内からDockerホストアドレスを解決するためのやや簡単な解決策です。これはかなり普遍的に機能するはずです。

ip route | awk '/^default via /{print $3}'

dockerhostの+1

非常に必要です。 dockerhostの+1

dockerhostの+1

dockerhostの+1

dockerhostの+1

ハッキーな回避策ではないソリューションの場合は+1。 ここでは何も機能しません。

同意しました。 ソリューションの+1。 Dockerを使用するプロジェクトの開発およびテスト作業を行うために必要です。

dockerhostの+1

dockerhostの+1

dockerhostの+1

うわー.. 4年と強くなります。 dockerhostの+1?

+1ドッカーホスト!!

+ 1dockerhost !!!

これはおそらくミュートされています。 これを参考にして新しい問題を作るべきかもしれません。

:+1:dockerhostの場合...現在、envで設定しています:

export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)

それは物事を面倒にします。

Dockerがdockerhostを望まないことに完全に固執しているため、sshトンネル化されたプライベートレジストリを備えたコンテナでdocker-composeを使用するような単純なものでも機能しません。

注:この問題はクローズされているため、コメントを追加しても意味がありません:-)

この機能が必要な場合は、 --add-hostおよび同等のオプションを使用して、 dockerhost DNSエイリアスを簡単に追加できます。

これがデフォルトで利用できないのはなぜですか? それは些細な場合にのみ機能するからです。 すなわち:

  • ネットワークにアクセスできないコンテナはどうですか?
  • _複数の_ネットワークを持つコンテナはどうですか?
  • Swarmクラスターで実行されているコンテナーはどうですか?

優れたユースケース(つまり、「XXXを実行したいので、 dockerhost ...を実行したい」)と、上記の質問に対する確実な回答(および発生する可能性のある他のコーナーケース)、これを参照して新しい問題を開いてください!

ありがとう。

問題は、ホストIPが動的であり、使用しているネットワークによって異なる可能性があることです。 デバッグのためにホストへの接続を開発している場合は、必須です。 誰もがdockerhostを望んでいる理由は、そこにないオプションが便利で便利だからではありません。
Dockerには、すべてに関連するわけではないオプションがたくさんありますが、これは何が違うのですか? 必要に応じてdockerhostを有効にするオプションをdockerに持たないのはなぜですか?それは99%幸せになると思います。

@jpetazzo

ネットワークにアクセスできないコンテナはどうですか?

その後、dockerhostは機能しません。

複数のネットワークを持つコンテナはどうですか?

その後、dockerhostは機能しません。

Swarmクラスターで実行されているコンテナーはどうですか?

誰も気にしない?

Dockerエコシステムの外部のコンポーネントを含むソフトウェア(ホスト上のWindows VM内で実行されているソフトウェアなど)を開発している場合、Dockerに接続するのは面倒です。 なぜそれは苦痛でなければならないのですか?

あなたがリストしたすべてのケースは、このスレッドの226のコメントが話しているものではなく、基本的なケースについて話しているものです。

編集:申し訳ありませんが、コメントの一部を削除しました。 私は怒鳴るつもりはなかった。 これは少しイライラします。これはdockerの一部のユーザーにとって非常に必要な機能であり、それを必要とするソフトウェアを開発している場合は、一見理由もなくそれをハックしなければならないことはさらにイライラします。

@jpetazzoは、「些細な」ケースがユースケースの80%である場合があります。 Dockerhostは、開発環境やステージング環境、またはスウォーム/マルチホストネットワークに依存しない実際の環境でDockerを使用している人々にとって非常に価値があります。 Dockerhostを使用したい例を次に示します。

1) Docker-プライベートレジストリを使用してWindowsで作成します。 自己ホスト型のプライベートDockerレジストリがあります。 開発者は、ポート転送を使用したSSHトンネル(つまり、localhost:5000)を介してレジストリにアクセスできます。 ただし、Docker-Composeが独自のDockerコンテナーで実行されている場合、プライベートレジストリホストを指定する方法はありません。 dockerhostがある場合は、docker -compose.ymlファイルでd ockerhost:5000を使用して、ホスト上の転送されたポートにアクセスできるようにします。

2)ホストで実行されているサービスと通信する必要があるアプリケーション。 たとえば、 dockerhostが存在する場合、dockerコンテナーで実行されているWebベースのSSHクライアントを使用して、ホストとのSSH接続を確立できます。 dockerhostが存在する場合に使用できるDockerコンテナのホストで実行されているサービスの例は無数にあります。

3)リバースポートフォワーディング。 SSHまたはOpenVPNサーバーをDockerコンテナーで実行することができ、 dockerhostがあれば、クライアントがホストで実行されているサービスにアクセスできるようになります。 コンテナからdockerhostへのポート転送を設定できます。

dockerhostに関して、Moby開発者がコミュニティの意見を聞くことを拒否する理由について、技術的な理由を聞いてみたいと思います。 これまでのところ、私は政治的/ビジネス上の理由だけを聞いています。

macvlanネットワークインターフェイスをswarmサービスに接続する方法を見つけようとしているときに、このスレッドに出くわしました... swarmは半分完成したソリューションのようですが、サービスを外部に直接公開できないことは、私にとって継続的なフラストレーションです。 Dockerは、実際のユースケースで牽引力を失ったように感じます。このスレッドが開始されてから4年早送りし、コンテナーが自身を管理するためのネイティブ実装はまだありません。

@danfromtitanhttps //github.com/moby/moby/pull/32981を参照

私はDockerに比較的慣れていません。 私が公式ドキュメントから読んだことはすべて理にかなっています。 _Dockerは、実際にはかなり簡単に入手できるツールです。_

実際、私が数時間かけて理解しようとしたのは、_コンテナ内からホストに接続する方法_だけです。他のすべては簡単に判断できました。 私はまだそれを行う方法がわかりません。 このフォーラムやSOの「ハック」の多くは機能していません。 何ヶ月も「Dockerized」に設定されていないレガシーアプリを使用するには、ホストにアクセスする必要があります。

ジョシュが怖いです。 開発者はそれを明確にしました。
これにより、Dockerは、大規模なクラスのアプリケーションでは役に立たないよりも悪くなります。
残念ながら、docker(または「moby」)はそれらについてトスを与えることができませんでした
開発者またはそれらのアプリケーション。

2017年6月19日01:08、「JoshWedekind」 [email protected]は次のように書いています。

私はDockerに比較的慣れていません。 私が公式ドキュメントから読んだすべて
理にかなっています。 Dockerは、実際にはかなり簡単に入手できるツールです。

実際、私が数時間かけて理解しようとしたのは
コンテナ内からホストに接続する方法です。 ほかのすべて
決定するのは簡単でした。 私はまだそれを行う方法がわかりません。 多くの
このフォーラムとSOの「ハック」は機能していません。 アクセスする必要があります
「Dockerized」に設定されていないレガシーアプリを消費するためのホスト
何ヶ月もの間。


コメントしたのでこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/moby/moby/issues/1143#issuecomment-309311997 、またはミュート
スレッド
https://github.com/notifications/unsubscribe-auth/AA-shyjglsJXawxHHWGhQH0d1LlZeJqxks5sFbwXgaJpZM4Ayw00

単純な宣言型のdocker-composeファイルですべての状況を処理できることは本当に苛立たしいことですが、開発環境のコンテナーからレガシーアプリケーションに接続するには、何千ものトリックを使用する必要があります。
@thaJeztahDockerの第一印象はまったく良くありません。

参考までに、まさにこの理由で、本番環境でDockerを放棄することになりました。 Docker開発者がそれに反対していることは知っていますが(一部の人が主張するほど些細な機能ではないことがわかります)、ただチャイムを鳴らしたかっただけです。この問題。 私の会社ではDockerの「専門家」として気が進まないので、「Dockerは素晴らしいです...ローカルホストで実行されているものと通信する必要がある場合を除いて」と尋ねる人に警告する必要があります。

繰り返しになりますが、問題は解決されていると思いますが、このスレッド、Docker devsを振り返ると、これは本当に苦痛を引き起こし、実際のDockerのお客様はDockerの使用をやめています。 問題に対処するために頑固な拒否を再検討することをお勧めします。 Dockerがどのように使用されると「想定」されているかというビジョンに合わないからといって、それが役に立たない、または不要な機能であるとは限りません。

彼らは既存のクライアントを失う可能性があるだけではありません。 開発の約束を果たしていれば、すべてをDockerに移行できたはずです。 これは、Dockerがすべてのプロセスで大規模に使用するための真の反プロモーションです。

今のところ私がそれを機能させる方法は、ネットワークを作成することです。 docker-composeファイルは次のようになります。

version: '2'
services:
  <container_name>:
    image: <image_name>
    networks:
      - dockernet

networks:
  dockernet:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.0.0/24
          gateway: 192.168.0.1

これを行った後、192.168.0.1でホストにアクセスできます。
この機能はすぐには提供されないため、一部のユーザーには役立つ可能性があります。

@deltabwebホストマシン上のアプリに着信するリクエストは「localhost」トラフィックとして表示されますか、それとも192.168.0.1に応答するようにアプリを変更する必要がありますか?

ご協力いただきありがとうございます。

@halfnibble
networksのドキュメントについては詳しく調べていませんが、ホストマシン上に新しいネットワークが作成されることを理解しています。

  • 「dockerhost」のIPは192.168.0.1です
  • 最初のコンテナのIPは192.168.0.2です
  • 2番目のコンテナのIPは192.168.0.3です
  • 等々 ...

そこから始めて、ローカルネットワーク上で物理マシンが相互に接続されているかのようにすべてが機能するはずです。

  • マシンは互いに接続できます
  • また、ホストからping 192.168.0.2を使用できるはずです。これは、コンテナーがpingに応答する場合にのみ機能します。

したがって、質問に答えるには、ホストマシン上のアプリが192.168.0.Xに応答する必要があると思います(接続しようとしているコンテナーによって異なります)。

@deltabwebどのようにクラウドでサーバーのホストポートにアクセスしますか? >>>接続が拒否されました

@nooperpudd念のために言っておきますが、ホスト上で実行されているアプリケーションにコンテナからアクセスしようとしていますか?
まず、アプリケーションが外部からの着信接続を許可しているかどうかを確認します(ローカルホストだけでなく、0.0.0.0)。 また、接続をブロックしているファイアウォールがないことも確認してください。

@nooperpudd Docker for macを使用している場合、 hostモードは使用できません、 @ deltabwebソリューションも機能していません(私のサーバーはすべて0.0.0.0とホストマシンのファイアウォールをリッスンしていますオフになっていますが、毎回Connection refusedを受け取ります)。 約2日間の試行錯誤の後、この問題を修正するために私が見つけた唯一の方法は、次のスクリプトです。

#!/bin/bash
export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)

# You should use DOCKERHOST env variable in your `docker-compose.yml` 
# and put it everywhere you want to connect to `localhost` of the host machine
docker-compose $@

このアプローチの唯一の問題は、コンテナの実行後にIPが変更された場合、コンテナを再度実行する必要があり、新しいIPが見つからないことです。

私にとって注目すべき点は、Dockerコンテナーの起動時に実行されるコマンドが、ホストIPアドレスを介してコンテナーに接続できないことです。 ただし、そのコマンドがそのような接続の試行を実行せず、正常に実行を終了すると、コンテナはホストIPアドレスを介して自身に到達できます。

この観察は、NoSqlデータベースクラスターインスタンスのエンドポイントをスウォームクラスターの外部のクライアントに公開しようとしたときに行いました。 結局のところ、これらのエンドポイントは、外部クライアントがそれらに到達するために、VMのプライベートまたはパブリックIPアドレスで構成する必要があります。 ただし、Cassandraは、起動時にホストIPアドレス( CASSANDRA_BROADCAST_ADDRESS環境変数として設定-以下を参照)にすぐに接続しようとするため、失敗するように設計されています。 一方、Mongodbレプリカセットノードは最初にすべてクリーンな状態で開始され、次にプライマリノードとセカンダリノードがレプリカセットを形成できるように、個別の開始コマンドが実行されます。

以下に、cassandraに関するこの観察の詳細な説明を示します(私はdocker swarmを使用してこれらを作成しますが、同じ問題がdocker run -dに表示されます(NATモード、したがって--net = hostオプションなし)

1)一方で、によって作成されたコンテナ

docker service create  --name cassandra-service
--publish mode=host,target=7000,published=7000,protocol=tcp 
-e CASSANDRA_SEEDS=host IP address  -e CASSANDRA_BROADCAST_ADDRESS=host IP address

リッスンアドレスに接続できないというメッセージで失敗します: <host IP address>:7000

2)一方、オーバーレイネットワークに接続されたコンテナ。

docker service create  --network cassandra-net --name cassandra-service
-e CASSANDRA_SEEDS=cassandra-service  -e CASSANDRA_BROADCAST_ADDRESS=cassandra-service

正しく起動すると同時に、 cassandra:2.0イメージのDockerfileで公開されている任意のポートのホストIPアドレスに接続できます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                         NAMES
07603a75a379        cassandra:2.0       "/docker-entrypoin..."   About a minute ago   Up About a minute   7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra-service-1.1.m243u97zku15w08m6puytdngs

$ docker exec -it 1e61ec16f8d0 bash
root<strong i="5">@1e61ec16f8d0</strong>:/# cqlsh 172.17.13.151
Connected to Test Cluster at 172.17.13.151:9160.
[cqlsh 4.1.1 | Cassandra 2.0.17 | CQL spec 3.1.1 | Thrift protocol 19.39.0]

同様に、2番目のcassandraノードの作成中にも同じことが観察されます。

1)別のノードに2番目のcassandraコンテナを作成した場合

docker service create  --network cassandra-net --name cassandra-service-2
-e CASSANDRA_SEEDS=172.17.13.151  -e CASSANDRA_BROADCAST_ADDRESS=cassandra-service-2

コンテナは、シードでゴシップできないという実行時例外で失敗します。

java.lang.RuntimeException: Unable to gossip with any seeds
        at org.apache.cassandra.gms.Gossiper.doShadowRound(Gossiper.java:1322)
        at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:457)

2)一方、 docker run -dを介してcassandraコンテナーを作成すると、ホストIPアドレスを介してシードノードに到達できます。

$ docker run -d cassandra:2.0
d87a79cc3de8cd7e4cf40284d1eca91ceb660581cc71082fe64a6b84a09fbd77
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
d87a79cc3de8        cassandra:2.0       "/docker-entrypoin..."   3 seconds ago       Up 2 seconds        7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   trusting_ardinghelli
$ docker exec -it d87a79cc3de8 bash
root<strong i="17">@d87a79cc3de8</strong>:/# cqlsh 172.17.13.151
Connected to Test Cluster at 172.17.13.151:9160.
[cqlsh 4.1.1 | Cassandra 2.0.17 | CQL spec 3.1.1 | Thrift protocol 19.39.0]
Use HELP for help.
cqlsh>

特にCassandraの場合、cassandraノードの自動ブートストラップをオフにすることでこの問題を解決します。 これを行うには、Compose V3のエントリポイントコマンドを使用して、 /etc/cassandra/cassandra.yamlauto_bootstrapfalseに設定します。

version: '3'
services:
  cassandra-1:
    image: cassandra:2.0
    entrypoint:
    - "sh"
    - "-c"
    - "echo auto_bootstrap: false >> /etc/cassandra/cassandra.yaml; /docker-entrypoint.sh cassandra -f"
    environment:
      CASSANDRA_BROADCAST_ADDRESS: 172.17.13.151
    volumes:
    - volume1:/var/lib/cassandra
    ports:
    - "7000:7000"
    - "7001"
    - "7199"
    - "9042:9042"
    - "9160:9160"

次に、 docker exec -it <container id> nodetool rebuildを実行して、cassandraノードを手動で起動します。

私はこの機能を開発に使用することができました...

@jpetazzoさまざまなプラットフォームのチームでPHPソリューションを開発しています。 デバッガー(xdebug)は、ホスト上のIDEに接続し直す必要があります。 WindowsとLinuxでは、これは「箱から出してすぐに」機能しますが、Macでは、開発者はxdebug.iniファイルを変更してローカルIPを具体的に指定する必要があります。 しかし、Dockerfileはソース管理下にあります...開発者がこのファイルの編集をめぐって衝突するため、キューは常に競合し、罵倒されます。 はい、スクリプト化可能な回避策がありますが、WindowsとMac用のDockerにdocker.for.win.localhostとdocker.for.mac.localhostがあるのはなぜですか? これは部分的には役立ちますが、これを正しく設定するために使用しているプラ​​ットフォームを検出するためのスクリプトが必要です。 非常に複雑に見えるので、そうあるべきです。 この機能を再検討してください。 Dockerは急な学習曲線になる可能性がありますが、このような問題により、ユーザーは何時間もグーグルで不信感を持って検索することになります。

https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workaroundsページを確認すると、 docker.for.mac.localhostを使用すると役に立ちました:)

良くも悪くも、 docker-composeは、ローカル開発マシンまたはCIで実行されているWebサーバーをテストするためにSeleniumハブとヘッドレスFirefox / Chromeグリッドノードを起動する(起動する)ための最も簡単な方法です。 Dockerコンテナ内のWebサーバーは遅すぎて、開発に便利ではありません)。 Dockerが意図したものではありませんが、Dockerはその仕事に最適なツールであり、Docker自身のせいです😆唯一の問題は、どのOSでも機能する方法でホストIPを簡単に把握できることです。

@rskuipersは、 docker.for.mac.localhostで何をしたのか正確に説明できますか? コンテナ内からホストマシンに解決するように要求しようとしています。 私のコンテナーはtraefikで実行されています。つまり、domain.docker.localhostを介してコンテナーにアクセスできますが、コンテナー内からそれで始まるURLにアクセスしようとすると、解決されません。

現在私が行ったことは、これをdocker-compose.ymlに追加したことです。これにより、 /etc/hostsに行が追加され、ドメインが適切に解決されます。

extra_hosts: - "domain.docker.localhost:172.18.0.1"

IPは、コンテナ内のホストIPであり、 ip route | awk '/^default via /{print $3}'を使用して取得できます。 しかし、可能であればそれをハードコーディングしたくありません...

@jzavrl私がしたのは、 docker.for.mac.localhostを使用して、HTTPリクエストがホスト上で実行されているプロキシを通過するようにすることだけでした。 docker-compose以外のレイヤーは使用していません。

それがまさに私が興味を持っていることです。具体的にどのような変更を加える必要がありましたか?

@jzavrlなし:Pそれはちょうど働いた。

わかりませんdocker.for.mac.localhostで何をしましたか?

@jzavrl接続するIPの代わりにそれを使用しました。 つまり、docker.for.macです。 localhost:8888

Ahhhhhh、今それは今意味をなし始めています。 それならこれを試してみます。 乾杯@rskuipers。

コンピュータで「en0」のIPを使用するだけです。

例えば

ssh [email protected]

「192.168.1.100」は、ルーターのDHCPサービスからのものである可能性があります。

@acuthbert 、あなたの提案に感謝します。
docker.for.win.localhostは、Docker forWindowsで機能します。 DockerとWindowsにはまだ希望があります。 😣

これを実行できず、このスレッドの90%の人々を満足させる技術的な理由はほとんどありません。コーナーケースや実際には機能しない状況では、その状況で開発している人々は単純なセットで満足できます。どのシナリオが機能しない可能性が高いかを説明する「ユースケース」の例。

これは主に単なる政治的ゴミであり、ここでの実際の技術的推論ではありません。 他のコンテナエンジンの1つが機能することを期待しており、代わりにkubernetesをそれを使用するように交換できます。 そうすれば、私はもうこのゴミに対処する必要はありません。

@NdubisiOnuora 、どのタイプのアプリケーションですか? ウェブアプリケーション?

2つのコンソールアプリがあります(ホストにtcp-server、コンテナーにtcp-client)。
彼らはtcpを使用しているので、私は正確にIPが必要です( docker.for.win.localhostはドメインであるため、適合しません)。

たとえば、tcp-clientで設定する必要があるip:portはどれですか?tcp-serverでip:port 127.0.0.1:9595を設定した場合はどうなりますか?

ドメインをIPアドレスに解決するだけですか?

@orf
このコードをC#で使用したい:
IPAddress hostAddr = Dns.Resolve("docker.for.win.localhost").AddressList[0];
しかし、その前にdocker.for.win.localhostにpingを実行しようとしましたが、それが表示されません。エラー: Ping request could not find host docker.for.win.localhost. Please check the name and try again.
私のDockerfile:
FROM microsoft/windowsservercore
ADD . /
ENTRYPOINT powershell ping docker.for.win.localhost

誰かがそれを見逃した場合、18.03の時点での解決策はhost.docker.internalだと思いますが、何らかの理由でこれはDocker for Windowsでのみ機能します!? なぜ他の人ではないのですか?

編集:コメントがGithubによって折りたたまれているのを見ませんでした... 🤦‍♂️

私のために働く:
docker run --rm -it --add-host "docker.for.localhost:$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')" alpine:latest ping docker.for.localhost

@lukasmrtvyこれはシェルでは機能しますが、 docker-compose.ymlではどうでしょうか。

すべてのプラットフォームで機能する一般的な方法でこの問題を解決するためのコンテナーを作成しましたhttps://github.com/qoomon/docker-host

このページは役に立ちましたか?
0 / 5 - 0 評価