WSL2 をバックエンドにする - Docker Desktop
Docker Desktop for Windows は WSL2 をバックエンドとしてコンテナを動かす構成。`docker-desktop` 専用ディストリに dockerd を常駐させ、ユーザーのディストリからは統合機能で透過的に使える。
概念図
構文
bash
docker context ls
wsl -l -v実例
docker-desktop ディストリが見えるか確認
bash
wsl -l -v現在の Docker コンテキストを確認
bash
docker context lsWSL2 内から bind mount 付きで起動
bash
docker run --rm -it -v $PWD:/work -w /work alpine sh概要
Docker Desktop for Windows はインストール後に 2 つの専用 WSL2 ディストリを作成します。
docker-desktop は Docker デーモン(dockerd / containerd)が動く場所で、docker-desktop-data(バージョンによっては別形式)はイメージ・レイヤー・ボリュームのデータを保持します。
ユーザーが普段使うディストリ(Ubuntu など)は「WSL integration」を通じて docker CLI とソケットだけを共有し、実際のコンテナは裏の docker-desktop VM 側で動きます。
これにより、複数のディストリから同じ Docker インスタンスを使えるほか、Windows 側 PowerShell からも同じ docker コマンドが使えます。
典型的な用途
- Windows 上で Linux コンテナ開発をする個人・チームの標準構成
- 複数の WSL2 ディストリから同じコンテナ環境を共有
- IDE(VS Code、JetBrains 等)の devcontainer 機能のバックエンド
- Docker Compose / Kubernetes ローカル開発
- Linux 本番環境の挙動を手元で確かめるサンドボックス
コマンド例
# WSL から見るとこう見える
wsl -l -v
# NAME STATE VERSION
# * Ubuntu-22.04 Running 2
# docker-desktop Running 2
# docker-desktop-data Running 2
# Docker コンテキスト
docker context ls
# NAME DESCRIPTION DOCKER ENDPOINT
# desktop-linux * Docker Desktop unix:///...
# default Current DOCKER_HOST based... unix:///var/run/docker.sock
# WSL2 ディストリ(Ubuntu)から
docker version
docker run --rm hello-world
# bind mount のパス指定
# 推奨: WSL2 側のパスを使う
docker run --rm -v $HOME/app:/app -w /app node:20 npm test
# 非推奨: Windows 側のパス(遅い)
# docker run --rm -v /mnt/c/Users/alice/app:/app ...
ベストプラクティス
- ソースコードは WSL2 側(
~/...)に置き、bind mount もそこから行う。/mnt/c/...は IO が重くビルドが遅い - Docker Desktop 設定の「Resources > WSL Integration」で、使うディストリだけを有効化する
- メモリ上限は
.wslconfigで設定し、VM 停止時の解放挙動(autoMemoryReclaim)を現行 WSL に合わせて使う - プロキシ環境では Docker Desktop の設定画面で HTTP プロキシを登録し、
docker-desktopディストリから外部レジストリに届くようにする - 有償制約を避けたい場合は Rancher Desktop や Podman Desktop への移行を検討し、CLI 互換を保つ
注意点
- Docker Desktop は大企業に対して有償ライセンスが必要。社内配布ルールを事前に確認する
docker-desktop-data.vhdxは放置すると肥大化する。docker system prune --volumesや VHDX の圧縮コマンドで回収する- Docker Desktop をアンインストールすると専用ディストリごと消え、再現できないコンテナ状態は失われる
- Hyper-V に依存するため、他の仮想化製品(一部の古い VMware 等)と同居すると片方が動かなくなることがある
- 企業 VPN によっては Docker Desktop の仮想 NIC とルーティングが競合する
関連トピック
WSL2- Windows Subsystem for Linux の第 2 世代。Hyper-V 技術を基盤にした軽量 VM 上で本物の Linux カーネルを動かす方式で、WSL1 のエミュレーションとは根本的に別物。Docker Desktop の標準バックエンドでもある。 /mnt/c vs ~- WSL2 では `~/`(Linux 側 ext4)と `/mnt/c/`(Windows 側 NTFS)で IO 性能が 10 倍以上違うことがある。`9p` プロトコルを介した Windows FS アクセスが遅いため、作業ファイルの置き場所で体感が大きく変わる。 netsh portproxy- WSL2 は独自 IP を持つ VM なので、Windows の `localhost` からアクセスするには自動転送、同一 LAN の別端末からアクセスするには `netsh portproxy` 等の追加設定が必要になる。 