Minikube で無料で商用利用できる Docker 開発環境をつくる
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 がよさげだぞ、という記事でした。
参考
- VirtualBox
- https://www.virtualbox.org
- GPL v2
- なお virtualbox-extension-pack は PUEL という商用利用は有料なラインセンスなので、入れてしまうと金がかかります
- Minikube
- https://github.com/kubernetes/minikube/
- Apache License
- docker CLI, docker-compose
- 今回の有料化のスコープ外で、ひきつづき無料とのこと
Discussion
Kubernetes v1.23からDockerがデフォルトで使えなくなるので、MinikubeでどこまでDockerが使えるのかはわからないなーと思いながら読みました。
かなしみ....
ヒアリング結果になります
すご。ありがとうございます!
延命措置として
minikube start --container-runtime="docker"
を明示して使うのが確実そうですね。とはいえ--container-runtime
に渡す名前も変わりそうなのか....。いよいよ使えなくなった頃には lima や podman が引越先になると期待頂戴したコメントを受け、記事本文で
--container-runtime="docker"
を明示するよう改めました。あざす!!