Win11にDocker Desktopなしでコンテナ環境をつくる

Docker Desktopを使わずにdockerをWindows11で使いたいな～と思い実験したことのメモ。
たまにしか使わないと、毎回アップグレードをきかれて面倒なので。

## 環境

- エディション: Windows 11 Pro
- バージョン: 22H2 (ビルド: 22621.1555)
- プロセッサ: AMD Ryzen
- メモリ: 16GB

## 前提

仮想化がONになっていることを確認します。もともとONだったのでやること特になし。
タスクマネージャーのパフォーマンスのCPUで見れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642815/5b4d0c48-4021-54f5-fc67-6e0cd133ac83.png)

## Dドライブにインストール

とりあえず、VMとデフォルトのUbuntuを入れます。

```cmd
wsl --install
```

再起動したら有効になるよ、とのことなので再起動。
再起動後、コマンドプロンプトが勝手に起動してUbuntuが起動。
22.04.2 LTSでした。
そのコマンドプロンプト窓(=Ubuntuのターミナル)で、作成するユーザーとパスワードを要求されたので作成。
`exit`で抜けてちょっと待つとシャットダウンされるみたいでした。(`wsl -l -v`で確認)

この時点でUbuntuが使えますが、Cドライブにインストールされています。
メインのストレージがDドライブなので、Dドライブに移行。
( 参考: https://programwiz.org/2021/06/26/how-to-move-wsl2-d-drive-from-c/ )

```cmd
cd /D D:\
mkdir WSL
cd WSL
wsl --export Ubuntu Ubuntu.tar
wsl --unregister Ubuntu
wsl --import Ubuntu Ubuntu Ubuntu.tar --version 2
```

移行するとログインユーザーがrootになるので、regeditでレジストを編集する。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss
の下に各ディストリビューションの設定がある。この手順通りならひとつだけあるのでそれを選択し、DefaultUidの値を10進数で1000に設定。

これで、WSLを起動するとUbuntuに初回起動で作成したユーザーで接続されます。
(`wsl`コマンドで起動できる)
起動後、接続ユーザーは作成したユーザーになるが初期ディレクトリがimportしたところ(WindowsのDドライブ)を見ていました。
ホームディレクトリは変わっていないので、`cd`だけ実行すれば戻れるため気にしない。

## WSLの設定

参考: https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config#wslconfig

WSLにメモリが持っていかれすぎるのを防ぐため、設定ファイルします。
%UserProfile%(通常、C:\Users\<UserName>)に、`.wslconfig`を作成。
ついでなのでスワップのサイズや場所も変えておきます。

```config:C:/Users/ユーザー名/.wslcofig
[wsl2]
memory=4GB
swap=4GB
swapfile=D:\\WSL\\tmp\\wsl-swap.vhdx
```

設定を読ませるため、もしWSLが起動しているならいったん落としておきます。(`wsl --shutdown`)

## VSCodeの準備

参考: https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode

VSCodeの拡張機能WSLを入れます。Microsoft公式。
ほかのリモート系のパック「Remote Development」から入れておくと楽。
入れると、VSCodeのいちばん左下にアイコンが増え、ココをクリックすることでRemote Developmentのメニューが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642815/436468fb-99c4-7933-dba0-f70e70e4e899.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642815/6b5e3498-94a2-ef91-7cd5-6f5f30c19773.png)

「WSL への接続」を押すと、`wsl`コマンドを実行したときと同じようにVM起動とUbuntu起動が行われ、VSCodeサーバーのインストールもされてVSCodeから操作できるようになります。
左メニューのファイルから目的のフォルダを選択して開いたり、ターミナルを開く(ショートカット: Ctrl+J)とUbuntuのコンソールになっていたりしています。

## dockerのインストールと確認

入っていないことを確認。

```bash
$ sudo docker --version
docker --versionCommand 'docker' not found, but can be installed with:
sudo snap install docker         # version 20.10.17, or
sudo apt  install docker.io      # version 20.10.21-0ubuntu1~22.04.2
sudo apt  install podman-docker  # version 3.4.4+ds1-1ubuntu1
See 'snap info docker' for additional versions.
```

2番目のコマンドの方が少し新しそうだが、試したところなんかおかしかったので1番目のコマンドを実行してインストール。
普通にデーモンも起動しているしなんならdocker-composeも入っていました。(公式の最新2.17.2より新しいのが気にはなったが)

```bash
# docker本体のバージョン確認
$ sudo docker version
Client: Version:           20.10.17
 API version:       1.41
 Go version:        go1.18.10
 Git commit:        100c70180f
 Built:             Tue Mar  7 06:29:35 2023
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.10
  Git commit:       a89b842
  Built:            Tue Mar  7 06:30:14 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.6.6
  GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
 runc:
  Version:          1.1.2
  GitCommit:        
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0$docker compose version
# docker-composeのバージョン確認
$ sudo docker compose version
Docker Compose version v2.5.0
# dockerイメージ(まだない)の表示でデーモン起動を確認
$ sudo docker image ls -a
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
```

ついでにメモリやスワップの設定が反映されていることも確認。

```bash
$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3919         737        2009           3        1171        2973
Swap:           4096           0        4096
```

dockerとdocker-composeがちゃんと動くことを確認するため、簡単なdocker-composeをたちあげてみる。

```bash
$ mkdir -p test/compose
$ cd test/compose
$ touch docker-compose.yml
```

```yaml:docker-compose.yml
version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80
```

```bash
$ docker compose up
```

Windows側のブラウザで、`http://localhost`にアクセスしてNginxのトップページが出ればOK。
Nginxの停止は、VSCodeで別ターミナルをあげて`cd test/compose && docker compose down`

これで準備完了。gitはもともと入っていたのでここから先はいろいろできるはず。

## zshを入れる

bashのまま作業を続けるのもつらいので、zshを入れておく。
VSCodeのターミナル前提。
参考: https://qiita.com/gilly/items/5ff7bd7142e963cdbb9b

```bash
# zshのインストール
sudo apt-get install zsh
# テーマの準備(フレームワークをクローン)
cd
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
# zsh切り替え(`q`の入力で設定ファイルをつくらずに抜ける)
zsh
# zsh設定ファイルの作成
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

ここで、zshをVSCodeのデフォルトにしておく。
ターミナル右上の左から2番目、「+」ボタン右の「v」から開いたメニューの「既定のプロファイルから選択」からzshを選択。
いったん、ターミナルを閉じておく。

```bash
exit # zsh抜ける
exit # bashの終了
```

preztoの設定ファイルを編集して、テーマを変更する。VSCodeでホームディレクトリにある`.zpreztorc`の、2023/05/08だと133行目にある以下の行を編集する。
個人的おすすめテーマはsteeef。いじらなくてもgitの情報が出る。

```diff:.zpreztorc
-  zstyle ':prezto:module:prompt' theme 'sorin'
+  zstyle ':prezto:module:prompt' theme 'steeef'
```

変更の保存後、`Ctrl+J`でターミナルを開くとzshがテーマつきで表示される。

## 参考まとめ
- https://programwiz.org/2021/06/26/how-to-move-wsl2-d-drive-from-c/
- https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config#wslconfig
- https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode
- https://qiita.com/gilly/items/5ff7bd7142e963cdbb9b