Minikube で無料で商用利用できる Docker 開発環境をつくる

2021/09/01に公開
5

Docker Desktop が有料化したことが話題になりました。私自身は Docker の中の人はきちんと稼いで開発の継続性を得てほしいと思っています。ともあれ有料だぞって言われると、いや無料でやれるぜって大喜利にしたくなるものです。

いくつか無料な代替手段を模索されているのを目撃しましたが、大喜利らしくハードな作例が多く、 Minikube + VirtualBox が簡単っぽいぜという紹介記事を書いてみました。

Minikubeはいいぞ。

Minikube とは

Minikube は Kubernetes のローカル環境をシュシュッと作ったり潰したりするコマンドラインツールです。今回は k8s な部分は一切つかわないです。

制限

今回の作例では VirtualBox を利用する都合で、Apple Silicon Mac では動作しないす。

環境構築

$ brew install minikube virtualbox docker docker-compose

Minikube 自体は OS 上に VM を構築する能力を持ち合わせていないため、VirtualBox, Parallels, VMWareFusionなどのOS仮想化ソフトウェアを別途で用意します。ここでは金がなくとも商用利用できる VirtualBox をインストールします。

Minikube 自体には docker コマンドや、docker-compsoe コマンドはバンドルされていません。よほど先進的な環境でなければ、お手元では docker や docker-compose を利用されるでしょうから、このようにインストールします。

起動

なんも考えず以下で新規作成されます。新規作成時はちょっと時間かかります。

$ minikube start --container-runtime="docker"

いちど新規作成して起動した状態で、もういっかい minikube start すると、VMの再起動となります。VMが停止しているときに minikube start すると、VMが起動します。

VirtualBox 以外にもOS仮想化ソフトを入れていると、どれが選ばれるんだろうな、auto detect らしいです。VirtualBoxを明示して立てるには以下のように。

$ minikube start --container-runtime="docker" --driver=virtualbox

このとき VirtualBox のコンパネを見ると、MinikubeのVMが起動しています。

掃除

めちゃくちゃに壊れたときはVMを捨ててしまいましょう。

$ minikube delete

VMに入る

好奇心のまま漁りたいこともあるでしょう。VMに入ることができます。

$ minikube ssh

他の操作

$ minikube help

サブコマンドのヘルプは以下のように見れます。

$ minikube start --help

minikube start は特に盛り沢山のパラメータがあります。多数のコンテナを起動する docker-compose だったり、ストレージ使いまくるコンテナだったりするなら、VMのCPUコア数割当、メモリ割当、VMのストレージサイズを調整してみるとよいでしょう。

docker 操作する

docker コマンドは操作対象を環境変数で指定できるようになっています。

minikubeの以下コマンドで、実行中のシェルに応じた環境変数を設定するコマンドが生成されます。

$ minikube docker-env

このことを利用し、私の手元の fish shell で実行すると、

❯ minikube docker-env
set -gx DOCKER_TLS_VERIFY "1";
set -gx DOCKER_HOST "tcp://192.168.99.102:2376";
set -gx DOCKER_CERT_PATH "/Users/shinnosuke.suzuki/.minikube/certs";
set -gx MINIKUBE_ACTIVE_DOCKERD "minikube";

# To point your shell to minikube's docker-daemon, run:
# minikube -p minikube docker-env | source

このように環境変数に取り込めます。

❯ minikube docker-env | source

この状態で docker コマンドを打つと、このように動作します。MinikubeがVirtualBoxに立てたVM内で動作しているk8sコントロールプレーンを構成するコンテナ群が見れます。

❯ docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS     NAMES
cf802006a0e3   6e38f40d628d             "/storage-provisioner"   5 minutes ago   Up 5 minutes             k8s_storage-provisioner_storage-provisioner_kube-system_b416aabf-7ef3-4bb5-85ff-43aacb18c265_0
b4cfe4383f9d   k8s.gcr.io/pause:3.4.1   "/pause"                 5 minutes ago   Up 5 minutes             k8s_POD_storage-provisioner_kube-system_b416aabf-7ef3-4bb5-85ff-43aacb18c265_0
(略)
c5158fffdc2a   k8s.gcr.io/pause:3.4.1   "/pause"                 5 minutes ago   Up 5 minutes             k8s_POD_kube-scheduler-minikube_kube-system_a2acd1bccd50fd7790183537181f658e_0
6b652f7cdda7   k8s.gcr.io/pause:3.4.1   "/pause"                 5 minutes ago   Up 5 minutes             k8s_POD_etcd-minikube_kube-system_f7a7ffc521614aab3fe9930aeb3a8708_0

docker-compose やる

docker コマンドが使えるようになれば、docker-compose コマンドも利用できます。例として phpMyAdmin + MariaDB な docker-compose.yml を手元に転がして、

❯ docker-compose -f docker-compose.yml up -d
❯ docker-compose top
shinnosukesuzuki_db_1
UID   PID    PPID   C   STIME   TTY     TIME      CMD
-------------------------------------------------------
999   9702   9649   0   12:45   ?     00:00:00   mysqld

shinnosukesuzuki_phpmyadmin_1
  UID      PID    PPID   C   STIME   TTY     TIME             CMD
--------------------------------------------------------------------------
root       9738   9691   0   12:45   ?     00:00:00   apache2 -DFOREGROUND
www-data   9880   9738   0   12:45   ?     00:00:00   apache2 -DFOREGROUND
www-data   9881   9738   0   12:45   ?     00:00:00   apache2 -DFOREGROUND
www-data   9882   9738   0   12:45   ?     00:00:00   apache2 -DFOREGROUND
www-data   9883   9738   0   12:45   ?     00:00:00   apache2 -DFOREGROUND
www-data   9884   9738   0   12:45   ?     00:00:00   apache2 -DFOREGROUND

この phpMyAdmin は、 minikube docker-env で見えた DOCKER_HOST (作例では 192.168.99.102 ) の 8080 ポートを開けているので、手元のブラウザや curl では、 http://192.168.99.102:8080 でアクセスできます。 localhost ではないのですよね。最初ハマる。

まとめ

わりと手数すくなく、素直に使える docker 環境として、 Minikube + VirtualBox がよさげだぞ、という記事でした。

参考

Discussion

inductorinductor

Kubernetes v1.23からDockerがデフォルトで使えなくなるので、MinikubeでどこまでDockerが使えるのかはわからないなーと思いながら読みました。

Suzuki ShinnosukeSuzuki Shinnosuke

すご。ありがとうございます!
延命措置として minikube start --container-runtime="docker" を明示して使うのが確実そうですね。とはいえ --container-runtime に渡す名前も変わりそうなのか....。いよいよ使えなくなった頃には lima や podman が引越先になると期待

Suzuki ShinnosukeSuzuki Shinnosuke

頂戴したコメントを受け、記事本文で --container-runtime="docker" を明示するよう改めました。あざす!!