Docker for Windows から WSLのDockerへの移行方法(たまたま上手くいっただけの無保証な内容)

2025年1月18日

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
デフォルトを Ubuntu にする:
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で固めて展開する

これは、以下を参考にして下さい。

Dockerコンテナのイメージをセーブして先方に送る方法

$ 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 の設定が次のように変わる可能性があります。

  1. Docker デーモンが変わる
    • もともと wsl -d Ubuntu などで WSL 2 内の dockerd を起動していた場合、Docker for Windows を起動すると Docker Desktop が管理するデーモンに切り替わる
    • これにより、ローカルの Docker デーモンが停止 する可能性がある。
  2. デフォルトのデータストアが変更
    • Docker for Windows を起動すると、デフォルトの docker データストアの場所が C:\ProgramData\DockerDesktop\ に変更されることがある。
    • それまで ~/.docker/var/lib/docker に保存されていたイメージやコンテナが正しく認識されなくなる場合がある。

3. ネットワークやストレージの影響

Docker Desktop は Windows 側のネットワーク設定やストレージマウントを変更するため、WSL 側の Docker コンテナに影響を与えることがあります。

  • ネットワークの影響
    • docker0 ブリッジの再設定や、NAT の適用によって WSL 内の Docker コンテナの通信方法が変わることがある。
    • WSL の IP アドレスが変化し、WSL 側で設定していたネットワーク設定が無効になる可能性がある。
  • ボリュームマウントの影響
    • WSL で /mnt/c のようにマウントしていたボリュームが、Docker Desktop の管理下で //wsl$/Ubuntu 経由でマウントされることがある。
    • これにより、Docker 内で期待していたファイルパスが変わる可能性がある。

4. WSL 2 のデフォルト設定が変更される

Docker for Windows の SettingsResourcesWSL Integration「Enable integration with my default WSL distro」 を有効にすると、
Docker のデフォルトデーモンが WSL 2 の docker-desktop ディストリビューションを経由 するように変更されます。

これにより、Docker Desktop を起動すると、docker images の一覧が変わることがあります。


5. 解決策

もし WSL 内の Docker 環境を変えたくない 場合は、次の方法を試してください。

  1. Docker Desktop を無効化
    • wsl --set-version Ubuntu 1 にして、WSL 2 ではなく WSL 1 を使う(WSL 1 では Docker Desktop 連携がない)。
    • Docker Desktop の WSL Integration 設定を無効化する。
  2. WSL 内で独立した Docker 環境を使う
    • Docker Desktop を使わず、WSL 内で dockerd を手動で起動し、独立した環境を維持する。
    • sudo service docker start で WSL 内で Docker デーモンを起動。
  3. Docker の context を使い分ける
    • docker context コマンドを使用し、Docker Desktop のデーモンと WSL 内のデーモンを使い分ける。
    docker context create wsl-docker --docker "host=unix:///var/run/docker.sock"
    docker context use wsl-docker

結論

Docker for Windows を起動すると、WSL で動作している Docker の デーモン・ネットワーク・ストレージ設定 などが変更され、docker images の結果が変わる可能性がある
WSL 内で独立した Docker 環境を維持したい場合は、Docker Desktop の WSL 統合を無効化するか、docker context を適切に設定すると良い。

ただ、これだと、Docker for Windowsをアンインストールできないんだよなぁ。

さらに検討.....

docker-compose down して、docker-compose up -d して作り直すのが早かったりします。

2025年1月18日2025,江端さんの技術メモ

Posted by ebata