🤖

WSL2でSystemDを動かしてUbuntuでDesktopなしDocker開発環境準備

2022/09/26に公開

みんな大好きDocker Desktop

関連記事:

前回この記事を書いた
WSLが公式にSystemDをサポートするらしい

面白いニュースだったので、
あまりやらない速報記事を書いたのだが、

(・ω・) ・・・やってみるか

と思い立ったので、
まだリリースされてないWSL最新版を使って実際に動かしてみる。
Insider Programならdevアップデートで使えるはず。
題材にはみんな大好きDocker Desktopを使わないWSL Dockerを使う。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

windowsとwslをアップデート

build 25206 にしておいた。

powershell
wsl --version
 WSL バージョン: 0.67.6.0
 カーネル バージョン: 5.15.62.1

おk

Ubuntuのインストール

Sytemdにすでに対応しているUbuntu-22.04ではなく、
Ubuntu-20.04を別途用意。

powershell
wsl --install Ubuntu-20.04
 Ubuntu 20.04 LTS は既にインストールされています。
 Ubuntu 20.04 LTS を開始しています...

Ubuntuのコンソールでユーザーパスワードを作成および最新状態にしておく。

sudo apt update && sudo apt upgrade -y

SystemD確認

設定前状態確認

bash
ps axuw
 USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 root         1  0.0  0.0   2412  1668 ?        Sl   21:19   0:00 /init
 root        47  0.0  0.0   2428   108 ?        Ss   21:19   0:00 /init

PID1に /init が鎮座している

wsl.confの設定

wslの設定ファイルを追加
windows側ではなくゲストOS側に設定するようだ。

/etc/wsl.conf
[boot]
systemd=true

windowsに戻ってwslを再起動、
再度wslを起動

powershell
wsl --shutdown
wsl -d Ubuntu-20.04

設定後状態確認

さて、どんな感じかな。

ps -ef
 UID          PID    PPID  C STIME TTY          TIME CMD
 root           1       0  0 21:31 ?        00:00:00 /lib/systemd/systemd --unit=graphical.target
 root           2       1  0 21:31 ?        00:00:00 /init
 root          51       1  0 21:31 ?        00:00:00 /lib/systemd/systemd-journald

(・o・) いっぱい起動してた

PID1にはsystemdが居座っている。

Docker Engineのインストール

ここからは通常のdockerインストール。
手順に従って普通に入れてみる
Linux版のDocker Desktopを入れるのではなく、
Docker Engineを入れるので間違えないように

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

dockerリポジトリの登録

まずはdocerリポジトリを登録。
インストール済みのものはついでに削除

bash
sudo apt-get remove docker docker.io containerd runc
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Docker Engineのインストール

dockerリポジトリを登録できたので、
そこからdockerをインストール

bash
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin net-tools

aptで入れてるので特にsystemctlコマンドを使う必要は無いはず。
試しにservice状態を確認すると

bash
sudo service --status-all
 [ - ]  apparmor
 ・・・
 [ + ]  dbus
 [ + ]  docker

ちゃんと登録されてる。

起動確認

これで最新版がインストールできたはず。
では起動してみる

sudo service docker start
sudo docker run hello-world
 ・・・
 Hello from Docker!
sudo docker images
 REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
 hello-world   latest    feb5d9fea6a5   12 months ago   13.3kB 

rootfullモードで動作確認完了

sudo usermod -aG docker $USER
sudo service docker restart
docker images
 REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
 hello-world   latest    feb5d9fea6a5   12 months ago   13.3kB

rootlessモードで動作確認完了

再々起動で動作確認

ではwsl再起動して状態を確認する

bash
exit
wsl --shutdown
wsl -d Ubuntu-20.04
docker images
 REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
 hello-world   latest    feb5d9fea6a5   12 months ago   13.3kB

(・∀・)動いてる!

これでwsl起動すればdockerバックエンドが起動した状態になってる。

------------------- ↓ 後書きはここから ↓-------------------

sysetmdが起動するのは時間が掛かるので、
常時使用するOSがあればWindows起動時にブートしておく方が良いかもしれない。
(手順は知らないけど)

既存のOSには使えるのか?

結論を言えばちゃんと動く。
distrodでは動かなかったArchでもwsl.confを弄るだけで動くのは楽で良い。

参考:
Post-installation steps for Linux

Discussion