1. ホーム
  2. windows

[解決済み] ホスト外(同一ネットワーク)からDockerコンテナに接続する方法 [Windows]

2022-12-06 18:29:41

質問

初めて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つです。

  1. を使用して、Docker コンテナーをホスト ポートに接続するのと同じように、VirtualBox VM 上のポート 8080 を Windows ホスト上のポート 8080 に接続することです。

  2. を使用して、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 アドレスでネットワーク上の他のコンピューターから見えるようになるはずです。