今回は、docker desktopのコンテナにネットワークを介してアクセスを行う場合を考える。この連載では、Windows上にdocker desktopをインストールしてコンテナを利用する場合を、「Dockerデスクトップ」と表記する。これは、WSL上にdocker engine(あるいはcli)をインストールして使う方法(同様にDockerエンジンと表記)と区別を付けるためである。
本連載でのDockerの解説に関しては、前々回、前回の記事を参考にしてほしい。
・Windows Subsystem for Linuxガイド 第35回 WSL2でDockerを使う その1
https://news.mynavi.jp/article/20240520-2949249/
・Windows Subsystem for Linuxガイド 第36回 WSL2でDockerを使う その2「Dockerエンジン編」
https://news.mynavi.jp/article/20240610-2962880/
また、Docker自体の使い方を解説することは、本連載の趣旨ではない。Dockerのドキュメント等を参照していただきたい。
評価は、WSL バージョン2.1.5.0(Linuxカーネル バージョン5.15.146.1-2)、をWindows 11 Ver.23H2(OSビルド10.0.22631.3737)の上で行った。docker desktopのバージョンは4.30.0(149282)、dockerエンジンのバージョンは、26.1.1である。
WSLのネットワーク
WSLのネットワークには、networkingモードがあり、NATモードとMirroredモードを切り替えることができる。このあたりに関しては、過去記事「Windows Subsystem for Linuxガイド 第34回 ミラードネットワークモード」を参照されたい。
簡単にまとめると、NATモード、Mirroredモードの違いは、(表01)のようになる。
結論からいうと、Dockerデスクトップを使う場合には、NATモードのままで問題ない。Dockerデスクトップ、Dockerエンジンのどちらの場合でも、コンテナ内のプログラムとネットワークの関係は、WSL上のプロセスとネットワークの関係とは異なることに注意されたい。
また、ここでは、話を単純にするため、WSLのファイアウォール機能は無効にしてある。具体的には、.wslconfigファイルで以下のように“[wsl2]”セクションに
[wsl2]
firewall=false
と記述する。
もし、WSLのファイアウォールを有効にした場合には、利用するネットワーク通信に応じてファイアウォール・ルールを設定する必要がある。これについては、過去記事「Windows Subsystem for Linuxガイド 第33回 WSLv2.0 Hyper-V Firewallを使う」参照していただきたい。
Dockerデスクトップのネットワーク
Dockerの動作などについて解説することは、この記事の趣旨ではないが、以後のネットワークの説明を理解するために、最低限必要なDockerのネットワークに関して記述しておく。
Dockerでは、コンテナのネットワーク接続は「コンテナ用ネットワーク(bridge)」、「ホストネットワーク(host)」および「ネットワークなし(none)」の3つがある。これをdocker runコマンドの起動オプション(--net)で指定できる。また、デフォルトでは、コンテナを管理するdockerデーモン(dockerd)は、IPv4でのみ動作する。
コンテナ用ネットワークは、Dockerがコンテナ用に用意するネットワークでDockerではこれをbridgeと呼ぶ。具体的には、Dockerのホスト側とは異なる独自のIPアドレスを持つコンテナ用のネットワークがあり、Dockerがこれを制御する。bridgeは、WSL側、およびコンテナ内では、docker0というネットワーク・インターフェースが接続している。
もう1つのホストネットワークはhostと呼ばれ、ホストのIPアドレスを使う。この場合、コンテナの待ち受けは、ホスト側のプロセスの待ち受けと同じになる。
Dockerデスクトップでは、Win32側で動作しているプロセス(com.docker.backend)が、Win32側IPアドレスでコンテナの公開ポート番号での待ち受けを行う。このため、ネットワーク接続に関しては、Win32側プロセスと同じように扱うことができ、特にWSL側でコンテナが動作していることを意識する必要はない。
なお、Win32側のファイアウォールを制御する場合、このプロセスを対象にルールを設定する。デフォルトでは、すべてのパケットを通過させる設定が行われている。
Dockerデスクトップは、デフォルトでは、IPv4のみを扱い、IPv6を扱わないようになっている。IPv6のサポートは、現状Linux環境でのみ有効だという。このため、IPv6を使ってDockerデスクトップのコンテナにアクセスすることはできない。
コンテナをネットワークアクセスする
WSLには、2つのnetworkingモードがあるため、Dockerデスクトップのコンテナ内で動作させたWebサーバー(nginx)を、アクセスする場合を調べた。
まずはNATモードの場合(表02)だが、Dockerデスクトップのコンテナは、Win32側、WSL側、LAN側からともにアクセスが行える。これは、Dockerデスクトップが、Win32側で、コンテナ向けのパケットを中継するプロセスを動作させているからだ。Dockerデスクトップのコンテナは、Win32のプロセスと同じようにネットワーク接続が行える。
Mirroredモード(表03)では、Dockerデスクトップの場合、NATモードとほとんど変わらない挙動を持つ。このことから、Dockerデスクトップを使う場合、わざわざMirroredモードを使う必要はない。また、Mirroredモードの特徴の1つであるIPv6のサポートもDockerデスクトップには必要ない。
Dockerデスクトップは、WSLの事情を考慮して作られているため、ネットワークで利用する場合には、特に何も考える必要がない。次回は、Dockerエンジンのコンテナにネットワークでアクセスする場合について解説する。
> Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/