keke's diary

おめでとうございます!

Docker Desktop for Windows 無しで Docker を使う

Docker Desktop は特に Windows 上で簡単に Docker 環境を用意できる素晴らしいツールです。
そんな Docker Desktop は最近になって subscription の仕組みが変わり、大きめの企業では有償プランへの移行の検討が必要となりました。

個人向けでは今後も無料ですが、そんな Docker Desktop (for Windows) の代替として、 WSL 上の Ubuntu で Docker daemon を動かし、それを Windows 上の Docker CLI から操作するという方法が紹介されていました。
この方法であれば Visual Studio Code拡張機能である Remote Container も利用できるので非常に便利です。

この記事は、そんな Docker daemon on WSL を Windows から動かす方法の設定メモです。

注意事項

この方法は Docker on Ubuntu 20.04 on WSL 2 を利用します。
他の用途のために Ubuntu on WSL を利用しても良いですが、避けたほうが良いかもしれません。
また他の WSL で提供されているディストリビューションを利用して、同様のことを実現できるかもしれません。

やりかた

Docker on Ubuntu on WSL を準備する

WSL 2 の公式ドキュメントDocker の公式ドキュメントを見るなりして、 Ubuntu on WSL に Docker をインストールしておきましょう。
ちなみに WSL のデフォルトユーザを root に設定しておくとパーミッションに悩まされずに済むかもしれないです。

Windows に Docker CLI を導入する

Docker daemon on Ubuntu on WSL を Windows から操作するための Docker CLI を用意しましょう。
有志が Windows 用にビルドした Docker CLI が GitHub で公開されているのでこれをダウンロードし、C:\bin\など適当なディレクトリに置いてパスを通します*1

Docker daemon を動かす

Windows から見てリモートの Docker daemon を操作できるようにするため、以下のことが必要です。

  • Ubuntu on WSL の IP アドレスを取得しておく
  • Docker CLI で動かすホストを指定するために環境変数 DOCKER_HOST を設定する
  • Ubuntu on WSL で Docker daemon を動かす

これを実行するための PowerShell スクリプトが以下です。

$ip = $(wsl -e sh -c "ip -4 addr show dev eth0 | grep -Po 'inet \K[\d.]+'")
[System.Environment]::SetEnvironmentVariable("DOCKER_HOST", "tcp://$($ip):2375", "User")
wsl -d Ubuntu-20.04 -e sh -c "dockerd --tls=false --host=$ip"
[System.Environment]::SetEnvironmentVariable("DOCKER_HOST", "", "User")

ps1 ファイルとして保存して右クリックから実行しましょう。 Docker daemon を終了したい場合には Ctrl + C で停止できます。

以上で準備は完了です。

Windows から Docker を動かしてみる

既に Windows 上のコマンドプロンプトなどから普通に Docker が利用できるようになっているはずです。
docker run --rm hello-worldなどを実行して動作確認をしておきましょう。

また Visual Studio Code拡張機能である Remote Container も利用できるようになっているはずです。