Windows 10 で WSL2 と Docker をセットアップ

雑誌「Software Design 2021年12月号」の Docker 特集記事を読んで、Docker を試してみたくなりました。自宅の Windows 10 の PC に Docker 環境をインストールして遊んでみることに。せっかくなので、Docker のバックエンドには、Hyper-V ではなくて WSL2 (Windows Subsystem for Linux 2) を選びたいところ。最終的には、Docker Desktop for Windows はあきらめて、Rancher Desktop 1.0.0 を使うことにしました。

まえがき

Docker も WSL2 も以前から興味があって、いろいろ調べてはいたのですが、実際に使ったことはありませんでした。 WSL2 は「Windows 上で bash とか使えて便利!」とか聞きますが、わたしはもともと Git for Windows という MSYS ベースの環境を入れてて、 bash とか perl とかふつうに使えていたので、特に必要性は感じていなかったのです。本題には関係ないんですが、FFmpeg とか ImageMagick とかをシェルスクリプトで走らせるの、すごく便利ですよね。複数ファイルのバッチ処理も xargs -P で並列化するだけで簡単にマルチコアを有効活用できちゃいます。

Docker は、プライベートの独自ドメインを運用している VPS サーバで使いたいとは思っていて、本を買ったけど読んでなかったりして、次にサーバを乗り替えるタイミングで導入するつもりでした。実は、いま借りている VPS はカーネルが古くて Docker 使えないのです。そこで、手元の Windows PC で Docker 動かせばいろいろ遊べるのでは? というお話になるわけです。

まず、そもそも Windows 上で Docker を動かすってどういう意味? というところから調べてみる:

とりあえず、WSL2 をバックエンドにして Docker を動かすのが、一番オーバーヘッドが少なそう。 WSL2 に入れたディストリビューション上で Docker を動かしてもいいのですが、やっぱり Windows のコマンドライン上で docker コマンドが使えたほうが便利そうな気がする。 Docker Desktop for Windows の新しいライセンス形態について話題になっていますが、とりあえず個人的な利用だから OK でしょう。

というわけで、つぎに WSL2 について調べてみる:

だいたい理解できた。

実際の作業

環境:

OS: Windows 10 Pro 64bit 21H2 (build 19044)
CPU: AMD Ryzen Threadripper 2950X (16core/32thread, 3.5GHz)
MEM: 32GB

Hyper-V 利用中(いろいろ実験用の Windows 10 をゲストとして動かしている)
Windows Defender 以外のセキュリティソフトは無し

まず、Windows の機能を有効化します。(Windows のコマンドラインで wsl --install とやればよろしくやってくれるような話もありますが、今回は手動で有効化しました)

上図で赤線を引いてある「Linux 用 Windows サブシステム」と「仮想マシン プラットフォーム」にチェックマークを付けます。なお、この設定ウインドウは、
「設定」⇒「アプリ」⇒「オプション機能」⇒「Windows のその他の機能」
で開けます。

で、本来はここで WSL2 にてきとうなディストリビューション(Ubuntu-20.04 とか)を入れるのでしょうが、 Docker 環境以外に余計なモノを入れたくなかったので、スキップ。

いきなり Docker Desktop for Windows をインストールします。 Docker の公式サイトからインストーラーをダウンロードして実行。

バージョンは 4.4.4 (73704) でした。今回は Docker のバックエンドを WSL2 にしたいので、「Install required Windows components for WSL2」のチェックボックスを ON にしておきます。なお、ダウンローダーの .exe ファイルをダブルクリックしても起動せず、右クリックメニューから「管理者として実行」しないとダメでした。

インストーラーは無事終了。

デスクトップに作られたアイコンをダブルクリックして起動してみると、エラーダイアログが出てしまいました。なにやら内部エラーで例外をスローしている模様。「Failed to deploy distro docker-desktop to」とか言ってますが、よくわからない。

ググってみると、「Docker Desktop for Windows の WSL2 バックエンドは Hyper-V とは共存できない」みたいな話が出てきます。 Docker Desktop for Windows の Dashboard 画面は開いたので、設定画面で WSL2 バックエンドを無効化してみると、エラーにはならなくなりました。でも、これでは当初のもくろみから外れてしまいます・・・。

Windows のコマンドラインで wsl -l -v を実行すると、docker-desktopdocker-desktop-data が確認できました。

しかし、タスクトレイのアイコンをクリックしても右クリックしても反応しなかったり、すごく遅れて右クリックメニューが開いたんだけど項目がクリックできなかったり、すごく不安定

もしかして WSL2 がちゃんとセットアップできていないのかも? と疑って、てきとうなディストリビューションを入れてみることに。

Windows のコマンドラインで wsl --install -d Ubuntu-20.04 と実行すると、あっさり成功。しかし、wsl -l -v で確認すると、WSL のバージョンが 2 ではなく 1 になってしまっていました。謎。

よくわからないので、いったん Docker Desktop for Windows をアンインストール。 WSL2 に入れた Ubuntu-20.04 もアンインストール(wsl --unregister Ubuntu-20.04)。

もう一度、Docker Desktop for Windows をインストール。しかし、症状は変わらず。

WSL2 にももう一度 Ubuntu-20.04 を入れようとしたら、開いたコンソールウインドウにエラーメッセージが出てインストールできず。エラーコード 0x8007000e との表示。ググってみると、これは WSL2 がメモリ不足だと言っているらしく、WSL2 の設定ファイル .wslconfig を作ってあげれば回避できるらしい。

Windows のユーザープロファイルのフォルダ(C:\Users\ユーザ名 あるいは %UserProfile%)に、以下のような内容のテキストファイル .wslconfig を置きました。(いちおう念のため改行コードは CR+LF にしておきました)

[wsl2]
memory=4GB
processors=16
swap=8GB

無事に Ubunto-20.04 のインストールができるようになりました。

しかし、Docker Desktop for Windows の不安定さは変わらず。

ひとまずあきらめて、Docker Desktop for Windows をアンインストール。

代わりに、最近リリースされたばかりの Rancher Desktop 1.0.0 を試してみることにしました。

公式サイトからインストーラーをダウンロードして、実行。問題なくインストールできました。 WSL2 にちゃんと入っているようです。

> wsl -l -v
  NAME                    STATE           VERSION
* Ubuntu-20.04_dev        Stopped         2
  rancher-desktop         Running         2
  rancher-desktop-data    Stopped         2
>

Windows のコマンドラインで docker コマンドが使えるようになりました。

デフォルトでは Kubernates のコンテナが動いているらしいのですが、使う予定もないですし、Rancher Desktop の公式 FAQ にしたがって停止させることにしました。

> kubectl config use-context rancher-desktop
> kubectl delete node lima-rancher-desktop

ここで、削除するノード名(?)が違っているらしく、delete がエラーに。 kubectl get nodes コマンドでノード名を確認して、再度実行。無事成功。

> kubectl get nodes
> kubectl delete node seaoak-pc
> kubectl get nodes

docker コマンドで hello-world コンテナをダウンロードして実行することもできました。OK。

最後に、Rancher Desktop を含めて WSL2 にインストールされているディストリビューションを、Cドライブから別のドライブに移動させます。 C ドライブはすでに容量不足ですし、Docker イメージとか大きなモノは別のドライブに入れるようにしたいのです。

Windows のコマンドラインで、一度 tar ファイルに export して、それを import すれば OK です。簡単!

> E:
> cd \
> mkdir WSL
> cd WSL
> mkdir images
> mkdir archives
> cd archives
> wsl --export rancher-desktop rancher-desktop_20220202a.tar
> wsl --export rancher-desktop-data rancher-desktop-data_20220202a.tar
> wsl --unregister rancher-desktop-data
> wsl --unregister rancher-desktop
> wsl -l -v
> wsl --import rancher-desktop E:\WSL\images\rancher-desktop .\rancher-desktop_20220202a.tar --version 2
> wsl -l -v
> wsl --import rancher-desktop-data E:\WSL\images\rancher-desktop-data .\rancher-desktop-data_20220202a.tar --version 2
> wsl -l -v

なお、import した tar ファイルは、削除してしまって問題ありません。

これで、今後、Docker イメージをたくさん作っても安心です。

以上、Windows 10 上での WSL2 と Docker のセットアップでした。

Previous: PNG に代わるロスレス圧縮の画像フォーマットをさがす

Home

Next: Rust の HTML テンプレートエンジンを選ぶ