Docker Desktop for Macに依存しないminikube + hyperkitによるDocker環境の構築

Docker Desktopが有料化しました。個人や非商用のオープンソースの開発では引き続き無償で利用できます。Dockerを便利に利用している身としては、Docker社の利益に貢献したいという気持ちはあるものの、「無償のまま」利用し続ける方法を模索したくなるものです。そこで、Mac(Intel)版で引き続き、Docker環境を無償のまま利用し続ける方法を模索してみました。

Docker Desktop for Macのアンインストール

まずは、Docker Desktop for Macをアンインストールします。Homebrewでインストールしている場合は、以下のコマンドでアンインストールします。後述しますが、Homebrew経由でのDocker Desktop for Macのインストール、アンインストールは、--caskオプションを付与します。--caskオプション無しの場合、Docker CLIがインストールされます。

brew uninstall docker --cask

minikube + hyperkitのインストール

Docker Desktop for Macの代わりにKubernetes環境をローカル環境に簡単に構築できるminikubeを使用します。ただし、Kubernetesの機能は使用しません。コンテナの実行エンジンとして利用します。Homebrew経由で簡単にインストールできるので、楽ちんです。

また、macOSはUNIXの派生ですがLinuxではありません。コンテナを動かすためのVMが必要です。OSレベルでLinux環境を統合できるWindows強いですね。今回は、Docker Desktop for Macのコアエンジンでも利用されているHyperKitを使用します。HyperKitは、macOS標準のHypervisor.frameworkを使用します。他にもVirtualBoxを利用する方法などがあります。

Homebrew経由で、どちらも簡単にインストールできます。

brew install minikube hyperkit

Docker CLIのインストール

続いて、Docker CLIをインストールします。記事執筆時点で、Docker CLI自体は無償のまま利用可能です。こちらも、Homebrewで簡単にインストールできます。

brew install docker

なお、--caskオプションを付与すると、Docker Desktop for Mac(GUI)がインストールされてしまうため注意してください。

brew install docker --cask

minikubeの開始・終了

続いて、minikubeを開始します。minikubeを開始する場合、以下のコマンドを実行します。

minikube start

VirtualBoxなどの仮想化ソフトウェが別途インストールされている場合、minikubeがスタート時に何を利用してVMを構築するかを選択します。明示的にドライバを指定する場合、以下のコマンドを実行してください。

minikube start --driver=hyperkit

minikubeの環境を初期化したい場合、以下を実行します。

minikube delete

minikubeを停止する場合、以下を実行します。

minikube stop

Docker CLIをminikubeで使用する

minikubeを開始し、Docker CLIを使用しようと、例えば以下のコマンドを実行します。

docker ps

Dockerのデーモンが起動していないのでは?と怒られてしまいます。Dockerのデーモンは、HyperKit上で動作しており、Macのローカル環境では動作していないためです。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

そこで、Docker CLIの向き先をHyperKitに向けさせる必要があります。そのためには、以下のコマンドを実行します。

minikube docker-env

すると、以下のような出力が得られます。

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.16.239.7:2376"
export DOCKER_CERT_PATH="/Users/ottan/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

# To point your shell to minikube's docker-daemon, run:
# eval $(minikube -p minikube docker-env)

末尾に記載があるように、以下のコマンドを実行します。

eval $(minikube -p minikube docker-env)

毎回このコマンドを実行するの面倒なので、~/.zshrcの末尾に追加しておくのが良さそうです。

docker login時にエラーが発生

docker login時にエラーが発生します。

raise errors.InitializationError(
docker.credentials.errors.InitializationError: docker-credential-desktop not installed or not available in PATH

docker-credential-desktopがインストールされていない、と怒られます。Docker Hubを引き続き利用するには、Docker Credential Helperをダウンロードします。

brew install docker-credential-helper

再び、docker loginしようとして以下のエラーに遭遇するかもしれません。

Removing login credentials for https://index.docker.io/v1/
WARNING: could not erase credentials:
https://index.docker.io/v1/: error erasing credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ``

再び、docker-credential-desktopがインストールされていない旨のメッセージです。Docker CLIが利用する際の認証情報として、macOSのキーチェーンを指定するようにしてあげましょう。

そのためには、~/.docker/config.jsonを修正します。

5c5
<   "credsStore": "osxkeychain",
---
>   "credsStore": "desktop",

ここまでくれば、Docker Desktop for Macのインストールなしに、dockerdocker-compose(別途、Homebrewでインストール)等が動作するようになるはずです。

まとめ

必要なものをまとめておきます。

brew install docker docker-compose docker-credential-helper minikube hyperkit

また、~/.zshrcの末尾に以下を追記します。(オプション)

eval $(minikube -p minikube docker-env)

Docker Hubを利用する場合、必要に応じて~/.docker/config.jsonを修正します。

5c5
<   "credsStore": "osxkeychain",
---
>   "credsStore": "desktop",
comments powered by Disqus