如何直接在 Minikube 內構建容器映像檔

利用 Docker Machine 方式構建映像檔,加速開發不必費時 push & pull images

ta-ching chen

1 minute read

 文章目錄

開發流程發生什麼問題 

對於一般開發者來說要架設 Kubernetes 是件吃力不討好的事情,自從 minikube 推出後大幅減低進入門檻,讓任何人都可以輕易在電腦上執行本地端的 Kubernetes。minikube 原理是利用 Hyperviosr 在電腦上執行已經安裝好 Kubernetes 的虛擬機,再將 kubelet 的設定指向 minikube 內。

一般開發流程大概是:

  1. 修改程式
  2. 打包成映像檔,送到 remote registry
  3. 更新 pod spec
  4. docker daemon 從 registry 拉最新映像檔

push-pull-image-to-from-remote-registry

但這陣子在開發時遇到幾個問題

  1. 無法直接從 google container registry 拉映像檔
  2. 程式改動頻繁時會花費許多時間在 push & pull 上,降低開發效率

後來發現可以利用 Docker Machine 的方式直接在遠端 docker-daemon 上打包映像檔來避免前述問題。

Docker Machine 是什麼 

Docker 本身是主從式架構,從官方文件的圖可以看到 client 透過 RESTful API 和遠端的 server (docker daemon) 互相溝通。

docker machine

因此只要在本地端設定好目標 server 相關資訊就能夠管理該 docker daemon,可以說執行 docker daemon 的機器就稱作 docker machine。

如何將 client 指向 minikube 的 docker daemon 

而 minikube 的虛擬機正好就是 docker machine 最好的範例,我們只要將目標位置指向 minikube,便可以利用 docker client 和其上執行的 daemon 溝通。

# bash shell
$ eval $(minikube docker-env)

# fish shell
$ eval (minikube docker-env)

只要這樣就指向完成了,此時接著執行 docker build 的話,整個流程會變成

docker machine build

docker client 會把 build context 送往 minikube 內的 docker daemon 進行打包。打包出來的映像檔是存在 minikube 虛擬機內,如此一來裡面的 K8S 就不必花時間重新拉容器映像檔摟!

Troubleshooting 

syntax error near unexpected token ‘minikube’ 

eval (minikube docker-env) 指令有誤,( 前面少個 $

$ eval $(minikube docker-env)

bash: set: -g: invalid option 

bash 的 set 不支援 -g 參數,可以改直接執行下面的指令設定

set -x DOCKER_TLS_VERIFY "1";
set -x DOCKER_HOST "tcp://192.168.99.100:2376";
set -x DOCKER_CERT_PATH "$HOME/.minikube/certs";
set -x DOCKER_API_VERSION "1.23";
comments powered by Disqus