2015-11-19 18 views
43

最初のドッカーコンテナを作成しました.Goを使用してサーバを実行していますが、ホストコンピュータの外からはアクセスできません。私はドッカーで始まったばかりなので、ここで少し失われています。ホスト(同じネットワーク)の外からドッカーコンテナに接続する方法[Windows]

私はサーバーを起動する非常に単純なGoコードを持っています.GoをインストールしてLinuxベースイメージにコードをビルドするドッカーイメージをビルドしました。私はドッキングウィンドウのマシンのIP(表示された1を介してサーバーにアクセスするために取得

docker run -p 8080:8080 dockertest 

動作することと:私は私はこのようなコンテナを実行しているホストにそのポートを公開ポート8080でサーバーを実行していますよDockerクイックスタートターミナル開始時)、問題はI 私がホストの外からホストしているWebサイトにアクセスできない場合私は自分の電話で同じIPアドレスを開こうとすると、エラー:このWebページは利用できません(ERR_CONNECTION_TIMED_OUT)。

私はまた、このようにIPを指定して試してみた:

docker run -p 192.168.0.157:8080:8080 dockertest 

しかし、私は上記のコマンドライン上でドッキングウィンドウマシンのIPも指定されたIPどちらを通じてWebサイトにアクセスできないことを行うとき。 私はまた、私は自分のコンピュータのIPを使用して、私は127.0.0.1(localhost)を試してみましたが、私は同じ結果:どんなIPでも。

私はこの問題を探究し、多くのスタックオーバーフローの問題を見つけましたが、私の問題を解決するのに役立つものではなく、そのほとんどはLinuxまたはMac向けでした。

また、私のコンピュータでGoコードを実行し、同じネットワーク上の別のデバイスから自分のコンピュータのIPを使ってWebサイトにアクセスできます。私はドッカーマシンでそれを実行しているときに私がアクセスできない理由を理解していません。IPフォワーディングなどと関係するかもしれませんが、ネットワーキングの完全な悩みです。主にWeb開発者で、ネイティブでの経験はほとんどありません。

+0

Dockerfileで-pオプションと一緒にEXPOSE 8080を使用しましたか?また、コンテナが実行されているボックスのポート8080がセキュリティルールによってブロックされていないことを確認します。 – keda

+0

@kedaはい、DockerfileにはEXPOSE 8080が含まれています。Dockerのクイックスタートターミナルを使用してコンテナをローカルコンピュータから実行していますが、Windowsファイアウォールも無効にしましたが、どちらも動作しませんでした。私は紛失しています – raulsntos

答えて

50

TL; DRは、あなたのVirtualBoxホストのネットワークモードを確認してください - あなたは仮想マシン(とそれがホストしドッカーコンテナを)したい場合には、ローカルネットワーク上でアクセスbridgedでなければなりません。


HTTP経由でアプリケーションにアクセスするために接続するホストが混乱しているように思えます。あなたは本当にあなたの設定が何であるかを綴っていません - タグに "Windows"と "VirtualBox"があるという事実に基づいて、いくつかの推測をします。

WindowsホストのVirtualBoxで実行されているLinuxのいくつかの味でDockerを実行していると思います。私は次のようにIPアドレスをラベル付けするつもりです:

DがドッカーコンテナLinuxホストのIPアドレスは、VirtualBoxの

Wで実行されている

L =のIPアドレスを= = IPアドレスWindowsホストの

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

そしてだ:

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

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

Linuxホストがbridged以外のいくつかのモードに設定されている場合は、あなたが Windowsホストからアクセスすることができるかもしれないが、これはそれがでますまさにモードに依存しようとしている。

EDIT - 以下のコメントに基づいて、私が上に述べた状況が正しいことと非常によく似ています。

ちょっとバックアップしましょう:私のコンピュータ(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ホストではないことです。ここにはもう1つのレイヤーがあり、問題が発生しているこのレイヤー全体の通信です。あなたがホストポートにドッカーコンテナを接続するだけのように、Windowsホスト上のポート8080にVirtualBoxのVM上のポート8080を接続する

  1. :あなたが必要なもの

    は、2つのいずれかです。

  2. 上記のbridgedネットワークモードを使用して、VirtualBox VMをローカルネットワークに直接接続することができます。あなたが最初のオプションのために行く場合は

、あなたはWは、WindowsホストのIPアドレスまたはホスト名がどこにあるかhttp://W:8080で容器にアクセスすることができます。 2番目を選択すると、http://L:8080にあるコンテナにアクセスできます。Lは、Linux VMのIPアドレスまたはホスト名です。

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

VirtualBox設定ウィンドウが表示される場合は、以下で説明する変更を加えることができます。 VMを変更するコマンドラインクライアントもありますが、それに精通していません。

bridgedモードの場合は、VMをシャットダウンし、上部の[設定]ボタンをクリックしてネットワークモードをbridgedに変更し、VMを再起動してください行く。 VMはDHCP経由でローカルネットワーク上のIPアドレスを取得し、そのIPアドレスのネットワーク上の他のコンピュータから見えるようにする必要があります。

+1

私は2台のIPしか見つけられません.Dockerは、クイックスタートターミナル(192.168.99.100)と私のコンピュータが持っているもの(192.168.0.157)を開き、 'docker run -p 8080:8080 dockertest 「http://192.168.99.100:8080」を使用して私のウェブサイトにアクセスすることはできますが、私のWindowsコンピュータ(ホスト)からではなく、自分の電話からアクセスすることができます。 'docker run -p 192.168.0.157:8080:8080 dockertest'を使用すると、どこからでも任意のIPでWebサイトにアクセスすることができません。私はネットワーキングを設定する方法がわからないので、 ' - net = bridge'を使ってみましたが、うまくいきませんでした。私はVirtualBoxを開くと思いますか? Dockerの端末を使ってそれを行うことはできませんか? – raulsntos

+0

問題はDockerではないので、Dockerはあなたを助けません。私は何が起こっていると思うかを説明するためにいくつかの編集を加える予定です。 – Kryten

+0

ありがとう、ありがとう!今私は、Linux仮想マシン全体の部分が混乱していることを理解しています。私はDockerが私に触れてはいけない内部のもののためにVirtual Boxを使っていたという印象の下にあった。実際には非常に簡単でした。私はVirtual Boxで 'bridged'に変更しなければなりませんでした。今は不思議に思っています。ありがとうございます。 – raulsntos

76
  1. オープンのOracle VM VirtualBoxのマネージャ
  2. ドッカー
  3. が使用するVMを選択し
  4. クリックして設定 - >ネットワーク
  5. アダプタ1は、(デフォルトは?) "に添付:NAT" する必要があります
  6. [詳細設定]をクリックします - >ポート転送
  7. 追加ルール:プロトコルTCP、ホストポート8080、ゲストポート8080(ホストIPとゲストIPを空のままにします)
  8. ゲストはあなたのドッカーコンテナーで、ホストはあなたのマシンです

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

+7

確認されて、素敵で簡単。 – Dirk

+1

IPフィールドを空白にすることについての重要な部分が重要です! –

+1

最後に、ローカルネットワーク上のドッカーコンテナに接続できました。 – simo

0

は、いくつかのことをしようとした後、これは私の仕事:

  • 使用--publish = 0.0.0.0:8080:8080
  • がNATにVirtualBoxのネットワークモードを設定し、実行していないドッキングウィンドウフラグ任意のポート転送を使用する

0.0.0.0以外のアドレスでは、私は成功しなかった。

関連する問題