ホストの外部(同じネットワーク)からDockerコンテナに接続する方法[Windows]


87

最初のDockerコンテナーを作成しました。これは、Goを使用してサーバーを実行していますが、ホストコンピューターの外部からアクセスできません。Dockerを使い始めたばかりなので、ここで少し迷っています。

したがって、サーバーを起動する非常に単純なGoコードがあり、GoをインストールしてLinuxベースイメージにコードをビルドするDockerイメージをビルドしました。サーバーをポート8080で実行しているので、次のようにコンテナーを実行しているホストにそのポートを公開します。

docker run -p 8080:8080 dockertest

働くことを私がドッキングウィンドウのマシンIPを介してサーバーにアクセスするために取得(に表示されていることを1ドッカークイックスタートターミナルが開始された)、問題は、私はある、私はホスト外からホスティングてるのウェブサイトにアクセスすることはできません、私がしようとした場合ので、電話で同じIPアドレスを開くと、エラーが発生します。このWebページは利用できません(ERR_CONNECTION_TIMED_OUT)。

また、次のようにIPを指定してみました。

docker run -p 192.168.0.157:8080:8080 dockertest

しかし、そうすると、DockerマシンのIPも上記のコマンドラインで指定されたIPも経由せずにWebサイトにアクセスできます。また、コンピューターのIPを使用したコマンドでどのIPを書き込む必要があるのか​​わかりません。また、127.0.0.1(localhost)を試しましたが、同じ結果が得られました。どのIPからもWebサイトにアクセスできませんでした。 IPは何でも。

私はこの問題をグーグルで検索し、StackOverflowの質問をたくさん見つけましたが、どちらも私の問題を解決するのに役立ちませんでした。それらのほとんどはLinuxまたはMacを対象としていたため、解決策は私の状況には当てはまりませんでした。

また、コンピューターでGoコードを実行し、コンピューターのIPを介して同じネットワーク内の別のデバイスからWebサイトにアクセスできます。Dockerマシンで実行しているときにアクセスできない理由がわかりません。IP転送などに関係があるのではないかと思いましたが、私はネットワーキングの初心者です。私は主にWeb開発者であり、ネイティブの経験はほとんどありません。


Dockerfileで-pオプションと組み合わせてEXPOSE8080を使用しましたか?また、コンテナが実行されているボックスのポート8080がセキュリティルールによってブロックされていないことを確認してください。
keda 2015年

@kedaはい、DockerfileにはEXPOSE 8080が含まれています。Dockerのクイックスタートターミナルを介してコンピューター上でローカルにコンテナーを実行しています。Windowsファイアウォールも無効にしようとしましたが、どちらも機能しませんでした。設定があるかどうかわかりません。行方不明
redsalt 2015年

回答:


90

TL; DR VirtualBoxホストのネットワークモードを確認bridgedします。ローカルネットワーク上で仮想マシン(およびそれがホストしているDockerコンテナ)にアクセスできるようにする必要があります。


HTTP経由でアプリケーションにアクセスするために、どのホストに接続するかが混乱しているようです。あなたは実際にあなたの設定が何であるかを詳しく説明していません-あなたがあなたのタグに「Windows」と「VirtualBox」を持っているという事実に基づいて、私はいくつかの推測をするつもりです。

WindowsホストのVirtualBoxで実行されているLinuxのフレーバーでDockerを実行していると思います。次のようにIPアドレスにラベルを付けます。

D = DockerコンテナのIPアドレス

L = VirtualBoxで実行されているLinuxホストのIPアドレス

W = WindowsホストのIPアドレス

WindowsホストでGoアプリケーションを実行するhttp://W:8080/と、ローカルネットワーク上のどこからでもアプリケーションに接続できます。これは、GoアプリケーションがWindowsマシンのポート8080をバインドし、IPアドレスでポート8080にアクセスしようとするすべてのユーザーWが接続されるために機能します。

そして、これがより複雑になるところです:

VirtualBoxは、仮想マシン(VM)をセットアップするときに、いくつかの異なるモードのいずれかでネットワークを構成できます。さまざまなオプションが何であるかは覚えていませんが、必要なのはbridgedです。このモードでは、VirtualBoxは、ネットワークに接続されている他のマシンと同じように、仮想マシンをネットワーク上のスタンドアロンマシンであるかのようにローカルネットワークに接続します。ではbridgedモード、仮想マシンが他のマシンのようにネットワーク上に表示されます。他のモードでは設定が異なり、マシンはネットワーク上に表示されません。

したがって、Linuxホスト(bridged)のネットワークを正しく設定すると、Linuxホストはローカルネットワーク(192.168.0.xなど)にIPアドレスを持ち、Dockerコンテナにアクセスできるようになりますhttp://L:8080/

Linuxホストが以外のモードに設定されている場合、Windowsホストからアクセスできる可能性がありbridgedます、これは、ホストがどのモードにあるかによって異なります。

編集-以下のコメントに基づいて、私が上で説明した状況が正しいように聞こえます。

少しバックアップしましょう。これが私のコンピューター(Ubuntu Linux)でのDockerの動作です。

あなたが持っているのと同じコマンドを実行すると想像してみてくださいdocker run -p 8080:8080 dockertest。これは、dockertestイメージに基づいて新しいコンテナーを開始し、Linuxホスト(私のPC)のポート8080をコンテナーのポート8080に転送(接続)します。Dockerは、Dockerデーモンが通信できるようにし、コンテナーが相互に通信できるようにするために、独自の内部ネットワーク(独自のIPアドレスのセットを使用)をセットアップします。つまり、基本的に-p 8080:8080は、Dockerの内部ネットワークを「外部」ネットワークに接続することです。ホストのネットワークアダプタ-特定のポート上。

これまで私と一緒に?では、一歩下がってシステムを見てみましょう。お使いのマシンはWindowsを実行しています-Dockerは(現在)Windowsで実行されていないため、使用しているツールはVirtualBox仮想マシンにLinuxホストをセットアップしています。docker runご使用の環境でこれを行うと、まったく同じことが起こります。Linuxホストのポート8080は、コンテナーのポート8080に接続されます。ここでの大きな違いは、Windowsホストはコンテナーが実行されているLinuxホストではないため、ここに別のレイヤーがあり、問題が発生しているこのレイヤーを介した通信です。

必要なのは、次の2つのうちの1つです。

  1. Dockerコンテナをホストポートに接続するのと同じように、VirtualBoxVMのポート8080をWindowsホストのポート8080に接続します。

  2. bridged上記のネットワークモードでVirtualBoxVMをローカルネットワークに直接接続します。

最初のオプションを選択すると、WindowsホストのIPアドレスまたはホスト名がhttp://W:8080どこにWあるかでコンテナーにアクセスできるようになります。2番目を選択すると、LinuxVMのIPアドレスまたはホスト名がhttp://L:8080どこにあるコンテナにアクセスできるようになりLます。

以上が上位レベルの説明です。次に、VirtualBoxVMの構成を変更する方法を理解する必要があります。そして、ここで私は本当にあなたを助けることができません-私はあなたがあなたのWindowsマシンでこれをすべて行うためにどのツールを使っているのか分かりません、そして私はWindowsでDockerを使うことに全く慣れていません。

VirtualBox構成ウィンドウが表示されたら、以下に説明する変更を加えることができます。VMを変更するコマンドラインクライアントもありますが、私はそれについてよく知りません。

以下のためbridgedのモード(これは本当に最も簡単な選択である)、あなたのVMをシャットダウン上部にある「設定」ボタンをクリックして、ネットワークへのモードを変更bridgedし、VMを再起動して、あなたがしている良い行くことに。VMは、DHCPを介してローカルネットワーク上のIPアドレスを取得し、そのIPアドレスでネットワーク上の他のコンピューターから見えるようにする必要があります。


1
クイックスタートターミナルを開いたときにDockerが表示するIP(192.168.99.100)とコンピューターにあるIP(192.168.0.157)の2つのIPしか見つかりません。使用して、Windowsコンピューターからのみdocker run -p 8080:8080 dockertestWebサイトにアクセスできますhttp://192.168.99.100:8080(ホスト)と私の電話からではありません。使用するdocker run -p 192.168.0.157:8080:8080 dockertestと、どこからでもIPを使用してWebサイトにアクセスできなくなります。ネットワークの設定方法がわからないので、使ってみました--net=bridgeが、うまくいきませんでした。VirtualBoxを開くことになっていますか?Dockerのターミナルを使用してそれを行うことはできませんか?
redsalt 2015年

問題はDockerにあるのではないので、いいえ、Dockerはあなたを助けることができません。私が何が起こっていると思うかを説明するために、いくつかの編集を追加します。
クライテン

はい、ありがとうございます!Linux仮想マシンの部分全体に混乱していたことがわかりました。私は、Dockerが私が触れることを想定していない内部のものにVirtualBoxを使用しているという印象を受けました。実はとても簡単で、bridgedVirtual Boxに変更するだけで、今では驚異的に機能します。ありがとうございます。
redsalt 2015年

同じネットワーク内にウィンドウとDockerコンテナーを配置して、ポート転送なしでコンテナーに直接アクセスできるようにする方法はありませんか?
Vituel 2016

Dockerで実行中のJupyterサーバーを検索し、LAN経由でアクセスしようとしたときに、これに遭遇しました。とにかく、モードをブリッジに切り替えた後、Lが何であるかを知ることができますか?
PaulDong 2016

121
  1. Oracle VM VirtualBoxManagerを開きます
  2. Dockerが使用するVMを選択します
  3. [設定]-> [ネットワーク]をクリックします
  4. アダプター1は(デフォルト?)「接続先:NAT」である必要があります
  5. [詳細設定]-> [ポート転送]をクリックします
  6. ルールの追加:プロトコルTCP、ホストポート8080、ゲストポート8080(ホストIPとゲストIPは空のままにします)
  7. ゲストはDockerコンテナーであり、ホストはマシンです

これで、localhost:8080およびyour-internal-ip:8080を介してコンテナを参照できるようになります。


10
確認済みで、素晴らしく、簡単です。
ダーク

2
ベストアンサー、選択したもののような巨大な説明はありません
アミールカイユムカーン2016

2
vagrantユーザーの場合、これをvagrantfileに追加します:config.vm.network "forwarded_port"、guest:8080、host:8080、protocol: "tcp"
Vince Verhoeven 2017年

3
よ!これは魅力のように機能しました!ありがとう!!!! 私はこれを理解しようと何時間も費やしています。
ジョセフフリーマン

2
これは、VBoxを介してDockerを実行している人にとって素晴らしいソリューションです。
ミロディーニョ2017年

7

いくつかのことを試した後、これは私のために働きました:

  • --publish = 0.0.0.0:8080:8080dockerフラグを使用します
  • virtualboxネットワークモードをNATに設定し、ポート転送を使用しないでください

0.0.0.0私以外のアドレスでは成功しませんでした。


4

TLDR: Windowsファイアウォールを有効にしている場合は、プライベートネットワークで「vpnkit」の例外があることを確認してください。

私の特定のケースでは、ローカルネットワーク上の別のマシンからコンテナの公開ポートにアクセスしようとしたときに、Windowsファイアウォールが接続をブロックしていることを発見しました。これを無効にすると、すべてが機能するためです。

ただし、コンテナのサービスにアクセスできるようにするためだけに、ファイアウォールを完全に無効にしたくはありませんでした。これは、私のコンテナのサービスに代わってどの「アプリ」がリッスンしていたのかという疑問を投げかけました。自分のマシンのリスニングソケットの背後にあるアプリを見つけるために使用する方法を教えてくれた別のSOスレッドを見つけた後netstat -a -b、それがvpnkit.exeWindowsファイアウォール設定に既にエントリを持っていることを知りました。しかし、「プライベートネットワーク」は無効になっています。有効にすると、ファイアウォールを完全に無効にすることなく、別のマシンからコンテナのサービスにアクセスできるようになりました。


サー、あなたは何時間もの欲求不満から私を救ってくれました。ありがとう。
Behdad

2

これは、Dockerコンテナを実行するためにWindowsユーザーが直面する最も一般的な問題です。IMOこれは「Dockerに関する数百万ドルの質問」です。@ "Rocco Smit"は、「ホストマシンのファイアウォールでデフォルトで無効になっているためのインバウンドトラフィック」を正しく指摘しています。私の場合、McAfee AntiVirusソフトウェアです。McAfeeのファイアウォール設定で、同じWifiLAN上の他のコンピューターからのインバウンドトラフィックを許可するポートを追加しました。それからそれは魔法でした。私は1週間以上、インターネット、SO、Dockerのドキュメント、Dockerのネットワークに関連するチュートリアルの後のチュートリアル、および「macvlan」、「ipvlan」、「user」の「Windowsではサポートされていない」の多くのイラストを閲覧するのに苦労していました。定義されたブリッジ」とこれと同じSOスレッドを数回。私は(同じホームwifiのモバイルから)nginxにアクセスできなかったので、「本番環境でDockerを使用している人はいますか?」(LinuxはWindowsサーバーよりもProdワークロードで人気があることを知っています)でグーグルを閲覧し始めました。 WindowsのDockerコンテナにデプロイされたアプリ。結局のところ、少なくとも同じLAN内の他のコンピューター/デバイスからアプリケーション(Dockerコンテナーにデプロイされている)にアクセスできない場合、それは何と良いことでしょう。最終的に私の場合、問題はファイアウォールがインバウンドトラフィックをブロックすることだけでした。少なくとも同じLAN内の他のコンピューター/デバイスからアプリケーション(Dockerコンテナーにデプロイされている)にアクセスできない場合。最終的に私の場合、問題はファイアウォールがインバウンドトラフィックをブロックすることだけでした。少なくとも同じLAN内の他のコンピューター/デバイスからアプリケーション(Dockerコンテナーにデプロイされている)にアクセスできない場合。最終的に私の場合、問題はファイアウォールがインバウンドトラフィックをブロックすることだけでした。


0

-pポート値を設定するとともに、Docker for Windowsはvpnkitを使用し、ホストマシンのファイアウォールでデフォルトで無効になっていることがわかりました。vpnkitのインバウンドTCPルールを有効にした後、ローカルネットワーク上の他のマシンからコンテナにアクセスできました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.