Docker Desktopが有料化？なら、Minikubeを使えばいいじゃない

## はじめに (宣伝アリ)
なんと、一週間後の11月25日に[山Pの写真集](https://www.amazon.co.jp/%E5%B1%B1%E4%B8%8B%E6%99%BA%E4%B9%85-%E5%86%99%E7%9C%9F%E9%9B%86-CIRCLE-%E5%B1%B1%E4%B8%8B-%E6%99%BA%E4%B9%85/dp/4065259487/)が発売されます！！
最初で最後の写真集らしいので楽しみですね☆ wkwk

はい、というわけで (どういうわけだ)
「パンがなければケーキを食べればいいじゃない」
「Docker Desktopが無いならMinikube(HyperKit)を使えばいいじゃない」

別にMinikube × HyperKitじゃなくても、有料化回避の記事でよく見るMultipassでもいいんですけど、結局あれCLIとかDockerHostの設定とか自前でやるじゃないですか？
そういう諸々が面倒でしたのでMinikubeを使うようにしました。

※ これはIntel Mac向けの記事です。
※ **Docker Desktopが有料化されるのは組織人数が250人以上、もしくは年間売り上げ1000万ドル以上の組織または個人です。**

## Docker Engineについて
前提知識として、Dockerは実はClientとDaemonでソフトが分かれています。

その[Issueがこちら](https://github.com/moby/moby/pull/20639)です

以下の公式Docに書いてあるように今の所WindowsとLinux用にDaemonは提供されていますが、Macには提供されていません (ぴえん)
https://docs.docker.com/engine/install/binaries/
> Static binaries for the Docker daemon binary are only available for Linux (as dockerd) and Windows (as dockerd.exe).

[DockerのIssue](https://github.com/moby/moby/issues/27102#issuecomment-251164008)で「Docker for MacはVM(HyperKit)で動いてるやん？だからわざわざ、エンジンをMac上で起動する必要ないやろ。」って言ってます。

ClientはMac用にも配布してくれてるみたいで[こちら](https://download.docker.com/mac/static/stable/x86_64/)でBinaryで提供されてるみたいです。
> Docker client are available for Linux, Windows, and macOS (as docker).


## Docker DesktopからDocker CLIに移行する手順

まず、Docker DesktopのダッシュボードからDocker Desktopをアンインストールします。(当たり前)
![スクリーンショット 2021-11-18 10.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/3b2fcaf4-4e40-bd64-34d4-8af944284695.png)

minikubeをインストールします。

``` sh
brew install minikube
```

そのまま起動しようとするとhyperkitが無いよと言われます。

![スクリーンショット 2021-11-18 10.52.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/dd396710-f2fd-c437-001c-49dfe510022f.png)

hyperkitをインストールします。

``` sh
brew install hyperkit
```

minikubeを起動します

``` sh
minikube start
# ※ configセットしてないのでデフォルト設定でリソースが取られます。
# CPU=2, Memory=6GB, Disk=20GB
```

ホストマシン側にもDocker Clientが欲しいのでインストールします。(sshしたくない)

```
brew install docker docker-compose
```


![スクリーンショット 2021-11-18 11.00.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/7810fe18-72b9-4b0b-6a80-ac176b50fa52.png)

> Compose is now a Docker plugin. For Docker to find this plugin, symlink it

docker-composeはpluginになったんで、pluginとして使うにはシンボリックリンク貼ってって言ってます。
なので、シンボリックリンクを貼ります。

``` sh
mkdir -p ~/.docker/cli-plugins
ln -sfn /usr/local/opt/docker-compose/bin/docker-compose ~/.docker/cli-plugins/docker-compose
```

Docker CLIで利用する環境変数をevalでセットします。

``` sh
echo 'eval $(minikube docker-env)' >> ~/.zshrc
source ~/.zshrc
```

シェル起動時に読み込まれるんじゃなくてお試しでやってみたい方は以下だけ打って下さい。

```eval $(minikube docker-env)```

k8sコンテナを利用しないのに起動しっぱなしになるので停止します。

``` sh
minikube pause
```

これでセットアップは完了です！


## 試しにDockerコンテナ起動してみる

以下の記事で作ったプログラムで試してみます。

https://qiita.com/taisei_otsuka/items/87adaf5f8ed19a8549c5

まず、Dockerfile or compose.yamlにVolume設定を記述していた場合、先にVMとマウントしてあげる必要があります。

``` sh
# Dockerfileが存在するDirectoryまで移動して
minikube mount $PWD:$PWD
```

Current Directoryをマウントすることで、composeで起動した時にDockerに渡されるPathとマウント先のPathが一致するのでコンテナ内の/hogeにもマウントされるという仕組みです。

``` yaml
volumes:
  - .:/hoge
```

mountが終わったらDockerコンテナを起動します。

``` sh
# docker run -v ...
# OR
docker compose up -d
```

VMのIPを調べます。

``` sh
minikube ip # => xxx.xxx.xxx.xxx
```

返ってきたIPを使ってホストマシン上からcurlを飛ばしてみます。

![スクリーンショット 2021-11-18 11.56.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/16599757-4c3c-4172-a508-381f94b999db.png)
ちゃんとレスポンスが返ってきましたね！

毎回IPを指定するのが面倒な場合はminikube起動時に以下のコマンドを使用してhostsに書き込んで下さい。
Macのhostsはmulti onなので、複数のIPが割り当てられていても名前解決してくれます。
(hostsは汚くなりますが ...)

```
echo "`minikube ip` local.docker" | sudo tee -a /etc/hosts
```

local.dockerにcurlを飛ばすと... 無事通りました！
![スクリーンショット 2021-11-18 12.02.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/c4ea9215-9b9b-0365-3091-b6ed4e8d23c0.png)

## あとがき
個人的にはインストールから動作確認まで非常に楽だったな〜という印象なのですが、皆さんは如何でしたでしょうか？
この記事が皆さんのお力になれれば幸いです ☆

## 採用PR

アプリケーションのコンテナ化・二次元コンテンツに興味がある、もしくはチャレンジしてみたいという方は是非一緒に働きましょう！

https://hrmos.co/pages/eisys/jobs/0000191

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307359/2000f749-3e82-7a47-b1c4-4444e237f79c.png" width=45%>