在 Minikube 中使用本地 Docker 映像
一、概述
在本教程中,我們將 Docker 容器部署到 Kubernetes,並了解如何為這些容器使用本地鏡像。我們將使用Minikube來運行 Kubernetes 集群。
2. Dockerfile
首先,我們需要一個[Dockerfile](https://docs.docker.com/engine/reference/builder/)
來創建本地 Docker 鏡像。這應該很簡單,因為我們將專注於 Minikube 命令。
讓我們創建一個Dockerfile
,只使用一個打印消息的echo
命令:
FROM alpine
CMD ["echo", "Hello World"]
3. docker-env
命令
對於第一種方法,我們需要確保已安裝Docker CLI 。這是一個管理 Docker 資源的工具,例如鏡像和容器。
默認情況下,它使用我們機器上的 Docker 引擎,但我們可以輕鬆更改它。我們將使用它並將 Docker CLI 指向 Minikube 內的 Docker 引擎。
讓我們檢查一下這個先決條件,看看 Docker CLI 是否正常工作:
$ docker version
輸出應該與此類似:
Client: Docker Engine - Community
Version: 19.03.12
...
Server: Docker Engine - Community
Engine:
Version: 19.03.12
...
讓我們繼續接下來的步驟。我們可以將此 CLI 配置為使用 Minikube 中的 Docker 引擎。這樣,我們將能夠列出 Minikube 中可用的圖像,甚至在其中構建圖像。
讓我們看看配置 Docker CLI 所需的步驟:
$ minikube docker-env
我們可以在這裡看到命令列表:
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.22.238.61:2376"
export DOCKER_CERT_PATH="C:\Users\Baeldung\.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)
現在,我們可以使用 Docker CLI 來調查 Minikube 中的 Docker 環境。
讓我們使用minikube image ls
命令列出可用的圖像:
$ minikube image ls --format table
這將打印一個帶有圖像的表格:
|-----------------------------------------|---------|---------------|--------|
| Image | Tag | Image ID | Size |
|-----------------------------------------|---------|---------------|--------|
| docker.io/kubernetesui/dashboard | <none> | 1042d9e0d8fcc | 246MB |
| docker.io/kubernetesui/metrics-scraper | <none> | 115053965e86b | 43.8MB |
| k8s.gcr.io/etcd | 3.5.3-0 | aebe758cef4cd | 299MB |
| k8s.gcr.io/pause | 3.7 | 221177c6082a8 | 711kB |
| k8s.gcr.io/coredns/coredns | v1.8.6 | a4ca41631cc7a | 46.8MB |
| k8s.gcr.io/kube-controller-manager | v1.24.3 | 586c112956dfc | 119MB |
| k8s.gcr.io/kube-scheduler | v1.24.3 | 3a5aa3a515f5d | 51MB |
| k8s.gcr.io/kube-proxy | v1.24.3 | 2ae1ba6417cbc | 110MB |
| k8s.gcr.io/pause | 3.6 | 6270bb605e12e | 683kB |
| gcr.io/k8s-minikube/storage-provisioner | v5 | 6e38f40d628db | 31.5MB |
| k8s.gcr.io/echoserver | 1.4 | a90209bb39e3d | 140MB |
| k8s.gcr.io/kube-apiserver | v1.24.3 | d521dd763e2e3 | 130MB |
|-----------------------------------------|---------|---------------|--------|
如果我們將其與docker image ls
命令的輸出進行比較,我們會看到兩者都顯示相同的列表。這意味著我們的 Docker CLI 配置正確。
讓我們使用我們的Dockerfile
並從中構建一個鏡像:
$ docker build -t first-image -f ./Dockerfile .
現在它在 Minikube 中可用,我們可以創建一個使用此映像的 pod:
$ kubectl run first-container --image=first-image --image-pull-policy=Never --restart=Never
讓我們檢查一下這個 pod 的日誌:
$ kubectl logs first-container
我們可以看到預期的“Hello World”消息。一切正常。讓我們關閉終端以確保我們的 Docker CLI 未連接到下一個示例的 Minikube。
4. Minikube 圖片加載命令
讓我們看看另一種使用本地圖像的方法。這一次,我們將在我們的機器上在 Minikube 之外構建 Docker 鏡像並將其加載到 Minikube 中。讓我們構建圖像:
$ docker build -t second-image -f ./Dockerfile .
現在圖像存在,但在 Minikube 中尚不可用。讓我們加載它:
$ minikube image load second-image
讓我們列出圖像並檢查它是否可用:
$ minikube image ls --format table
我們可以在列表中看到新圖像。這意味著我們可以創建 pod:
$ kubectl run second-container --image=second-image --image-pull-policy=Never --restart=Never
容器成功啟動。讓我們檢查一下日誌:
$ kubectl logs second-container
我們可以看到它打印了正確的消息。
5. Minikube 鏡像構建命令
在前面的示例中,我們將預構建的 Docker 映像加載到 Minikube。但是,我們也可以在 Minikube 中構建我們的圖像。
讓我們使用相同的Dockerfile
並構建一個新的 Docker 鏡像:
$ minikube image build -t third-image -f ./Dockerfile .
現在鏡像在 Minikube 中可用,我們可以用它啟動一個容器:
$ kubectl run third-container --image=third-image --image-pull-policy=Never --restart=Never
讓我們檢查日誌以確保它正常工作:
$ kubectl logs third-container
它按預期打印“Hello World”消息。
六,結論
在本文中,我們使用了三種不同的方式在 Minikube 中運行本地 Docker 鏡像。
首先,我們將 Docker CLI 配置為連接到 Minikube 內的 Docker 引擎。然後,我們看到了兩個命令來加載預構建的鏡像並直接在 Minikube 中構建鏡像。