この記事は、 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 のバージョンが選べる
- VPN 環境下でも問題が発生しにくい
- v1.8.1 のネットワークスタックの変更により、問題を回避できるようになった。
一方で、使っているといくつかの問題が目につく。 (1.9.0 現在)
プロキシ環境下で イメージの pull させる公式手順がない- v1.9.0 で解決済み
- 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 が必要だ。
もし、 Docker Desktop を動作させたこともなく WSL2 も実行させた覚えの無い PC に、 Rancher Desktop を新たにインストールするなら、 管理者モードのコマンドプロンプトで wsl --install
と入力 して、 WSL の Ubuntu ディストリビューションが動く状態であることを、予め確認しておいた方が良いだろう。
さて、 Rancher Desktop のインストール手順は以下の通り。
- https://rancherdesktop.io/ から、 Windows 向けインストーラーをダウンロード
- インストーラーを起動し、ライセンス (Apache License, Version 2.0) に同意してインストール
- システムにインストールするか、ユーザーごとにインストールするか選べるが、 基本的にはシステムにインストールさせる。
- 予め WSL2 が有効にされた状態でないと、 WSL2 の有効化のために何度か OS の再起動が必要になる。
- 初回起動時に、 Kubernetes の要否と コンテナランタイムを選択する。
dockerd に変更しておこう。
- Rancher Desktop の設定項目の、 WSL -> Integrations の項目で、 WSL2 ディストリビューション内からの docker コマンドの実行を有効にしておく
-
プロキシ環境下の場合、以下の設定を行う
- Docker daemon 側でイメージを pull する際のプロキシーを有効にするため、 Rancher Desktop の設定項目の、 WSL -> Proxy の項目にプロキシの設定を入力。
-
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" } } }
- Docker daemon 側でイメージを pull する際のプロキシーを有効にするため、 Rancher Desktop の設定項目の、 WSL -> Proxy の項目にプロキシの設定を入力。
設定を有効にしたあと、 Rancher Desktop を起動してしばらく待てば、 Windows ホストや、 WSL2 内から docker コマンドが利用できるようになる。
メモ: |
公式でプロキシに対応される 1.8.1 以前は、以下のような手順で設定を行っていた。
|
トラブルシューティング
プロキシ環境下の 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 環境下と相性が悪い。
回避方法は以下の記事を参照。
ただ、この問題は v1.8.1 で解消された模様。
K8s などで問題が出る場合は、 Preferences -> WSL -> Network の項目で、 networking tunnel を有効にしてみると良い。
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 コマンドが使えるようになるまで 十数秒~数十秒 かかることが多い。