k8s手動(dòng)拉取docker鏡像的方法示例
首先我們需要安裝 docker
來(lái)打包鏡像,如果你本地已經(jīng)安裝了 docker
推薦安裝方法
目前使用 Docker Desktop 來(lái)安裝 docker 還是最簡(jiǎn)單的方案,打開官網(wǎng)下載對(duì)應(yīng)你電腦操作系統(tǒng)的包即可
當(dāng)安裝完成后,可以通過(guò) docker run hello-world
來(lái)快速校驗(yàn)是否安裝成功!
安裝 minikube
我們還需要搭建一套 k8s 本地集群 (使用云廠商或者其它 k8s 集群都可) 。本地搭建 k8s 集群的方式推薦使用 minikube。
可以根據(jù) minikube 快速安裝 來(lái)進(jìn)行下載安裝,這里簡(jiǎn)單列舉 MacOS 的安裝方式,Linux & Windows 操作系統(tǒng)可以參考官方文檔 快速安裝。
brew install minikube
啟動(dòng) minikube
因?yàn)?minikube 支持很多容器和虛擬化技術(shù) (Docker, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, or VMware Fusion/Workstation),也是問(wèn)題出現(xiàn)比較多的地方,所以這里還是稍微說(shuō)明一下。
如果你使用 docker
的方案是上面推薦的 Docker Desktop ,那么你以下面的命令啟動(dòng) minikube 即可,需要耐心等待下載依賴。
minikube start --vm-driver docker --container-runtime=docker
啟動(dòng)完成后,運(yùn)行 minikube status
查看當(dāng)前狀態(tài)確定是否啟動(dòng)成功!
如果你本地只有 Docker CLI,判斷標(biāo)準(zhǔn)如果執(zhí)行 docker ps
等命令,返回錯(cuò)誤
brew install hyperkit
minikube start --vm-driver hyperkit --container-runtime=docker# Tell Docker CLI to talk to minikube's VM
eval $(minikube docker-env)# Save IP to a hostname
echo "`minikube ip` docker.local" | sudo tee -a /etc/hosts > /dev/null# Test
docker run hello-world
minikube 命令速查
minikube stop 不會(huì)刪除任何數(shù)據(jù),只是停止 VM 和 k8s 集群。
minikube delete 刪除所有 minikube 啟動(dòng)后的數(shù)據(jù)。
minikube ip 查看集群和 docker enginer 運(yùn)行的 IP 地址。
minikube pause 暫停當(dāng)前的資源和 k8s 集群
minikube status 查看當(dāng)前集群狀態(tài)
安裝 kubectl
這一步是可選的,如果不安裝的話,后續(xù)所有 kubectl 相關(guān)的命令,使用 minikube kubectl 命令替代即可。
如果你不想使用 minikube kubectl 或者配置相關(guān)環(huán)境變量來(lái)進(jìn)行下面的教學(xué)的話,可以考慮直接安裝 kubectl。
brew install kubectl
注冊(cè) docker hub 賬號(hào)登錄
因?yàn)槟J(rèn) minikube 使用的鏡像地址是 DockerHub,所以我們還需要在 DockerHub 賬號(hào),并且使用 login 命令登錄賬號(hào)。
docker login
Container
我們的旅程從一段代碼開始。新建一個(gè) main.go 文件,復(fù)制下面的代碼到文件中。
package main import ( "io" "net/http" ) func hello(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "[v1] Hello, Kubernetes!") } func main() { http.HandleFunc("/", hello) http.ListenAndServe(":3000", nil) }
上面是一串用 Go 寫的代碼,代碼邏輯非常的簡(jiǎn)單,首先啟動(dòng) HTTP 服務(wù)器,監(jiān)聽 3000 端口,當(dāng)訪問(wèn)路由 /的時(shí)候 返回字符串 [v1] Hello, Kubernetes!。
在以前,如果你想將這段代碼運(yùn)行起來(lái)并測(cè)試一下。你首先需要懂得如何下載 golang 的安裝包進(jìn)行安裝,接著需要懂得 golang module 的基本使用,最后還需要了解 golang 的編譯和運(yùn)行命令,才能將該代碼運(yùn)行起來(lái)。甚至在過(guò)程中,可能會(huì)因?yàn)榄h(huán)境變量問(wèn)題、操作系統(tǒng)問(wèn)題、處理器架構(gòu)等問(wèn)題導(dǎo)致編譯或運(yùn)行失敗。
但是通過(guò) Container (容器) 技術(shù),只需要上面的代碼,附帶著對(duì)應(yīng)的容器 Dockerfile 文件,那么你就不需要 golang 的任何知識(shí),也能將代碼順利運(yùn)行起來(lái)。
Container (容器) 是一種沙盒技術(shù)。它是基于 Linux 中 Namespace / Cgroups / chroot 等技術(shù)組合而成,更多技術(shù)細(xì)節(jié)可以參照這個(gè)視頻 如何自己實(shí)現(xiàn)一個(gè)容器。
下面就是 Go 代碼對(duì)應(yīng)的 Dockerfile,簡(jiǎn)單的方案是直接使用 golang 的 alpine 鏡像來(lái)打包,但是因?yàn)槲覀兒罄m(xù)練習(xí)需要頻繁的推送鏡像到 DockerHub 和拉取鏡像到 k8s 集群中,為了優(yōu)化網(wǎng)絡(luò)速度,我們選擇先在 golang:1.16-buster 中將上述 Go 代碼編譯成二進(jìn)制文件,再將二進(jìn)制文件復(fù)制到 base-debian10 鏡像中運(yùn)行 (Dockerfile 不理解沒(méi)有關(guān)系,不影響后續(xù)學(xué)習(xí))。
這樣我們可以將 300MB 大小的鏡像變成只有 20MB 的鏡像,甚至壓縮上傳到 DockerHub 后大小只有 10MB!
# Dockerfile FROM golang:1.16-buster AS builder RUN mkdir /src ADD . /src WORKDIR /src RUN go env -w GO111MODULE=auto RUN go build -o main . FROM gcr.io/distroless/base-debian10 WORKDIR / COPY --from=builder /src/main /main EXPOSE 3000 ENTRYPOINT ["/main"]
需要注意 main.go 文件需要和 Dockerfile 文件在同一個(gè)目錄下,執(zhí)行下方 docker build 命令,第一次需要耐心等待拉取基礎(chǔ)鏡像。并且需要注意將命令中 guangzhengli 替換成自己的 DockerHub 注冊(cè)的賬號(hào)名稱。 這樣我們后續(xù)可以推送鏡像到自己注冊(cè)的 DockerHub 倉(cāng)庫(kù)當(dāng)中。
docker build . -t guangzhengli/hellok8s:v1 # Step 1/11 : FROM golang:1.16-buster AS builder # ... # ... # Step 11/11 : ENTRYPOINT ["/main"] # Successfully tagged guangzhengli/hellok8s:v1 docker images # guangzhengli/hellok8s v1 f956e8cf7d18 8 days ago 25.4MB
docker build 命令完成后我們可以通過(guò) docker images 命令查看鏡像是否 build 成功,最后我們執(zhí)行 docker run 命令將容器啟動(dòng), -p 指定 3000 作為端口,-d 指定容器后臺(tái)運(yùn)行。
docker run -p 3000:3000 --name hellok8s -d guangzhengli/hellok8s:v1
運(yùn)行成功后,可以通過(guò)瀏覽器或者 curl 來(lái)訪問(wèn) http://127.0.0.1:3000 , 查看是否成功返回字符串 [v1] Hello, Kubernetes!。
這里因?yàn)槲冶镜刂挥?Docker CLI,而 docker runtime 是使用 minikube,所以我需要先調(diào)用 minikube ip 來(lái)返回 minikube IP 地址,例如返回了 192.168.59.100,所以我需要訪問(wèn) http://192.168.59.100:3000 來(lái)判斷是否成功返回字符串 [v1] Hello, Kubernetes!。
最后確認(rèn)沒(méi)有問(wèn)題,使用 docker push 將鏡像上傳到遠(yuǎn)程的 DockerHub 倉(cāng)庫(kù)當(dāng)中,這樣可以供他人下載使用,也方便后續(xù) Minikube 下載鏡像使用。 需要注意將 guangzhengli 替換成自己的 DockerHub 賬號(hào)名稱。
docker push guangzhengli/hellok8s:v1
經(jīng)過(guò)這一節(jié)的練習(xí),有沒(méi)有對(duì)容器的強(qiáng)大有一個(gè)初步的認(rèn)識(shí)呢?可以想象當(dāng)你想部署一個(gè)更復(fù)雜的服務(wù)時(shí),例如 Nginx,MySQL,Redis。你只需要到 DockerHub 搜索 中搜索對(duì)應(yīng)的鏡像,通過(guò) docker pull 下載鏡像,docker run 啟動(dòng)服務(wù)即可!而無(wú)需關(guān)心依賴和各種配置
到此這篇關(guān)于k8s手動(dòng)拉取docker鏡像的方法示例的文章就介紹到這了,更多相關(guān)k8s手動(dòng)拉取docker鏡像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker部署Prometheus的實(shí)現(xiàn)示例
Prometheus是一款開源的監(jiān)控和告警工具,它可以收集系統(tǒng)的各種指標(biāo)數(shù)據(jù),如CPU使用率、內(nèi)存使用量等,本文主要介紹了Docker部署Prometheus的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-08-08使用docker?compose快速配置一組容器服務(wù)詳解
這篇文章主要為大家介紹了使用docker-?compose快速配置一組容器服務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11在 docker 之間導(dǎo)出導(dǎo)入鏡像的方法
本篇文章主要介紹了在 docker 之間導(dǎo)出導(dǎo)入鏡像的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07docker搭建本地私有倉(cāng)庫(kù)的實(shí)現(xiàn)
有時(shí)候使用Docker Hub這樣的公共倉(cāng)庫(kù)可能不方便,這種情況下用戶可以使用registry創(chuàng)建一個(gè)本地倉(cāng)庫(kù)供私人使用,本文主要介紹了docker搭建本地私有倉(cāng)庫(kù)的實(shí)現(xiàn),感興趣的可以了解一下2023-12-12Docker教程之Ubuntu 安裝 Docker詳細(xì)介紹
這篇文章主要介紹了Docker教程之Ubuntu 安裝 Docker詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-12-12解決docker加載新的鏡像后repository和tag名稱都為none的問(wèn)題
這篇文章主要介紹了解決docker加載新的鏡像后repository和tag名稱都為none的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11