兩種在Minikube中運行本地Docker鏡像的簡單方式


前言

本文將分享兩種在Minikube中運行本地Docker鏡像的簡單方式

Kubernetes

`

要求

你將學到的知識

本文將教會大家如何在Minikube中使用本地的Docker鏡像。因為Kubernetes默認從注冊表中提取鏡像,所以Kubernetes一般是不會使用本地鏡像,並且在生產環境中也不應該使用本地鏡像。但是,如果我們可以很輕松的使用本地鏡像,而不是每次都需要將這些鏡像推送到遠程的注冊表、登錄遠程注冊表並在本地電腦中重新拉取,那么使用本地鏡像將十分便利。

和往常一樣,我在github中准備了一個倉庫, 方便大家查看完成的代碼庫,並且可以按照本文描述的步驟進行操作。

Demo介紹

/
|- app/
  |- Dockerfile
  |- index.js
  |- package.json
|- deployment.yaml

在上面的文件夾結構中,我將重點介紹將在本文中使用的重點文件:

  • app/Dockerfile 用於構建包含一個Node.js Web 服務器的本地Docker鏡像的Dockerfile,我們將其部署到Minikube

  • app/index.js Node.js Web 服務器的應用程序代碼

  • app/package.json 我們Node.js Web 服務器的依賴。在本文中,只使用了express*,一個用於搭建Web服務器的Nodejs庫

  • deployment.yaml 在Kubernetes中運行Node.js Web 服務器的Deployment配置

app文件夾中的實際內容和本文無關。 我僅僅是提供一個demo方便接下來的教程講解,當然使用你自己的demo也是可以的。如果你想要使用app這個應用,請注意服務器將在容器內部中監聽8080端口。

Deployment配置

deployment.yaml的內容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    name: myapp
spec:
  selector:
    matchLabels:
      name: myapp
  template:
    metadata:
      labels:
        name: myapp
    spec:
      containers:
        - name: myapp
          image: pz/demo
          imagePullPolicy: Never
          ports:
            - containerPort: 8080

我們需要重點關注的是imagePullPolicycontainerPort這兩個配置

通過containerPort,我們將暴露app正在監聽的8080端口,因此我們稍后可以通過瀏覽器訪問http://127.0.0.1:8080去驗證是否滿足我們預期那樣工作。

更關鍵的是imagePullPolicy。如果你想使用本地Docker鏡像,imagePullPolicy需要設置成Never, 否則, Kubernetes將在注冊表中根據你提供的名字來搜素同名鏡像。

構建Dcoker鏡像

為了驗證Docker鏡像能夠按照我們的預期在Kubernetes中運行,讓我們來構建並運行。

首先,我們導航進入app目錄,然后我們通過docker build -t pz/demo .構建Docker鏡像,通過-t參數將鏡像名字設置為pz/demo

docker images

當構建完成之后,我們可以通過docker run -it --rm -p 8080:8080 pz/demo命令來運行容器,並將Docker的8080端口映射的本地的8080端口。接下來,我們可以在瀏覽器中訪問localhost:8080。 如果我們可以在瀏覽器中看到"Hello World!",那么說明我們的容器運行正常。

localhost:8080

在Minikube中運行本地Docker鏡像

如果你想通過kubectl apply -f deployment.yaml命令部署上面的deployment.yaml到你的Minikube中,那啟動的Pod將找不到你剛剛構建的Docker鏡像。

你可以通過kubectl logs deployment.apps/myapp命令來檢查日志去來驗證這個錯誤的結果。

kubectl logs deployment.apps/myapp

上面的日志顯示由於Kubernetes拉取不到鏡像Pod一直等待重啟。這其實是因為Minikube沒有方法獲取你本地Docker鏡像。

但是幸運的是,有兩個簡單的命令可以幫助解決這個問題。

第一種方式是使用image load命令, 你可以使用下面的名利將本地Docker鏡像從本地電腦中導入Minikube中:

# General
minikube image load <IMAGE_NAME>
# Example
minikube image load pz/demo

在導入完成之后,你可以重啟pod。然后你可以發現pod可以正常工作了。

其實我們還可以變得更簡單。以前的方法是你需呀先在本地構建Docker鏡像,然后將其移動到Minikube容器中,雖然耗時不多,但是終究還是浪費了不少時間。

通過使用Minikube的image build, 我們可以在Minikube中直接構建鏡像:

# General
minikube image build -t <IMAGE_NAME> .
# Example
minikube image build -t pz/demo .

使用minikube image build構建出來的鏡像可以在Minikkube中直接訪問,同時也不再需要在minikube image load中的第二步導入步驟。

使用以上兩種之一的方法,我們可以重新檢查一下Deployment的日志:

kubectl logs deployment.apps/myapp

為了進一步驗證一切是否按照我們預期的工作,我們可以使用下面的命令將本地8080端口轉發發Deployment的8080端口中:

kubectl port-forward deployment/myapp 8080:8080

重新檢查瀏覽器,我們可以發現本地構建的應用在Minikube中運行正常,🎉🎉🎉

localhost:8080

總結

通過本文,你應該能夠使用minikube image loadminikube image buildcommand命令在Minikube中使用本地鏡像了.

更多信息請關注LinkedIn

后言

原文:Two easy ways to use local Docker images in Minikube
譯文: 兩種在Minikube中運行本地Docker鏡像的簡單方式
譯者:大明二代


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM