🐳

DockerDesktopからWSL2上のみで動くDockerに移行する

2021/09/06に公開

DockerDesktopの特定条件下における利用が有料化しますね。
そこで今回はDockerDesktopを使っている

  • GUIのコンテナ管理機能を必要としない方
  • DockerDesktopのインストールが楽だからとりあえず使っていた方
  • host.docker.internalでホストOSのIPを引ける機能は不要な方
    • 2021-10-15に追記しました。

向けにWindowsにおいてDockerDesktopから、WSL2上のみで動くDockerする方法を書いてみました。

前提条件

この記事の内容は以下の条件で検証されました。

  • OS
    • Windows 10
  • WSL2ディストリビューション
      - Ubuntu 20.04
  • DockerDesktop
      - インストール済み

1. 下準備

まずはすでに動いているDockerDesktopを止めましょう。

  1. Windows側でDocker Desktop開く
  2. Settings(歯車マーク)からStart Docker Desktop when you log inのチェックを外す。
  3. Docker Desktopをタスクバーからquit docker desktopを選択しシャットダウンする。

2. インストール

公式ドキュメントのインストールページを参考にUbuntuにDocker Engineをインストールします。

sudo apt update
# インストールに必要なものをインストール
sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    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のパッケージリポジトリをaptに追加
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

# dockerEngineのインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

# docker-composeのインストール
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# docker daemonの起動
sudo service docker start

3. docker daemonを自動起動するように設定する

WSL2ではsystemdがPID1で起動しないので
WSL2起動時にdocker daemonを起動させるのは難しいです。
一応systemdをwsl2で動かすこともできますがsystemdの動作が不安定なのでおすすめしません。
そのためここではwsl使用時に自動でdocker daemonを起動する方法を紹介します。

# service docker startだけパスワード無しでsudoできるようにする
sudo visudo

sudoersには以下を追記して保存しましょう。

ユーザー名 ALL=NOPASSWD: /usr/sbin/service docker start, /usr/sbin/service docker stop, /usr/sbin/service docker restart

最後に.bashrc(zshを使っている人は.zshrc)に以下を追記する。

service docker status > /dev/null 2>&1
if [ $? = 1 ]; then
    sudo service docker start
fi

これでシェル起動時にdocker daemonが起動していなければ自動で起動するようになりました。

ContainerRegistryのCredentialStoreをデフォルトに戻す

DockerはDockerRegistryへのログイン情報をCredentialStoreに保存することができます。
DockerDesktopはCredentialStoreにdesktop.exeを自動で設定しますが、DockerDesktopを使わなくなる以上この設定を手動で削除する必要があります。
~/.docker/config.jsonを開いて以下のように修正しましょう。

{
  ...
  "credsStore": "desktop.exe",<-- この行を削除
  ...
}

おわりに

以上で作業は終了です。

WSL2上で動くDockerに移行した後に、DockerDesktopを起動した場合はどうなるの?

問題なくDockerDesktopの利用が可能です。
というのもDockerDesktopは、WSL2上に/usr/bin/dockerが既に存在している(DockerCLIがインストール済み)場合、これを上書きせずに/var/run/docker.sockを上書きすることでDockerDesktop側のdocker daemonと通信する仕様になっています。

ちなみに、DockerDesktopから再びWSL2上のみで動くDockerに戻す際も、WSL2上でdocker daemonを起動し直せばさらに/var/run/docker.sockが上書きされるので問題ありません。
※CredentialStoreを戻す必要はあります。

Discussion