Docker for Windows on WSL2 (2025年皐月)  DockerDesktop,RancherDesktopを使わないシンプル構成

# 初めに

いつも見ていただきありがとうございます。ライセンスやマシンリソースの関係で、シンプルにDockerを導入します。以下のものは使用しません。
- Docker Desktop
- Rancher Desktop

# インストール
０）過去の残骸を除去
１）WSLのbash内にdockerを導入
２）scoopでdocker CLI を導入
３）CLIからbash(Ubuntu)内のDockerプロセスへの通信経路を定義

## ０）過去の残骸を除去
以前導入した、「Docker Desktop」や「Rancher Desktop」がある場合は、それをきれいに削除しておく。

### WSLに残っている不要なDistoを削除

```powershell
wsl.exe -l -v

  NAME                    STATE           VERSION
* Ubuntu                  Running         2
  rancher-desktop         Stopped         2
  rancher-desktop-data    Stopped         2
```

上記では、rancher-desktopに関連した２つのDistroが残っているので、以下のようにして削除する。

```powershell
wsl --unregister rancher-desktop

登録解除。
この操作を正しく終了しました。
```

```powershell
wsl --unregister rancher-desktop-data

登録解除。
この操作を正しく終了しました。
```

### WSLのbash環境(デフォルトではUbuntu)に入って以下を実施する。

```bash
# 古いDockerが入っているかもしれないのでアンインストール
sudo apt-get purge docker docker-engine docker.io containerd runc
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

# 過去の残骸を除去
rm -rf ~/.docker
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
```

## １）WSLのbash内にdockerを導入

```bash
# 以下のスクリプトで、Dockerに必要なパッケージとリポジトリが追加され、インストールされる
# Install Docker, you can ignore the warning from Docker about using WSL
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh # --dry-run
rm get-docker.sh

# OSの設定次第では以下のコマンドで正規リポジトリからのインストールも可能
# sudo -s
# apt-get update -qq >/dev/null
# DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-ce-rootless-extras docker-buildx-plugin >/dev/null

# Dockerグループに参加
# Add your user to the Docker group
sudo usermod -aG docker $USER

# Sanity check that both tools were installed successfully
docker --version
docker compose version
service docker status

# OSのバージョンによっては以下のコマンドを追加で実施(iptablesコマンドの設定)
# Using Ubuntu 22.04 or Debian 10+? You need to do 1 extra step for iptables
# compatibility, you'll want to choose option (1) to use iptables-legacy from
# the prompt that'll come up when running the command below.
#
# You'll likely need to reboot Windows or at least restart WSL after applying
# this, otherwise networking inside of your containers won't work.
[[ $(echo $(lsb_release -rs) | awk '{print ($1 >= 22.04)}') -eq 0 ]] && sudo update-alternatives --config iptables
```

### 自動起動設定
バージョン0.67.6以降のWSLを使っている場合、systemdを使って「Dockerサービス」の自動起動を指定できる。この指定があると、ssh-serverなど他のサービスも自動起動させることができる。

```bash
vi /etc/wsl.conf

# 以下の設定を追加
[boot]
systemd=true
```

WSLを再起動する。
```powershell
# WSL終了
wsl.exe --shutdown

# WSL再開
bash
```

bash内で動作確認
```bash
systemctl status docker

# 以下は出力例
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2025-05-29 19:35:45 JST; 48min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 464 (dockerd)
      Tasks: 36
     Memory: 108.0M
        CPU: 2.586s
     CGroup: /system.slice/docker.service
             ├─464 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
             ├─973 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 13306 -container-ip 172.26.0.2 -contain>
             └─980 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 13306 -container-ip 172.26.0.2 -container-po>
```

## ２）scoopでdocker CLI を導入
VSCodeからDockerを使うときに、CLIがあること前提となるため、docker CLIのみをWindows側にインストールする。

### scoopの古いキャッシュやバージョンを削除
```powershell
scoop cache rm *
scoop cleanup *
```

### インストール
```powershll
scoop install docker
```

## ３）CLIからbash(Ubuntu)内のDockerプロセスへの通信経路を定義

### bash(Ubuntu)へ公開鍵でパスワード無しでSSHできるようにする

#### bash(Ubuntu)側でSSHサーバを起動

```bash
# install
sudo apt-get install ssh
# sshd_configを変更し、PubkeyAuthentication を有効化
sudo vi /etc/ssh/sshd_config

# 以下の定義を見つけて「yes」にする
PubkeyAuthentication yes
```
#### キーを作成して設置

以下の、{{windosのユーザ名}} はWindowsでのユーザディレクトリの途中に出てくる名称で通常はユーザ名と同一。 cmd.exeにて、``` echo %USERPROFILE% ``` を入力した時に表示されるものを指定する。なお、powershell の場合は、 ``` echo $env:USERPROFILE ```

```bash
# create & set ssh-keys
cd $HOME/.ssh/
# wsl2_ubuntuでキー作成、パスフレーズは空
ssh-keygen -t ed25519 -f wsl2_ubuntu -C ""
# 公開鍵を名称変更してコピー、秘密鍵をWindows側にコピー
cp -p wsl2_ubuntu.pub authorized_keys
# 以下のWindowsユーザディレクトリが存在していない場合は、mkdir しておくこと
cp ./wsl2_ubuntu /mnt/c/Users/{{windosのユーザ名}}/.ssh/
# パーミッションを変更(鍵による接続のためには必須)
chmod 0700 .
chmod 0700 ./authorized_keys
```

### Windows側で公開鍵によるSSH接続の設定をする

以下の {{WSLでのユーザ}} は、bashに入った時のユーザ名で、``` echo $USER ``` や ``` id -un ``` で表示されるもの。

```powershell
# Windows pwsh にて
cd $env:Userprofile\.ssh
notepad config
# 以下の内容を追加
## Docker
Host wsl
    HostName localhost
    IdentityFile ~/.ssh/wsl2_ubuntu
    User {{WSLでのユーザ}}
    TCPKeepAlive yes
```

### Dockerの接続先をSSH経由に指定する

#### Windowsから、ssh wsl にて公開鍵認証ログインできることを確認
```powershell
# 「wsl」は、上記 config で定義した「Host」名
ssh wsl
```

#### Windows側から使う場合のDocker接続設定をする
```powershell
docker context list
docker context create wsl --docker "host=ssh://wsl"
# wsl
# Successfully created context "wsl"
docker context use wsl
# wsl
# Current context is now "wsl"
```

#### Windows側からの動作確認
```powershell
# Docker動作確認
docker info
docker ps -a
```

これで、WindowsのCLIからdockerが使用可能となった。


## CLIで確認

### コンテナプロセス
```powershell
# 起動中コンテナのみ
docker ps
# 停止も含めてすべて
docker ps --all
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/eff7e319-7275-c26c-29e7-2699e9c16885.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/72f580f4-05c7-7e17-c430-533567897307.png)

### イメージ
```powershell
docker images
```
チュートリアルでTAGをつけたため、「docker101tutorial」は２つのエントリを持つが、ImageIDは同一。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/25fdbd1a-7d6e-986e-e423-27c09a51544c.png)

### 不要になったコンテナの削除
停止ー＞削除する。見えていないNetwork関連のリソースまで含めて削除するには、以下のようにする。

### プロセス削除
```powershell
# ContainerIDを取得
docker ps -a
# 上記のIDを利用して停止、削除
docker rm -f {{上記出力のcontainer-id-1}} {{上記出力のcontainer-id-2}}
# または、名前でもよい
docker rm -f docker101tutorial repo
# 確認
docker ps -a
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/6def27b1-09a9-5139-885b-3abd2d235d33.png)

### コンテナイメージ削除
```powershell
# ImageIDを取得
docker images
# IDを指定して削除
docker rmi {{上記出力のimage-id-1}} {{上記出力のimage-id-2}}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/cc4fb70d-b590-0367-01ea-cefa085f511c.png)
あ！！、２つエントリを持つので強制しないとだめだ。

```powershell
# ImageIDを取得
docker images
# 強制して、IDを指定して削除
docker rmi {{上記出力のimage-id-1}} {{上記出力のimage-id-2}} -f
```
１つは削除済みだったので、エラーがでたけど無視。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/b0729006-d656-6725-4b2d-c55e99056d5a.png)
### その他のリソース
```powershell
docker system prume
```
消しまくるので、十分に注意して実施する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/6e59b82d-3814-f14f-4b88-b34f12c54b5c.png)

## Windowsのタスクトレイには何も表示されない
Dockerは、WSL2のUbuntuの中で動いているので、Windowsのタスクトレイには表示されない。

シンプルに Docker を動かせた！

親記事：[WSL2とVSCで作るWindowsでのDocker内開発環境(2021年睦月)](https://qiita.com/CinTAKE/items/ee348acec54195ef5bd1)

参考記事：
- docker in WSL2
    - https://nickjanetakis.com/blog/install-docker-in-wsl-2-without-docker-desktop
    - https://zenn.dev/ijiwarunahello/articles/d36f6f37a608d2
- systemd
    - https://learn.microsoft.com/en-us/windows/wsl/wsl-config#systemd-support
- Docker VSCode ssh接続
    - https://qiita.com/karuakun/items/a888891b3044c3cdcf63
    - https://qiita.com/yuta-katayama-23/items/fad6928f37badf3391f2