Dockerマシンをホスト名でWindowsで使用できるようにしようとしています。のように作成した後
docker-machine create -d virtualbox mymachine
ポート80を公開するDockerコンテナを設定するには、ブラウザに「 http:// mymachine / 」と入力してWebサイトをロードできるように、そのDockerマシンにホスト名を付けるにはどうすればよいですか? 「mymachine」を実際のIPアドレスに変更すると、機能します。
これには answer があります question ですが、hosts
ファイルにエントリなしでそれを実現したいと思います。それは可能ですか?
Dockerのドキュメントを参照することをお勧めします: https://docs.docker.com/engine/userguide/networking/#exposed-and-publishing-ports
DockerfileのEXPOSEキーワードまたは--exposeフラグを使用してポートを公開し、Dockerを実行します。ポートの公開は、使用されているポートを文書化する方法ですが、実際にはポートをマップしたり開いたりすることはありません。ポートの公開はオプションです。
--publishまたは--publish-allフラグを使用してポートを公開し、Dockerを実行します。これは、コンテナのネットワークインターフェースで開くポートをDockerに指示します。ポートが公開されると、実行時にホストマシンでマップするポートを指定しない限り、ホストマシンで使用可能な上位ポート(30000より高い)にマップされます。イメージを(Dockerfileで)ビルドするときに、ホストマシンでマップするポートを指定することはできません。これは、イメージを実行するホストマシンでポートが使用可能であることを保証する方法がないためです。
また、-pとは異なるため、-Pフラグを確認することをお勧めします。 ) 1。
また、WindowsまたはMac用の「Kitematic」を試してみることをお勧めします https://kitematic.com/ 。はるかに簡単です(ただし、変更後にコミットすることを忘れないでください!)
会社のネットワークに関しては、Dockerとは何の関係もありません。コンピューターでローカルにDockerを使用している限り、会社がどの構成を設定してもかまいません。ローカルホストに公開するためにVMネットワーク構成を変更する必要はありませんが、Vboxを使用している場合はすべてデフォルトで提供されます(アダプター1 ==> NAT&アダプタ2 ==>ホストのみ)
これがあなたが探しているものであることを願っています
ホスト名で接続するには、ホスト名を経由してIP解決を行う必要があります。これはhostsファイルによって処理され、DNSにフォールバックします。これはすべて、Dockerコンテナーに触れる前に発生し、Dockerマシン自体には、ホストファイルまたはDNSサーバーを構成するための外部フックがありません。
Windowsで新しいバージョンのDockerを使用すると、HyperVでコンテナーを実行し、ネットワークによってポートが自動的にlocalhostにマップされるため、 http:// localhost に接続できます。これは、ローカルホストマッピングなしでvirtualbox VMをスピンアップするため、docker-machineでは機能しません。
ホストファイルであるDNSを構成せず、新しいバージョンのdockerを使用できない場合は、IPで接続する必要があります。できることは、 http://xip.io/ のような無料のワイルドカードDNSサービスを使用することです。このサービスは、任意の名前とIPアドレスを同じIPアドレスにマップします。これにより、ホスト名ベースのリバースプロキシなどを使用して、同じポートの背後にあるDocker内の複数のコンテナーに接続できます。
最後のオプションは、docker Host VMを静的IPで実行することです。 Docker-machineはまだこれを直接サポートしていません なので、運に頼ることができます。特定の範囲から同じIPを維持するか、Vagrantなどの別のツールを使用してDocker Host VMをラップトップの静的IPで起動します。静的IPを取得したら、ファイルを1回ホストするか、開発者ごとにDNSエントリを作成するか、同じxip.io URLを使用して、毎回コンテナーにアクセスします。
目標が複数の開発者にとって可能な限りシンプルに保つことである場合、localhost
が最善の策です。公開および公開しているポートがホストで使用可能である限り、ブラウザーで http:// localhost を使用できます。 80/443
以外のポートの場合は、 http:// localhost:808 のように追加します。
本当に/etc/hosts
またはlocalhost
ルートに行きたくない場合は、ドメインを購入して127.0.0.1
にルーティングすることもできます。これ 記事 詳細をもう少し詳しく説明します。
例:
dave-mbp:~ dave$ traceroute yoogle.com
traceroute to yoogle.com (127.0.0.1), 64 Hops max, 52 byte packets
1 localhost (127.0.0.1) 0.742 ms 0.056 ms 0.046 ms
または、独自のドメインを購入したくなく、すべての開発者が同じネットワーク上にあり、DHCP/DNSを制御できる場合は、独自のDNSサーバーを設定して、127.0.0.1
に戻るプライベートルートを含めることができます。 。パブリックDNSオプションと同様の概念ですが、制御されたネットワークの外部で開発者がリモートで作業できるようにする可能性があるため、少し脆弱です。
マルチキャストDNSを備えたマシン(MacではBonjour)を使用している場合、私にとって有効なアプローチは、Docker Machine vboxで Avahiコンテナー を起動することです。これにより、<docker-machine-vm-name>.local
のVMサービス)を参照できます。編集/etc/hosts
も、クレイジーなネットワーク設定もありません。
仕事のプロジェクトごとに異なるVirtualboxVMを使用しているため、関心の分離がうまく行われます(ポートの衝突を防ぎ、他のプロジェクトに影響を与えることなく、すべてのコンテナーとイメージを吹き飛ばすことができます)。
docker-compose
を使用して、各プロジェクトの先頭にAvahiインスタンスを配置します。
version: '2'
services:
avahi:
image: 'enernoclabs/avahi:latest'
network_mode: 'Host'
次に、ポート80に転送するDockerコンテナを使用してVMでWebサーバーを実行すると、ブラウザーではhttp://machine-name.local
になります。
hosts file
:にドメイン名エントリを追加できます。
X.X.X.X mymachine # Replace X.X.X.X by the IP of your docker machine
アプリが職場の同僚から到達可能であり、Windowsマシンがサーバーとして稼働し続けることを目的としている場合は、ローカルネットワークにDNSサーバーを設定することもできます。
VMローカルネットワークからアクセス可能にする必要がありますが、 ポート転送 は、アプリがWindowsホストで実行されている唯一のWebサービスである場合、簡単な解決策になる可能性があります。 。(Windowsでdocker-machineを使用しないようにLinuxサーバーを設定することもできますが、ドメイン名の解決が機能するようにするには、このサーバーの静的IPを設定する必要があります)。
ホストファイルに書き込む権限がない場合は、独自のドメイン名を購入して(または無料で入手して)、DockerマシンのIPを割り当てることもできます。
ただし、アプリのホストに 静的IP がなく、DockerマシンのIPが変更された場合、これらのソリューションはしばらくすると機能しなくなる可能性があります。静的IPを設定しなくても、自動的に変更されるわけではありません。マシンを消去して新しいIPを作成しない場合は、ある程度の永続性があるはずですが、それも保証されません。
また、DNSサーバーを設定する場合は、静的IPを備えたデバイスでもホストする必要があることに注意してください。次に、同僚はこれを使用するようにマシンを構成する必要があります。
nginx-proxy をお勧めします。これは私がいつも使っているものです。これは、すべて同じポートに応答することになっているさまざまなコンテナー(複数のWebサービスなど)を実行している場合に特に便利です。
nginx-proxyはサービスとは別に実行され、docker-eventsをリッスンして独自の構成を更新します。サービスを起動し、nginx-proxyがリッスンしているポートにクエリを実行すると、サービスにリダイレクトされます。したがって、DEFAULT_Hostフラグを使用してnginx-proxyを開始するか、リクエストとともに目的のホストをヘッダーパラメーターとして送信する必要があります。
私はこれをプレーンなdockerでのみ実行しているので、docker-machineで動作するかどうかはわかりません。
このオプションを選択した場合、特定のドメイン(.docker
など)をローカルホストに完全に解決することを決定できます。これは、DNSによって全社的に、hostsファイルまたは中間リゾルバーを使用してローカルで実行できます(もちろん、特定のソリューションはOSによって異なります)。次に到達しようとすると http://service1.docker nginx-proxyは、ENV VIRTUAL_Host=service1.docker
を持つコンテナにルーティングします。これは非常に便利です。1回のセットアップで済み、それ以降は動的になるからです。