ネットワーク構築機能¶
機能¶
VPN パススルー¶
Docker Desktop のネットワーク構築は、VPN 接続時も動作します。そのためには、あたかも Docker アプリケーションが発信しているかのように、Docker Desktop がコンテナからのトラフィックを取り込み、Mac へ投入します。
ポートマッピング¶
コンテナに -p
引数を付けて実行します。こちらが実行例です。
$ docker run -p 80:80 -d nginx
Docker Desktop for Mac はコンテナ内のポート 80 で実行しているものが何であろうと(この例では nginx )、 localhost
のポート 80 上で利用可能にします。ホスト側で異なるポートを指定するにはどうしたら良いでしょうか。例えば、ホストマシン側でポート 80 上で実行中の何かがある場合、コンテナに対しては別のポートで接続できます。
$ docker run -p 8000:80 -d nginx
これで localhost:8000
への接続が、コンテナ内のポート 80 へ送られます。 -p
の構文は ホスト側ポート:クライアント側ポート です。
HTTP/HTTPS Proxy サポート¶
PROXIES(プロキシ) をご覧ください。
既知の制限、利用例、回避方法¶
以下で扱うのは、 Docker Desktop for Mac 上のネットワーク構築スタックにおける、現時点での制限の要約と、回避策に対する考え方です。
macOS に docker0 ブリッジがありません¶
ネットワーク構築機能の実装が、Docker Desktop for Mac 用のため、ホスト側では docker0
インターフェースは見えません。このインターフェースは、実際には仮想マシン内にあります。
コンテナに ping できません¶
Docker Desktop for Mac は Linux コンテナに対してトラフィックを経路付け(ルーティング)できません。
コンテナごとに IP アドレスを割り当てられません¶
docker (Linux) ブリッジ・ネットワークは macOS ホストから到達できません。
利用例と回避方法¶
前述の制限に対応する、2つのシナリオがあります。
コンテナからホスト上のサービスに対して接続したい¶
ホストの IP アドレスは変動します(あるいは、ネットワークへの接続がありません)。18.03 よりも前は、特定の DNS 名 host.docker.internal
での接続を推奨していました。これはホスト上で内部の IP アドレスで名前解決します。これは開発用途であり、Docker Desktop forMac 外の本番環境では動作しません。
また、ゲートウェイに対しては gateway.docker.internal
で到達可能です。
Mac からコンテナに対して接続したい¶
localhost
に対するポート転送(port forwarding)が動作します。つまり、 --publish
、 -p
、 -P
が全て機能します。Linux からのポート公開(露出)は、ホスト側に転送されます。
現時点で推奨するのは、ポートの公開か、他のコンテナからの接続です。これは Linux 上でも同様ですが、ブリッジ・ネットワークではなくオーバレイ・ネットワーク上にコンテナがある場合、到達(経路付け)できません。
始めましょう で用いたアプリケーション例にある nginx
ウェブサーバを表示するには、次のコマンドを使います。
$ docker run -d -p 80:80 --name webserver nginx
構文を明確にしましょう。以下の2つのコマンドは、いずれも同じコンテナのポート 80
をホスト側のポート 8080
に公開するものです。
$ docker run --publish 8000:80 --name webserver nginx
$ docker run -p 8000:80 --name webserver nginx
全ポートを公開するには -P
フラグを使います。例えば、以下のコマンドはコンテナを起動し(デタッチド・モードで)、 -P
フラグはコンテナが公開する全てのポートを、ホスト側ランダムなポートに対して割り当てます。
$ docker run -d -P --name webserver nginx
docker run
で公開するオプションに関する詳細は run コマンドを御覧ください。
参考
- Networking features in Docker Desktop for Mac
- https://docs.docker.com/docker-for-mac/networking/