最初のdockerコンテナーを作成しました。Goを使用してサーバーを実行していますが、ホストコンピューターの外部からアクセスできません。 Dockerを始めたばかりなので、ここで少し迷っています。
サーバーを起動する非常にシンプルなGoコードがあります。GoをインストールしてLinuxベースイメージにコードをビルドするdockerイメージをビルドしました。ポート8080でサーバーを実行しているので、次のようにコンテナーを実行しているホストにそのポートを公開します。
docker run -p 8080:8080 dockertest
それは機能し、ドッカーのマシンIPを介してサーバーにアクセスできます(開始時にDockerクイックスタートターミナルに表示されるもの) )、問題は私ですホストの外部からホストしているウェブサイトにアクセスできませんですので、電話で同じIPアドレスを開こうとすると、エラーが発生します:このウェブページ使用できません(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)も試してみましたが、同じ結果が得られました:どのWebサイトにもアクセスできませんでしたIP。
私はこの問題をグーグルで調べて、StackOverflowに関する多くの質問を見つけましたが、どちらも私の問題を解決する助けにはなりませんでした。
また、コンピューターでGoコードを実行し、コンピューターのIPを介して同じネットワーク内の別のデバイスからWebサイトにアクセスできます。 Dockerマシンで実行しているときにアクセスできない理由がわかりません。IP転送などに関係している可能性がありますが、ネットワークの完全な初心者です。ほとんどがウェブ開発者であり、ネイティブの経験はほとんどありません。
TL; DR VirtualBoxホストのネットワークモードを確認します。ローカルネットワーク上で仮想マシン(およびホストしているDockerコンテナ)にアクセスできるようにする場合は、bridged
にする必要があります。
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アドレスW
でポート8080にアクセスしようとすると接続されるためです。
そして、それはより複雑になるところです:
VirtualBoxは、仮想マシン(VM)をセットアップするときに、いくつかの異なるモードのいずれかでネットワークを構成できます。すべての異なるオプションが何であるか覚えていませんが、必要なものはbridged
です。このモードでは、VirtualBoxは、ネットワークに接続されている他のマシンと同様に、仮想マシンをネットワーク上のスタンドアロンマシンであるかのようにローカルネットワークに接続します。 bridged
モードでは、仮想マシンは他のマシンと同様にネットワーク上に表示されます。他のモードでは設定が異なり、ネットワーク上でマシンが表示されなくなります。
したがって、Linuxホスト(bridged
)のネットワークを正しくセットアップすると、Linuxホストはローカルネットワーク(192.168.0.xなど)のIPアドレスを持ち、http://L:8080/
でDockerコンテナーにアクセスできます。
Linuxホストがbridged
以外のモードに設定されている場合、mightWindowsホストからアクセスできますが、これは正確に依存しますどのモードになっているか.
EDIT-以下のコメントに基づいて、上で説明した状況が正しいように思えます。
少しバックアップしましょう。ここで、Dockerが私のコンピューター(Ubuntu Linux)でどのように機能するかを説明します。
同じコマンドdocker run -p 8080:8080 dockertest
を実行すると想像してください。これは、dockertest
イメージに基づいて新しいコンテナーを開始し、Linuxホスト(私のPC)のポート8080をコンテナーのポート8080に転送(接続)することです。 Dockerは、独自の内部ネットワーク(独自のIPアドレスのセット)をセットアップして、Dockerデーモンが通信できるようにし、コンテナーが相互に通信できるようにします。つまり、基本的に-p 8080:8080
で行うことは、Dockerの内部ネットワークを「外部」ネットワークに接続することです。ホストのネットワークアダプタ-特定のポート。
これまで私と一緒に?さて、さあ、一歩戻ってシステムを見てみましょう。マシンはWindowsを実行しています-Dockerは(現在)Windowsで実行されていないため、使用しているツールはVirtualBox仮想マシンにLinuxホストを設定しています。環境でdocker run
を実行すると、まったく同じことが起こります。Linuxホストのポート8080がコンテナーのポート8080に接続されます。ここでの大きな違いは、Windowsホストはコンテナーが実行されているLinuxホストではないため、ここに別のレイヤーがあり、このレイヤー全体で問題が発生していることです。
必要なものは、次の2つのいずれかです。
dockerコンテナをホストポートに接続するのと同じように、VirtualBox VMのポート8080をWindowsホストのポート8080に接続します。
上記で説明したbridged
ネットワークモードでVirtualBox VMをローカルネットワークに直接接続するには。
最初のオプションを選択すると、http://W:8080
でコンテナーにアクセスできます。ここで、W
はWindowsホストのIPアドレスまたはホスト名です。 2番目を選択すると、http://L:8080
でコンテナーにアクセスできます。ここで、L
はLinux VMのIPアドレスまたはホスト名です。
以上がすべての高レベルの説明です。VirtualBoxVMの構成を変更する方法を理解する必要があります。そして、私は本当にあなたを助けることができないところです-あなたがWindowsマシンでこれをすべて行うためにどのツールを使用しているのか分かりません。
VirtualBox設定ウィンドウが表示されたら、以下で説明する変更を行うことができます。 VMを変更するコマンドラインクライアントもありますが、私はそれをよく知りません。
bridged
モードの場合(これが最も簡単な選択です)、VMをシャットダウンし、上部の[設定]ボタンをクリックし、ネットワークモードをbridged
に変更して、VMを再起動すると、行ってもいい。 VMは、DHCPを介してローカルネットワーク上のIPアドレスを取得し、そのIPアドレスでネットワーク上の他のコンピューターから見えるようにする必要があります。
これで、localhost:8080およびyour-internal-ip:8080を介してコンテナーを参照できるようになります。
いくつかのことを試した後、これは私のために働いた:
0.0.0.0
以外のアドレスでは、成功しませんでした。
これは、Dockerコンテナを実行するためにWindowsユーザーが直面する最も一般的な問題です。 IMOこれは「Dockerでの百万ドルの質問」です。 @ "Rocco Smit"は、「そのホストへのインバウンドトラフィックは、ホストマシンのファイアウォールでデフォルトで無効にされました」と正しく指摘しています。私の場合は、McAfee Anti Virusソフトウェアです。 McAfeeのファイアウォール設定で、同じWifi LAN上の他のコンピューターからの受信トラフィックに許可される追加のポートを追加しました。それは魔法でした。インターネット、SO、Dockerのドキュメント、Dockerのネットワークに関連するチュートリアルの後のチュートリアル、および「macvlan」、「ipvlan」、「user」の「Windowsでサポートされていません」の多くの図を閲覧するのに1週間以上苦労しました定義されたブリッジ」と、これと同じSOスレッドでさえ数回。 「本番でDockerを使用している人は?」(GoogleはWindowsサーバーよりもProdワークロードで人気が高いことを知っています)でGoogleをブラウジングし始めました(同じホームwifiのモバイルから)nginxにアクセスできませんでしたWindowsのDocker Containerにデプロイされたアプリ。結局のところ、少なくとも同じLAN内の他のコンピューター/デバイスから(Dockerコンテナーにデプロイされた)アプリケーションにアクセスできない場合、それは素晴らしいことです。最終的に、私の場合、問題は着信トラフィックをブロックするファイアウォールにありました。
TLDR:Windowsファイアウォールを有効にしている場合は、プライベートネットワークで「vpnkit」の例外があることを確認してください。
特定のケースでは、ローカルネットワーク上の別のマシンからコンテナの公開ポートにアクセスしようとすると、Windowsファイアウォールが接続をブロックしていることがわかりました。
ただし、コンテナーのサービスにアクセスできるようにするために、ファイアウォールを完全に無効にしたくありませんでした。これは、どの「アプリ」が私のコンテナのサービスに代わってリッスンしていたかという質問を懇願しました。 別のSOスレッド を見つけた後、netstat -a -b
を使用してマシンのリッスンソケットの背後にあるアプリを検出するように教えられたので、既にvpnkit.exe
であることがわかりました。 Windowsファイアウォールの設定:ただし、「プライベートネットワーク」は無効になっており、一度有効にすると、ファイアウォールを完全に無効にすることなく別のマシンからコンテナのサービスにアクセスできました。
ホストマシンの外部からDockerコンテナへの接続を確立できないとは信じられません。私は1年以上Dockerを使用しており、Linuxでシステムをセットアップしています。今週はDocker for Windowsを使用したのは初めてですが、ホストにソケットを作成するのがこれほど難しいことにはショックを受けました。
この問題の解決策はありますか、またはブリッジアダプターを備えたVM内で本当にdockerを実行する必要がありますか?
-pポート値の設定に加えて、Docker for Windowsはvpnkitを使用し、ホストマシンのファイアウォールでそのトラフィックがデフォルトで無効になっていることがわかりました。 vpnkitのインバウンドTCPルールを有効にした後、ローカルネットワーク上の他のマシンからコンテナにアクセスできました。