脱・Docker Desktop -WSL2 編-
Windows で Docker を使うとなると WSL2 + Docker Desktop の構成が主流でしたが、正直 GUI の機能、個人的には不要です。
また、私は生の Linux も使っている手前、できれば同じような管理方法にしたいものです。
そこで、Docker Desktop の使用をやめ、直接 WSL 上で Docker を動かそうと試みました。
良い子のみんなへ
本記事の内容に基づいて実施された作業の結果について、私は一切の責任を負いません。
自己責任でご実施ください。
また、本記事はあくまで技術的な可能性を示すもので、決して「Docker Desktop への課金を回避する抜け道」の解説ではありません。
支払うべきお金はきちんと支払うべきです。
環境
OS
- ホスト:Windows 11 Home Build 22581.1
- WSL:Ubuntu 20.04.1 LTS
Docker Desktop をアンインストールする
念の為コンテナは全て停止、破棄しておくと良さそうです。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
スタートメニューから Docker Desktop を探し、普通にアンインストールします。
成功しました。Close します。
WSL を再起動します。PowerShell を起動し、下記コマンドを実行します。
注意:複数のディストリビューションを入れていて、どれか1つだけ再起動したい場合、別のコマンドで行います。(参考:https://kagasu.hatenablog.com/entry/2020/01/02/155532)
> wsl --shutdown
Docker がアンインストールされたことを確認します。
$ which docker
docker not found
$ which docker-compose
docker-compose not found
このままだと CLI Plugin のディレクトリにシンボリックリンクが残っている可能性があります。
$ ls -l /usr/local/lib/docker/cli-plugins/
lrwxrwxrwx 1 root root 80 Mar 26 10:35 docker-buildx -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-buildx
lrwxrwxrwx 1 root root 81 Mar 26 10:35 docker-compose -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-compose
lrwxrwxrwx 1 root root 78 Mar 26 10:35 docker-scan -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-scan
後で邪魔になるので、削除しておきます。
$ sudo rm /usr/local/lib/docker/cli-plugins/*
Distrod で Systemd を有効化する
パッケージリストをアップデートします。
$ sudo apt update
Distrod のインストールスクリプトをダウンロードします。
このスクリプトは、インストール後、削除して構いません。
$ curl -L -O "https://raw.githubusercontent.com/nullpo-head/wsl-distrod/main/install.sh"
インストールスクリプトに実行権限を付与します。
$ chmod +x install.sh
Distrod をインストールします。
$ sudo ./install.sh install
(中略)
Installation is complete!
Distrod を有効化します。
$ sudo /opt/distrod/bin/distrod enable
[Distrod] Distrod has been enabled. Now your shell will start under systemd.
WSL からログアウトし、再起動後、再ログインします。
Systemd が PID 1 で動いていることを確認します。
$ ps -aux | head -n 2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 4.2 0.1 23040 12348 ? Ss 13:56 0:01 /sbin/init systemd.setenv=WSLENV=WT_SESSION::WT_PROFILE_ID systemd.setenv=WSL_DISTRO_NAME=Ubuntu systemd.setenv=WSL_INTEROP=/run/WSL/8_interop --unit=multi-user.target
Docker CE をインストールする
パッケージリストをアップデートします。
$ sudo apt update
必要なパッケージをインストールします。(全てインストール済みであれば不要です。)
$ sudo apt install apt-transport-https ca-certificates gnupg lsb-release
GPG キーを追加します
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Docker のパッケージリポジトリを追加します。
$ echo \
"deb [arch=amd64 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 update
Docker CE をインストールします。
$ sudo apt install docker-ce docker-ce-cli containerd.io
Docker がインストールされたことを確認します。
$ docker version
Client: Docker Engine - Community
Version: 20.10.14
(以下略)
Docker の起動設定
Systemd で Docker を起動させるようにします。
おなじみのコマンドたちなので詳細は省きます。
$ sudo systemctl enable docker
$ sudo systemctl start docker
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-03-26 14:04:06 JST; 2min 54s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
(以下略)
Docker Compose をインストールする
デフォルトで Docker Compose は入っていません。
$ docker-compose version
docker: 'compose' is not a docker command.
See 'docker --help'
$ docker compose version
zsh: command not found: docker-compose
入れましょう。
{バージョン}
を適当なバージョンに置き換えて実行してください。
$ sudo curl -L https://github.com/docker/compose/releases/download/{バージョン}/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
最新バージョンは GitHub の Releases から確認できます。
2022/3/26 現在の最新版である v2.3.4
をダウンロードします。
$ sudo curl -L https://github.com/docker/compose/releases/download/v2.3.4/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
実行権限を付与します。
$ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
インストールされたことを確認します。
$ docker compose version
Docker Compose version v2.3.4
Docker Compose のコマンド
Docker Compose は、バージョン2系から Docker の CLI プラグインという位置づけになりました。
これにより、docker compose というハイフン無しのサブコマンドとして呼び出すようになっています。
従来どおり docker-compose
コマンドを使いたい場合、~/.zshrc
とかで alias を当てておくのが無難に思います。
おわりに
Systemd の有効化が結構面倒くさいのかなぁと思っていたのですが、Distrod は非常にお手軽で助かりました。
今回一番の収穫かもしれません。
書き忘れたこと
ある?
参考
- 2022-02-13 Sun: Docker Desktop 依存をやめる for Windows (WSL2) - hokupod's scraps
- DockerDesktopからWSL2上のみで動くDockerに移行する
- docker/compose: Define and run multi-container applications with Docker
- nullpo-head/wsl-distrod: Distrod is a meta-distro for WSL 2 which installs Ubuntu, Arch, Debian, Gentoo, etc. with systemd in a minute for you. Distrod also has built-in auto-start feature on Windows startup and port forwarding ability.
- Distrodを使ってWSL2でsystemdを動かす
Discussion