🐳

脱・Docker Desktop -WSL2 編-

2022/03/26に公開約6,100字

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 から確認できます。

https://github.com/docker/compose/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 は非常にお手軽で助かりました。
今回一番の収穫かもしれません。

書き忘れたこと

ある?

参考

Discussion

ログインするとコメントできます