この記事は、 Docker Advent Calendar 2022 の 22日目の記事だ。
Windows 上や mac OS 上で、手軽に Docker や Kubernetes の環境を構築するための、 Docker Desktop というツールが存在する。
この Docker Desktop は、 2021年8月31日以降、営利企業での利用は基本的に有料サブスクリプションが必須 となった。
更に、 2022年10月27日以降、 Docker Team プランにて 100人のユーザー数上限が設けられ 、それ以上の場合は Docker Business プランの契約が必要となっている。
まぁ、営利企業ならそれぐらい払えよって話なんだが、のっぴきならん理由でなかなかそうもいかない諸兄も少なくないだろう。
正直、 Business プランで Docker Desktop 以外の機能を全く使わない(ないし使えない)場合、 $21/user/month はだいぶ高い。
ということで、代替?になるかわからんが、主に Windows での実行をスコープに、 同一コンセプトの Rancher Desktop への移行を紹介してみよう。
Rancher Desktop について
Rancher Desktop は、 Docker Desktop と同様 PC の仮想環境上にコンテナデーモンを起動させ、 デスクトップから手軽に Docker CLI (with Moby/dockerd) や nerdctl (with containerd) を利用できるようにするツールだ。
かつての SUSE Linux の開発元、 現在の openSUSE プロジェクトの主要スポンサーとなっている SUSE 社 が開発している、 Rancher ソリューションの一環として、 オープンソースで開発されているプロジェクトである。
WSL2 上に dockerd や containerd デーモンを立ち上げ、 他の WSL2 ディストリビューションや ホストOS から Docker CLI や nerdctl が使えるようになっている。
Windows の Docker CLI からも、 WSL 内の Docker CLI からも、 Docker outside of Docker (DooD) が問題なくできるなど、基本的な機能はしっかりしている。
Docker Desktop と比較すると、以下のような利点がある。
- 無料で利用できる
- nerdctl にも対応している
- Kubernetes のバージョンが選べる
一方で、使っているといくつかの問題が目につく。 (1.7.0 現在)
- プロキシ環境下で イメージの pull させる公式手順がない
- 回避手順は後述する
- WSL 内からの CLI の実行にいくつか難がある
- docker CLI の実行が、 2~3 テンポ遅い
docker run
に--interactive
(-i
) オプションを付けないと、標準出力がホスト側に表示されない
また、問題とまでは言わないまでも、いくつか注意点もある。
- 付属の docker-compose が、 docker compose コマンドと同等の Compose V2 である
- Docker Desktop 付属の V1 との間には いくつかの破壊的変更 がある
- Hyper-V の仮想化に依存するため、 VPN 環境下と相性が悪い
- 後述
Docker Desktop から Rancher Desktop への移行
Windows 版に於ける、 Docker Desktop から Rancher Desktop への移行手順をまとめておく。
1. Docker Desktop を削除
公式の FAQ では、「Docker Desktop を Rancher Desktop と一緒にインストールできる(同時に実行できない)」と書かれてはいる。
しかし、 クライアントの Docker CLI コマンドやその設定フォルダ (%USERPROFILE%\.docker\
) の設定内容が衝突して問題が発生するので、 Docker Desktop を削除しておいたほうが良い。
Q: Can I have Docker Desktop installed alongside Rancher Desktop?
A: Yes, but they cannot be run at the same time as both Rancher Desktop and Docker Desktop use the same Docker socket (
/var/run/docker.sock
). Before starting one, be sure to stop the other first.
その手順としては、以下の通り。
- Docker Desktop のアンインストール
%USERPROFILE%\.docker
フォルダの削除(ないし、リネーム)- PC の再起動
3. Rancher Desktop のインストール
Rancher Desktop 本体のインストール。
Docker Desktop を動かしていたなら問題ないと思うが、 WSL2 を動かせるだけの仮想化支援機能を持った CPU が必要だ。
- https://rancherdesktop.io/ から、 Windows 向けインストーラーをダウンロード
- インストーラーを起動し、ライセンス (Apache License, Version 2.0) に同意してインストール
- システムにインストールするか、ユーザーごとにインストールするか選べるが、 基本的にはシステムにインストールさせる。
- 予め WSL2 が有効にされた状態でないと、 WSL2 の有効化のために何度か OS の再起動が必要になる。
- 初回起動時に、 Kubernetes の要否と コンテナランタイムを選択する。
dockerd に変更しておこう。
- Rancher Desktop の設定で、 WSL2 ディストリビューション内からの docker コマンドの実行を有効にしておく
-
プロキシ環境下の場合、以下の設定を行う
-
Docker daemon 側でイメージを pull する際のプロキシーを有効にするため、 PowerShell で以下のコマンドを実行し、 Rancher Desktop を再起動させる。
'echo ''# proxy configuration'' >> /etc/rc.conf; echo ''rc_env_allow="http_proxy http_proxy no_proxy"'' >> /etc/rc.conf; echo ''export http_proxy="http://proxy.example.com:8080/"'' >> /etc/rc.conf; echo ''export https_proxy="http://proxy.example.com:8080/"'' >> /etc/rc.conf;' | wsl --distribution rancher-desktop --exec /bin/ash --stdin
: not found
というエラーが出るが、気にしない。- Rancher Desktop のバージョンアップで、 docker daemon イメージの更新が入った場合、この設定をやり直す必要がある。
-
Docker CLI で イメージのビルドやコンテナ実行時のプロキシーを有効にするため、 Docker クライアントの設定 の例に従い、
%USERPROFILE%\.docker/config.json
と、 各 WSL2 ディストリビューション毎の~/.docker/config.json
に proxy の設定を追記する。
例:{ "proxies": { "default": { "httpProxy": "http://proxy.example.com:8080", "httpsProxy": "http://proxy.example.com:8080", "noProxy": "*.test.example.com,.example2.com,127.0.0.0/8" } } }
-
Rancher Desktop を起動してしばらく待てば、 Windows ホストや、 WSL2 内から docker コマンドが利用できるようになる。
トラブルシューティング
プロキシ環境下の pull 絡みの操作で connection reset by peer のエラー
pull が絡む操作で以下のようなエラーが出る場合
username@pcname:~$ docker pull alpine:3.16
Error response from daemon: Get "https://registry-1.docker.io/v2/": read tcp 172.25.205.147:57296->34.205.13.154:443: read: connection reset by peer
Rancher Desktop のバージョンアップで、 docker daemon 側のプロキシの設定がリセットされているかもしれない。
上述の 『Docker daemon 側でイメージを pull する際のプロキシーを有効』 の設定をやり直す。
pull 絡みの操作で credentials のエラー
pull が絡む操作で以下のようなエラーが出る場合
error getting credentials - err: exit status 127, out: ``
Windows 側の場合、 %USERPROFILE%.docker\config.json に "credsStore": "wincred" を付け加える
@@ -1,4 +1,5 @@
{
+ "credsStore": "wincred",
"proxies": {
"default": {
WSL 側の場合、 ~/.docker/config.json に "credsStore": "pass" を付け加えてみる
@@ -1,4 +1,5 @@
{
+ "credsStore": "pass",
"proxies": {
"default": {
WSL 上で docker.sock の権限エラー
/var/run/docker.sock がパーミッションエラーになってしまう場合
dial unix /var/run/docker.sock: connect: permission denied
グループの設定とパーミッションを振ってから、 WSL のシェルにログインし直す。
ref: Q: How do I fix permission denied errors when trying to use Docker on WSL?
$ sudo groupadd docker
$ sudo adduser $USER docker
$ sudo chown root:docker /var/run/docker.sock
$ sudo chmod u=rw,g=rw,o= /var/run/docker.sock
WSL 上で実行するとコンテナ内の標準出力が表示されない
WSL ではなぜか、 docker run に --interactive ( -i ) オプションを付けないと、標準出力がホスト側に表示されない。
$ docker run --rm alpine ls -la
$ docker run --rm -i alpine ls -la
total 64
drwxr-xr-x 1 root root 4096 Dec 22 17:31 .
drwxr-xr-x 1 root root 4096 Dec 22 17:31 ..
-rwxr-xr-x 1 root root 0 Dec 22 17:31 .dockerenv
drwxr-xr-x 2 root root 4096 Nov 22 13:06 bin
drwxr-xr-x 5 root root 340 Dec 22 17:31 dev
drwxr-xr-x 1 root root 4096 Dec 22 17:31 etc
drwxr-xr-x 2 root root 4096 Nov 22 13:06 home
[...]
Windows 側からだと問題なく表示される。
VPN 下で通信できない
Hyper-V の仮想化に依存するため、一部の VPN 環境下と相性が悪い。
回避方法は以下の記事を参照。
docker コマンド実行時に docker daemon is not running エラー
Rancher Desktop を起動して居るのにもかかわらず、以下のようなエラーが出る場合。
error during connect: This error may indicate that the docker daemon is not running.:
とりあえずしばらく待って再試行してみよう。
Rancher Desktop UI 上で起動が完了したように見えてから、実際に docker コマンドが使えるようになるまで 十数秒~数十秒 かかることが多い。