WSL2 on Dockerをやってみたくなった。


前提とゴール

前提

  • WSL2導入済み
  • 考えるのが面倒なのでデフォルトWSLがUbuntu20系であること

ゴール

  • Windows起動とともにDockerデーモンの起動は求めない
  • 面倒なのでsudoしないでdockerの操作をしたい
  • WSLでシェルに入ったらせめて自動起動させたい
  • Windows側からDockerのクライアントを使って操作しようとか考えない(Volume問題あるので)
  • VSCodeでいい感じに使えるようにする

大まかな流れ

  1. UbuntuにDistrodを導入
  2. 公式どおりにDockerをインストール
  3. 公式どおりにDockerComposeをインストール

やってみよう

Distrodのインストール

DistrodはSystemdが動かない、WSLのためのツールでWSL上でSystemdが動作するようになります。
ただし、Windowsと連携はしないのでWSL起動すると動作をはじめる形のようです。

実際にはWindowsの設定を変更することでWindowsと同時に起動するようにできるようですが、そちらの設定は行いません。

インストールはWSL上で行い、公式通りに行うと下記の通りです。
一点だけcd ~をして自身のホームディレクトリで実行するようにしています
また最後の行でDistrodを有効にします

cd ~
curl -L -O "https://raw.githubusercontent.com/nullpo-head/wsl-distrod/main/install.sh"
chmod +x install.sh
sudo ./install.sh install
sudo /opt/distrod/bin/distrod enable

一旦WSLから抜けて、Powershell上でWSLを一旦停止します。
(次回起動後から有効になります)

wsl -t "Ubuntu-20.04"

wsl -l -v を実行すると停止しているのがわかります。

Docker Engineのインストール

公式の手順をずらずら~と並べるとこんな感じです。

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg    

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

ここまでくればインストール完了していますので sudo docker run hello-world を行い動作確認をします

Docker系のコマンドでsudoつけなくて済むようにします

ただしセキュリティ的にはあんまりよろしくないってどこかで見た記憶がありますので、各々の責任でよろしくお願いいたします。

sudo gpasswd -a $USER docker

一旦WSLから抜けて、入りなおせばdockerコマンドはsudoなしで動作するようになります

Docker Compose (V2)のインストール

なんか時代はV2らしいのでそちらをインストールします。

DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}

mkdir -p $DOCKER_CONFIG/cli-plugins

curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose

chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

あとは docker compose versionとかやって動作すればOKです。

VSCodeでいい感じに使えるようにする

WindowsでDockerコマンドは使えませんが、VSCodeのRemoteContainer機能の設定でWSL側のdockerを使うという素晴らしい機能があります。

下記の画像のあたりです。この辺を編集してみるといいかもしれません。

あ、ポートフォワードの話

Windowsの自分のホームディレクトリに .wslconfig というファイル名で下記のような内容でファイルを作成するとよいかもしれません。
Dockerとかでポートを開いたとき、localhostでアクセスできるようになります

[wsl2]
localhostForwarding=true

最後に

DockerDesktopなくても何とかなるもんですねぇというか、VSCodeのRemoteContainer機能には脱帽です。まさか直接WSLのDockerを操作してくれるとは思いませんでした。
これでWindowsにDockerコマンドがなくてすみました。

参考にしたサイトなど

色々検索して色々お世話になりました。抜けもありますけどこの辺参照しております。

https://zenn.dev/23prime/articles/c78c42351a7439

https://yukituna.com/2284/

https://github.com/nullpo-head/wsl-distrod

https://docs.docker.com/engine/install/ubuntu/

https://docs.docker.com/compose/cli-command/#install-on-linux

どうでもいいこと

WSL2のインストールでWSL2対応のカーネルをダウンロードしてインストールするように書いてあるBLOGとかよく当たったのですが、今は

wsl --update

で更新できませんかね?
あと

カーネルの自動更新を受け取るには、 Windows Update の設定を有効にしてください:' Windowsの更新に、その他のMicrosoftの製品 の更新情報を受け取る'。

て表示されてたので自動更新にもできそうです。