DockerDesktopからWSL2上のみで動くDockerに移行する
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を止めましょう。
- Windows側でDocker Desktop開く
- Settings(歯車マーク)から
Start Docker Desktop when you log in
のチェックを外す。 - 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