web-dev-qa-db-ja.com

Docker:MacOSX Expose Containerポートをホストマシンに

私の仕事では、Dockerと、_--net=Host_オプションを使用して、Dockerコンテナーポートをマシンに転送するチャームのように機能しています。これにより、例として特定のポートを使用する不快なタスクを追加できます。

  • カバレッジレポートをポート9001で提供するためのタスク
  • ポート9000で提供されるアプリのローカル展開バージョン
  • 監視ライブはポート35729をリロードします
  • 単体テストのランナーには9876ポートを使用します

MacでDockerを使い始めたとき、私が最初に抱えていた問題は、オプション--net=Hostが機能しなくなったことです。私は調査しましたが、これが不可能である理由(MacのDockerは独自の仮想マシンで実行されます)と私の一時的な解決策は、ポートを公開するために-pオプションを使用することですが、この制限により、さらに多くのタスクを追加できます公開する必要があるポートごとに明示的な-pコマンドを実行する必要があるため、ポートを使用します。

これと同じ問題を抱えている人は?これにどう対処するか?

あなたの問題はおそらくあなたがdockertoolboxまたはdhingy/dliteを使用しているか、または本格的なLinux VMを提供する他のものを使用していて、DockerをホストしてこのVM内のコンテナ。これは、VMにはもちろん、独自のネットワークスタックと独自のIPがホスト上にあり、ツールで問題が発生するということです。コンテナの公開されたポートはOSX Host localhost、むしろOSX Docker-VM-ip

これらの問題をエレガントに解決するには

コンテナーからOSX localhostにポートを公開する

  1. まず、dockertoolboxなどの代わりにdocker-for-mac https://docs.docker.com/engine/installation/mac/ を使用/インストールします。ホストのネットワークスタックを再利用する特別なxhyveスタックに基づいています
  2. docker run -p 3306:3306 perconaを実行すると、3306がosx-Host-localhostにバインドされます。したがって、localhost:3306にアタッチしようとする他のすべてのosx-toolは、慣れているように機能します(非常に便利) brew install mysqlまたは同様にmysqlをインストール
  3. Dockerコンテナーを使用するOSXでコード共有でパフォーマンスの問題が発生する場合は、 http://docker-sync.io を確認してください-docker-for-macと互換性があります(ヒント:私はこれに偏っています)

OSXホストからコンテナにポートをエクスポートする

特に何もエクスポートせず、すべてのコンテナ(OSX-Host-localhostのすべてのポート)から全体としてアクセス可能にする

OSXホストで提供したポートにattachしたい場合は、コンテナ内から、例えばxdebugセッション中、IDE listens on port 9000on the OSX-Host-localhostand the container running FPM/PHPは、Macでこのosx-localhost:9000にattachする必要があります。これを行う必要があります: https://Gist.github .com/EugenMayer/3019516e5a3b3a01b6eac88190327e7c

したがって、ダミーのループバックIPを作成し、10.254.254.254:9000を使用してコンテナーなしでOSXホストポートにアクセスできるようにします。これは移植可能であり、基本的に、これまでのように開発に必要なすべてを提供します


そのため、Macで実行されており、localhost:portに接続しようとするアプリへのコンテナー公開ポートへの接続を提供します

そして2番目の逆は、コンテナー内の何かがホストのポートに接続したい場合です。

5
Eugen Mayer

コンテナポートをホストにバインドする 」で説明されている1つの回避策は、-Pを使用することです。

(または--publish-all=true|false)を docker run に変更すると、イメージのDockerfileのEXPOSE行または--expose <port>コマンドラインですべてのポートが識別されます。フラグを立てて、エフェメラルポート範囲内のいずれかのホストポートにマッピングします。
docker portコマンドを使用して、作成されたマッピングを検査する必要があります。

したがって、アプリがdocker port <CONTAINER>を使用してマッピングされたポートを取得できる場合は、必要な数のコンテナーを追加して、マッピングされたポートをそのように取得できます(「各ポートに明示的な-pコマンド」は必要ありません)。 。

2
VonC

Mac用のドッカーが後で双方向接続をサポートできるかどうか不明 https://forums.docker.com/t/will-docker-for-mac-support-bi-directional-connection-between-Host-and -container-in-the-future/19871

私には2つの解決策があります:

  1. 単純なラッパースクリプトを記述して、スクリプトに公開するポートを渡すことができます。
  2. vagrantを使用して、ネットワークが制御されている仮想マシンを起動します。
1
xdays