Windows 11 に WSL2 をインストールし、Ubuntu をデフォルトOSに設定し、Docker をインストールする手順を説明します。
1. 背景
Docker for Windowsが、有償化されて、困ったことになっています。
で、これを回避する方法として、「WSLのLinuxを利用して、Dockerを利用する方法」がある、という話を聞き『あ。なるほど』と思い、さっそく環境構築をノートPCでやってみました。
2. WSL2 のインストール
2.1. WSL の有効化効化
管理者権限で PowerShell または コマンドプロンプトを開き、以下のコマンドを実行します。
wsl --install
これにより、WSL2 とともに Ubuntu が自動でインストールされます。
WSL のバージョンを確認するには
wsl --list --verbose
もし、既に WSL1 になっている場合、以下のコマンドで WSL2 に変更できます:
wsl --set-version Ubuntu 2
3. Ubuntu をデフォルトOSに設定設定
インストールされている WSL のディストリビューションを確認:
wsl --list --verbose
wsl --set-default Ubuntu
4. Docker のインストールール
WSL2 上の Ubuntu に Docker をインストールします。
4.1. パッケージの更新更新
sudo apt update && sudo apt upgrade -y
4.2. Docker のインストールール
sudo apt install -y docker.io
4.3. Docker のサービスを開始開始
sudo systemctl enable --now docker
4.4. Docker グループへのユーザー追加追加
sudo usermod -aG docker $USER
適用するには、一度ログアウトするか、以下を実行:
newgrp docker
4.5. Docker の動作確認確認
docker run hello-world
「Hello from Docker!」と表示されれば成功です。
5. Docker Compose のインストール
sudo apt install -y docker-compose
6. Docker デーモンを WSL2 内で実行実行
通常、Windows 上で Docker Desktop を使う方法もありますが、WSL2 内で直接 Docker を動かしたい場合は systemd
を有効にします。
6.1. WSL2 で systemd を有効化を有効化
sudo nano /etc/wsl.conf
以下の内容を追加:
[boot] systemd=true
保存して WSL を再起動:
wsl --shutdown
再度 WSL を起動して systemctl
が使えることを確認:
systemctl list-units --type=service
6.2. Docker の自動起動起動
sudo systemctl enable --now docker
これで、WSL2 + Ubuntu + Docker の環境構築が完了しました。
7. Docker for Windowsのコンテナイメージをtarで固めて展開する
これは、以下を参考にして下さい。
$ sudo docker load < 20240828_shajyo.tar
のあたりから続けます。
これをwslで実行すると、docker imageができます。
8. ちょっと変なことが起っている話
ところで、この段階で、ちょっと不思議なことが起こりました。
docker for windowsを起動すると、WSL内のdocker imageの名称が変わります(理由不明で、変なのですが、動くなら、まあ構いません)。
で、それだけでなく、docker imagesで、Docker for windowsのイメージが全部登場してきます。
なんだか良く分かりませんが、これが出てくるのであれば、「Docker for Windowsのコンテナイメージをtarで固めて展開する」をサボれるかもしれません(誰か確認したら教えて下さい)。
で、あとは、Docker for Windowsで作成した時と、同じディレクトリに移動して、
docker-compose restart
をすると、無事に動き出しました。
9. 総括
なんだか良く分かりませんが、Docker for Windowsを使っている環境であれば、それを残した状態で、この作業すると、随分手を抜けるかもしれません。
移行した後に、Docker for Windowsをアンインストールすれば良いでしょう。
お試しあれ。
言うまでもありませんが、無保証です。
「ちょっと変なことが起っている話」の理由
Docker for Windows を起動すると、WSL 内で動作している Docker イメージの内容が変化する可能性があります。以下の理由が考えられます。
1. Docker for Windows は WSL 2 をデフォルトで使用
Docker for Windows(Docker Desktop)は、デフォルトで WSL 2 ベースのエンジン を使用します。
これにより、WSL 2 で管理されている Docker のデーモン(dockerd
)が Docker Desktop の管理下に入る ため、起動時に設定や状態が変更されることがあります。
2. Docker デーモンの変更
Docker for Windows を起動すると、WSL 内の Docker の設定が次のように変わる可能性があります。
- Docker デーモンが変わる
- もともと
wsl -d Ubuntu
などで WSL 2 内のdockerd
を起動していた場合、Docker for Windows を起動すると Docker Desktop が管理するデーモンに切り替わる。 - これにより、ローカルの Docker デーモンが停止 する可能性がある。
- もともと
- デフォルトのデータストアが変更
- Docker for Windows を起動すると、デフォルトの
docker
データストアの場所がC:\ProgramData\DockerDesktop\
に変更されることがある。 - それまで
~/.docker/
やvar/lib/docker
に保存されていたイメージやコンテナが正しく認識されなくなる場合がある。
- Docker for Windows を起動すると、デフォルトの
3. ネットワークやストレージの影響
Docker Desktop は Windows 側のネットワーク設定やストレージマウントを変更するため、WSL 側の Docker コンテナに影響を与えることがあります。
- ネットワークの影響
docker0
ブリッジの再設定や、NAT の適用によって WSL 内の Docker コンテナの通信方法が変わることがある。- WSL の IP アドレスが変化し、WSL 側で設定していたネットワーク設定が無効になる可能性がある。
- ボリュームマウントの影響
- WSL で
/mnt/c
のようにマウントしていたボリュームが、Docker Desktop の管理下で//wsl$/Ubuntu
経由でマウントされることがある。 - これにより、Docker 内で期待していたファイルパスが変わる可能性がある。
- WSL で
4. WSL 2 のデフォルト設定が変更される
Docker for Windows の Settings
→ Resources
→ WSL Integration
で 「Enable integration with my default WSL distro」 を有効にすると、
Docker のデフォルトデーモンが WSL 2 の docker-desktop
ディストリビューションを経由 するように変更されます。
これにより、Docker Desktop を起動すると、docker images
の一覧が変わることがあります。
5. 解決策
もし WSL 内の Docker 環境を変えたくない 場合は、次の方法を試してください。
- Docker Desktop を無効化
wsl --set-version Ubuntu 1
にして、WSL 2 ではなく WSL 1 を使う(WSL 1 では Docker Desktop 連携がない)。- Docker Desktop の
WSL Integration
設定を無効化する。
- WSL 内で独立した Docker 環境を使う
- Docker Desktop を使わず、WSL 内で
dockerd
を手動で起動し、独立した環境を維持する。 sudo service docker start
で WSL 内で Docker デーモンを起動。
- Docker Desktop を使わず、WSL 内で
- Docker の
context
を使い分けるdocker context
コマンドを使用し、Docker Desktop のデーモンと WSL 内のデーモンを使い分ける。
結論
Docker for Windows を起動すると、WSL で動作している Docker の デーモン・ネットワーク・ストレージ設定 などが変更され、docker images
の結果が変わる可能性がある。
WSL 内で独立した Docker 環境を維持したい場合は、Docker Desktop の WSL 統合を無効化するか、docker context
を適切に設定すると良い。
ただ、これだと、Docker for Windowsをアンインストールできないんだよなぁ。
さらに検討.....
docker-compose down して、docker-compose up -d して作り直すのが早かったりします。