Docker Desktop を使わずに Docker 環境と Minikube を MacOS にインストールしたメモ

作成：2023年3月1日、更新：2023年3月138日
表題の環境整備を行いましたのでメモしておきます。

MacOS Monterey 12.6.3 の Core i7（1章） と M1（2章） にインストールしました。
2023年3月14日時点： Rancher Desktop（0章）が良さそうです。

# 0. Rancher Desktop のインストールの場合

## 事前確認
Docker Desktop がインストールされていればアンインストールして削除。念のためターミナルでも確認
```
% docker --version
zsh: command not found: docker
```
docker-compose のインストールされていないことを確認。
```
 % docker-compose --version
zsh: command not found: docker-compose
```
## インストール

[Docker Desktop](https://rancherdesktop.io/) をダウンロードしてインストール
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/f3a7d9c9-b49f-ee73-075c-ef03d3cc6315.png">
アプリケーションから Rancher Desktop を起動。
dockered (moby) を選択すると、Dockerコマンドとdocker composeコマンドが使える。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/8ddf1cb4-6ddc-69e7-6681-0ed57d1afcf5.png">
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/03539954-66b7-63de-c0bd-f953485e067a.png">
ターミナルを立ち上げ直して、動作確認
```
% docker --version
Docker version 23.0.1-rd, build 393499b
% docker compose version
Docker Compose version v2.16.0
```


# 1. Core i7 の MacBook Pro へインストールの場合

## 1.1 minikube と hyperkit のインストール
```
brew install minikube hyperkit
```

## 1.2 Docker CLIのインストール
```
 % brew install docker
Warning: Treating docker as a formula. For the cask, use homebrew/cask/docker
==> Fetching docker
==> Downloading https://ghcr.io/v2/homebrew/core/docker/manifests/23.0.1
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/docker/blobs/sha256:b299bdae239
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh
######################################################################## 100.0%
==> Pouring docker--23.0.1.monterey.bottle.tar.gz
==> Caveats
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/docker/23.0.1: 12 files, 32.2MB
==> Running `brew cleanup docker`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
```

minikube のバージョン確認
```
% minikube version
minikube version: v1.29.0
```

## 1.3 残りのインストール
詳しくは[この参考ページ](https://ottan.jp/posts/2021/09/993782180/)。
```
brew install docker-compose docker-credential-helper
```

## 1.4 minikube の開始と終了

minikube を開始します。
```
% minikube start --driver=hyperkit
😄  Darwin 12.6.3 上の minikube v1.29.0
✨  ユーザーの設定に基づいて hyperkit ドライバーを使用します
💾  docker-machine-driver-hyperkit ドライバーをダウンロードしています:
    > docker-machine-driver-hyper...:  65 B / 65 B [---------] 100.00% ? p/s 0s
    > docker-machine-driver-hyper...:  8.42 MiB / 8.42 MiB  100.00% 5.32 MiB p/
🔑  'hyperkit' ドライバーは権限昇格が必要です。次のコマンドを実行してください:

    $ sudo chown root:wheel /Users/ryo/.minikube/bin/docker-machine-driver-hyperkit 
    $ sudo chmod u+s /Users/ryo/.minikube/bin/docker-machine-driver-hyperkit 


Password:
💿  VM ブートイメージをダウンロードしています...
    > minikube-v1.29.0-amd64.iso....:  65 B / 65 B [---------] 100.00% ? p/s 0s
    > minikube-v1.29.0-amd64.iso:  276.35 MiB / 276.35 MiB  100.00% 14.91 MiB p
👍  minikube クラスター中のコントロールプレーンの minikube ノードを起動しています
💾  ロード済み Kubernetes v1.26.1 をダウンロードしています...
    > preloaded-images-k8s-v18-v1...:  397.05 MiB / 397.05 MiB  100.00% 13.07 M
🔥  hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) を作成しています...
🐳  Docker 20.10.23 で Kubernetes v1.26.1 を準備しています...
    ▪ 証明書と鍵を作成しています...
    ▪ コントロールプレーンを起動しています...
    ▪ RBAC のルールを設定中です...
🔗  bridge CNI (コンテナーネットワークインターフェース) を設定中です...
    ▪ gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
🔎  Kubernetes コンポーネントを検証しています...
🌟  有効なアドオン: storage-provisioner, default-storageclass
🏄  終了しました！kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました
```

minikube を停止します。
```
 % minikube stop
✋  「minikube」ノードを停止しています...
🛑  1 台のノードが停止しました。
```

## 1.5 Docker CLI を minikube で使用します

Docker CLI の向き先を hyperkit に向けます（minikube が実行状態で）。
```
% minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.64.2:2376"
export DOCKER_CERT_PATH="/Users/ryo/.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 の末尾に上記コマンドを追記しておきます。

## 1.6 dockerコマンドを試します
実行できました。

```
% docker version
Client: Docker Engine - Community
 Version:           23.0.1
 API version:       1.41 (downgraded from 1.42)
 Go version:        go1.19.5
 Git commit:        a5ee5b1dfc
 Built:             Thu Feb  9 19:15:59 2023
 OS/Arch:           darwin/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          20.10.23
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.10
  Git commit:       6051f14
  Built:            Thu Jan 19 17:36:08 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.6.15
  GitCommit:        5b842e528e99d4d4c1686467debf2bd4b88ecd86
 runc:
  Version:          1.1.4
  GitCommit:        5fd4c4d144137e991c4acebb2146ab1483a97925
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```


```
% docker ps
CONTAINER ID   IMAGE                       COMMAND                   CREATED         STATUS         PORTS     NAMES
ecb9fe5d20e7   6e38f40d628d                "/storage-provisioner"    4 minutes ago   Up 4 minutes             k8s_storage-provisioner_storage-provisioner_kube-system_267c9554-10ff-4f28-8e96-8f6adf703e48_2
edfd31ac7e14   5185b96f0bec                "/coredns -conf /etc…"   4 minutes ago   Up 4 minutes             k8s_coredns_coredns-787d4945fb-cwmzr_kube-system_7cf934af-079c-438f-8bd6-448defe1096c_1
2f0f36655339   registry.k8s.io/pause:3.6   "/pause"                  4 minutes ago   Up 4 minutes             k8s_POD_coredns-787d4945fb-cwmzr_kube-system_7cf934af-079c-438f-8bd6-448defe1096c_1
c7354b7a452f   46a6bb3c77ce                "/usr/local/bin/kube…"   4 minutes ago   Up 4 minutes             k8s_kube-proxy_kube-proxy-csz22_kube-system_1c278caa-f870-4ef3-bf8a-c726c29f268a_1
524c94dc08a2   registry.k8s.io/pause:3.6   "/pause"                  4 minutes ago   Up 4 minutes             k8s_POD_kube-proxy-csz22_kube-system_1c278caa-f870-4ef3-bf8a-c726c29f268a_1
ac75af3cd1e2   registry.k8s.io/pause:3.6   "/pause"                  4 minutes ago   Up 4 minutes             k8s_POD_storage-provisioner_kube-system_267c9554-10ff-4f28-8e96-8f6adf703e48_1
0d7c12cd037e   fce326961ae2                "etcd --advertise-cl…"   4 minutes ago   Up 4 minutes             k8s_etcd_etcd-minikube_kube-system_d328e0ae734934e23bc5766da67627b3_1
83e0368e8851   655493523f60                "kube-scheduler --au…"   4 minutes ago   Up 4 minutes             k8s_kube-scheduler_kube-scheduler-minikube_kube-system_197cd0de602d7cb722d0bd2daf878121_1
c3e071b5a3d5   e9c08e11b07f                "kube-controller-man…"   4 minutes ago   Up 4 minutes             k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_96939d3d2117efe8f605629d47b5f330_1
37ca2c1c5025   deb04688c4a3                "kube-apiserver --ad…"   4 minutes ago   Up 4 minutes             k8s_kube-apiserver_kube-apiserver-minikube_kube-system_eb771b202df88bb67e1ef32bf99dd782_1
d48ad1e3d3e1   registry.k8s.io/pause:3.6   "/pause"                  4 minutes ago   Up 4 minutes             k8s_POD_kube-scheduler-minikube_kube-system_197cd0de602d7cb722d0bd2daf878121_1
cae0d34a1fcb   registry.k8s.io/pause:3.6   "/pause"                  4 minutes ago   Up 4 minutes             k8s_POD_kube-controller-manager-minikube_kube-system_96939d3d2117efe8f605629d47b5f330_1
6eda8741f79b   registry.k8s.io/pause:3.6   "/pause"                  4 minutes ago   Up 4 minutes             k8s_POD_kube-apiserver-minikube_kube-system_eb771b202df88bb67e1ef32bf99dd782_1
67dbc316a058   registry.k8s.io/pause:3.6   "/pause"                  4 minutes ago   Up 4 minutes             k8s_POD_etcd-minikube_kube-system_d328e0ae734934e23bc5766da67627b3_1
```

## 1.7 kubectl のバージョンを確認します
```
% kubectl version              
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.2", GitCommit:"fc04e732bb3e7198d2fa44efa5457c7c6f8c0f5b", GitTreeState:"clean", BuildDate:"2023-02-22T13:32:21Z", GoVersion:"go1.20.1", Compiler:"gc", Platform:"darwin/amd64"}
Kustomize Version: v4.5.7
Server Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.1", GitCommit:"8f94681cd294aa8cfd3407b8191f6c70214973a4", GitTreeState:"clean", BuildDate:"2023-01-18T15:51:25Z", GoVersion:"go1.19.5", Compiler:"gc", Platform:"linux/amd64"}
```

```
 % kubectl version --output=yaml
clientVersion:
  buildDate: "2023-02-22T13:32:21Z"
  compiler: gc
  gitCommit: fc04e732bb3e7198d2fa44efa5457c7c6f8c0f5b
  gitTreeState: clean
  gitVersion: v1.26.2
  goVersion: go1.20.1
  major: "1"
  minor: "26"
  platform: darwin/amd64
kustomizeVersion: v4.5.7
serverVersion:
  buildDate: "2023-01-18T15:51:25Z"
  compiler: gc
  gitCommit: 8f94681cd294aa8cfd3407b8191f6c70214973a4
  gitTreeState: clean
  gitVersion: v1.26.1
  goVersion: go1.19.5
  major: "1"
  minor: "26"
  platform: linux/amd64
```

## 1.8 kubectl の設定を検証
クラスタに接続するための設定が正しく行われていることを確認します。
```
% kubectl cluster-info
Kubernetes control plane is running at https://192.168.**.*:8443
CoreDNS is running at https://192.168.**.*:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```

## 1.9 最後に動作確認で色々コマンド試します

クラスタの状態を確認します。
```
% minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
docker-env: in-use
```

イメージの一覧を表示します。
```
% minikube image ls
registry.k8s.io/pause:3.9
registry.k8s.io/pause:3.6
registry.k8s.io/kube-scheduler:v1.26.1
registry.k8s.io/kube-proxy:v1.26.1
registry.k8s.io/kube-controller-manager:v1.26.1
registry.k8s.io/kube-apiserver:v1.26.1
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.9.3
gcr.io/k8s-minikube/storage-provisioner:v5
```

kubectl のヘルプです。
```
% kubectl --help
kubectl controls the Kubernetes cluster manager.

 Find more information at: https://kubernetes.io/docs/reference/kubectl/

Basic Commands (Beginner):
  create          Create a resource from a file or from stdin
  expose          Take a replication controller, service, deployment or pod and expose it as a new Kubernetes service
  run             Run a particular image on the cluster
  set             Set specific features on objects
（以降、略）
```

# 2. M1 MacBook Pro へインストールの場合

Podman をインストールします。
```
brew install podman
```

minikukbe をインストールします。
```
brew install minikube
```

podman を初期化し、Fedra CoreOS のダウンロードを行います。
```
podman machine init --cpus 4 --memory 8192 --rootful
podman machine start
```

minikube をスタートさせます。
```
minikube start --driver=podman
```

dockerコマンドを使えるようにします。
Docker CLI をインストールします（Docker desktop ではありません）
```
brew install docker
```
```
eval $(minikube -p minikube docker-env)
```

動作確認します。
```
% docker ps
% kubectl describe all
% podman version
% podman ps
% kubectl version
% kubectl cluster-info
% minikube status
% minikube image ls
```

minikube を停止します。
```
% minikube stop
```

# 3. 参考
・[Docker Desktop for Macに依存しないminikube + hyperkitによるDocker環境の構築](https://ottan.jp/posts/2021/09/993782180/)
・[hyperkit](https://minikube.sigs.k8s.io/docs/drivers/hyperkit/)
・[入門・kubectlの概要](https://zenn.dev/sasakiki/articles/e6f9196f9c463d)
・[Minikube on M2 MacBook Pro with Podman](https://qiita.com/1ksen/items/7c7cf598345f3ef327ea)

# 4. おまけ
[Minikube on MacOS Monterey 環境構築](https://qiita.com/trtrbohz/items/7f842bb927589cb2218b)を参考に xhyvw のインストールを試みたらエラー出ました。結果、xhyvw は不要でした。
```
brew install docker-machine-driver-xhyve
```

```
% brew install docker-machine-driver-xhyve
Running `brew update --auto-update`...
==> Downloading https://formulae.brew.sh/api/formula.jws.json
######################################################################## 100.0%
==> Downloading https://formulae.brew.sh/api/cask.jws.json
######################################################################## 100.0%
Error: docker-machine-driver-xhyve has been disabled because it does not build!
```

以上です。