はじめに
普段はMacを使って開発していますが、業務でWindows 11を使用する機会がありました。その際、Windows環境でDockerを使えるようにするまでに、想像以上にWSL周りで苦戦してしまいました。その経緯を失敗談として、この記事で共有したいと思います。
結論
WindowsでDockerを使いたい場合、まずは公式のDocker Desktopをインストールするのが正解です。
インストーラーが自動でWSL2をセットアップしてくれるので、基本的には初心者が自分で wsl --install や wsl --set-default-version 2 から実行する必要はありません。
私はそれを知らずにWSL周りをいじり倒して数時間溶かし、最終的にはOSを再インストールする羽目になりました…。
ハマってから解決に至るまで
WSLをとりあえずインストール
WindowsでDockerを動かすにはWSL2が必要ということはなんとなく知っていました。
なので、WindowsでDockerを使うまでの手順を十分に確認しないまま、以下のようにしてWSLを入れました。
wsl --install
続いて、こちらも実行しました。
wsl --set-default-version 2
このコマンドは「WSLの既定バージョンを2に設定する」という意味です。WindowsではWSL1とWSL2があり、WSL2はより本物のLinuxに近い仕組みです。
Docker Desktopが動作するのはWSL2なので、上記を実行しておきました。
Windows11では wsl --install で最初からWSL2が既定になるので省略可能みたいです。
これで、wslコマンドが使えるようになり「よし、準備できた!」と思いました。
wslコマンドが謎の状態に
ところが、この後に
wsl -v
wsl --update
などのWSLコマンドを実行すると、「アップグレードを終了しています…」 という表示が出るだけで処理が進まなくなりました。
困ったときの定番として紹介されていた、
wsl --shutdown
も効果なし。Windows Updateを実行しても改善せず。
エラーメッセージで検索しても同じ事象に関する情報はほとんどなく、それっぽい対処法を片っ端から試しましたが、結局どれもダメでした。
最終手段: OSの再インストール
状況を打開できず数時間が経過。この時点でPCには大したデータが入っていなかったので、思い切ってWindows 11自体を再インストールすることにしました。最終手段です...。
結局、Docker Desktopが正解だった
OS再インストール後、公式サイトからDocker Desktopをダウンロードしました。そして、インストーラーの指示に従って進めていくと、WSL2を使用するかどうかの設定項目がありました。どうやら、この設定項目にチェックを入れておくと自動的にWSL2をセットアップしてくれるようです。インストール終了後、あっさりDockerが動くようになりました。
学んだこと
今回の経験で分かったのは次のことです。
- WindowsでDockerを使いたいなら、まずは Docker Desktopを公式サイトからインストールするのが一番早い
- 自分で
wsl --installやwsl --set-default-version 2を実行してもよいが、初心者がやると予期しない事態にハマる可能性がある - 何かを新たにインストールする際は、公式ドキュメントなど信頼できる情報を参照して作業を進める
Dockerを使うまでのおすすめ手順(初心者向け)
もしこれからWindowsでDockerを使いたいなら、以下の流れで進めるのがおすすめです。
- Docker Desktop公式サイトからインストーラーをダウンロード
- インストーラーを実行する(WSL2が自動で導入される)
- インストール完了後、
docker --versionで動作確認 - (必要に応じて)WLSのデフォルトディストリビューションをUbuntuなどに変更する
これだけでDockerの開発環境が整うかと思います。
Windows 11にDocker Desktopを入れる手順(令和5年最新版)の記事が非常にわかりやすいので、Windows 11でDockerの開発環境を構築する際は参考にしてみてください。
【おまけ】初心者あるある: Windowsディレクトリにプロジェクトファイルを置いてしまう問題
WSL2 × Docker Desktop を使い始めた初心者がよくハマるのが、プロジェクトの置き場所です。
Windowsディレクトリに置いた場合
例えば C:\Users\<ユーザー名>\myapp のように Windowsのディレクトリ配下 にプロジェクトを置いて、そのままアプリケーションを起動すると…
- 動作が異常に重い
- ビルドや依存パッケージのインストールに時間がかかる
といった現象が起こります。
なぜ重いのか?
- WindowsのNTFSとLinux のファイルシステムは仕組みが異なる
- Windows側のファイルをWSL2からアクセスすると、ファイルI/Oごとに変換処理が入る
- そのため、大量のファイル操作(例:
npm installやbundle install)で極端に遅くなる
解決策: Linuxファイルシステムに置く
プロジェクトは WSL2のLinuxファイルシステム配下 に置くのがベストです。
Ubuntu をインストールした場合の例:
\\wsl$\Ubuntu\home\<ユーザー名>\projects
ここに置けば Linux ネイティブのファイルシステムで動作するため、ビルドや実行が圧倒的に速くなります。