[解決済み] ホスト外(同一ネットワーク)からDockerコンテナに接続する方法 [Windows]
質問
初めてdockerコンテナを作成し、Goを使ってサーバーを動かしていますが、ホストコンピュータの外からアクセスすることができません。私は docker を始めたばかりなので、ここで少し迷っています。
サーバーを起動する非常にシンプルな Go コードがあり、Go をインストールする docker イメージを構築し、Linux ベース イメージにコードを構築しています。サーバを 8080 番ポートで実行するので、コンテナを実行しているホストにそのポートをこのように公開します。
docker run -p 8080:8080 dockertest
これが動作して docker のマシン IP を通してサーバーにアクセスできるようになりました。 (に表示されるもの)。 Docker クイックスタートターミナル に表示されるもの)、問題は、私が はホストの外からホスティングしているウェブサイトにアクセスできないことです。 ので、私の携帯電話で同じIPアドレスを開こうとすると、それはちょうど私にエラーを与える。このウェブページは利用できません(ERR_CONNECTION_TIMED_OUT)。
このようにIPを指定してみることもしてみました。
docker run -p 192.168.0.157:8080:8080 dockertest
しかし、そうすると、DockerマシンのIPでも、上記のコマンドラインで指定したIPでも、ウェブサイトにアクセスすることができません。 私は自分のコンピュータの IP を使いましたが、127.0.0.1 (localhost) も試しましたが、同じ結果でした:どの IP からもウェブサイトにアクセスできませんでした。
私はこの問題をグーグル検索し、多くの StackOverflow の質問を見つけましたが、どちらも私の問題を解決する助けにはなりませんでした。
また、私のコンピューターで Go コードを実行し、私のコンピューターの IP を介して同じネットワーク内の別のデバイスからウェブサイトにアクセスすることができます。Docker マシンで実行しているときになぜアクセスできないのか理解できません。IP 転送か何かと関係があるのではないかと思いつきましたが、私はネットワークに完全にノータッチで、ほとんど Web 開発者であり、ネイティブの経験はほぼゼロです。
どのように解決するのでしょうか?
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 アプリケーションを実行すると、Windows ホストへの接続に
http://W:8080/
で接続できます。これは、Go アプリケーションが Windows マシンのポート 8080 をバインドしており、IP アドレスの
W
で 8080 番ポートにアクセスしようとすると、誰でも接続されてしまうからです。
そして、ここからがややこしくなる。
VirtualBox は、仮想マシン (VM) をセットアップするときに、いくつかの異なるモードのうちの 1 つでネットワークを構成できます。すべての異なるオプションが何であるかは覚えていませんが、必要なのは
bridged
. このモードでは、VirtualBoxは、ネットワークに接続された他のマシンと同様に、ネットワーク上のスタンドアロンのマシンであるかのように、仮想マシンをローカルネットワークに接続します。このモードでは
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 ホストではないということです。
必要なのは、2つのうちの1つです。
-
を使用して、Docker コンテナーをホスト ポートに接続するのと同じように、VirtualBox VM 上のポート 8080 を Windows ホスト上のポート 8080 に接続することです。
-
を使用して、VirtualBox VM をローカル ネットワークに直接接続します。
bridged
ネットワーク モードを使用します。
最初のオプションを選択した場合、コンテナにアクセスするために
http://W:8080
ここで
W
は Windows ホストの IP アドレスまたはホスト名です。2 番目を選択した場合、コンテナへのアクセスは
http://L:8080
ここで
L
は、Linux VM の IP アドレスまたはホスト名です。
VirtualBox VM の構成をどのように変更するかを理解する必要があります。Windows マシンでこの作業を行うためにどのようなツールを使用しているかはわかりませんし、Windows での Docker の使用についてはまったく知識がありませんから、ここでは本当にお役に立てません。
VirtualBox の設定ウィンドウにアクセスできれば、以下に説明するような変更を行うことができます。VM を変更するコマンド ライン クライアントもありますが、私はそれについて詳しくありません。
については
bridged
モード (これは本当に最も簡単な選択です) では、VM をシャットダウンし、上部にある "Settings" ボタンをクリックし、ネットワーク モードを
bridged
その後、VMを再起動すれば完了です。VM は DHCP 経由でローカル ネットワーク上の IP アドレスを取得し、その IP アドレスでネットワーク上の他のコンピューターから見えるようになるはずです。
関連
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] Docker Dockerコンテナからホストへのファイルコピー
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] リポジトリを使用せずに、あるホストから別のホストにDockerイメージをコピーする方法
-
[解決済み] ホストからDockerコンテナのIPアドレスを取得する方法
-
[解決済み] ライブDockerコンテナでポートを公開する
-
[解決済み】Dockerは仮想マシンとどう違うの?
-
[解決済み】Dockerコンテナからホストポートにアクセスする方法
-
[解決済み] Docker Toolbox - ローカルホストが動作しない
-
[解決済み] ファイルを上書きせずにコピーする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WindowsでTCPまたはUDPポートをリッスンしているプロセスを見つけるにはどうすればよいですか?
-
[解決済み] IE10はIE7モードでレンダリングされます。強制的に標準モードにする方法は?
-
[解決済み] コマンドラインでXLSからCSVに変換する
-
[解決済み] IF... OR IF...をWindowsのバッチファイル内で実行する
-
[解決済み] プログラムファイルx86の環境変数を取得するには?
-
[解決済み] Git リポジトリを Windows でホスティングする
-
[解決済み] バッチファイル: コンソールウィンドウを開いたままにする方法
-
[解決済み] ファイルを上書きせずにコピーする
-
[解決済み] Windowsのドメインコントローラをプログラムで確認するにはどうすればよいですか?
-
[解決済み] Sublimeをデフォルトエディタに