本文為學(xué)習(xí)筆記手负,會(huì)隨著學(xué)習(xí)深入持續(xù)更新无牵,僅供參考
場景:簡化部署步驟飞蛹,通過docker打包組件鏡像實(shí)現(xiàn)快速部署谤狡,支持機(jī)器擴(kuò)展(打包前,請參考官方確認(rèn)是否建議用docker鏡像部署)
一桩皿、基本概念
Docker 容器化技術(shù)允許你將應(yīng)用程序及其所有依賴項(xiàng)打包到一個(gè)標(biāo)準(zhǔn)化的單元中豌汇,這個(gè)單元稱為 Docker 容器。容器提供了一個(gè)隔離的運(yùn)行環(huán)境泄隔,確保應(yīng)用程序可以在任何支持 Docker 的系統(tǒng)上運(yùn)行拒贱,而無需擔(dān)心底層環(huán)境的差異。
1佛嬉、分層文件系統(tǒng)
Docker 鏡像由多個(gè)只讀層組成逻澳,每一層都是對基礎(chǔ)層的增量更新。鏡像構(gòu)建過程中暖呕,每執(zhí)行一條指令就會(huì)創(chuàng)建一層斜做。容器運(yùn)行時(shí),會(huì)在鏡像之上添加一個(gè)可寫層湾揽。
2瓤逼、隔離與虛擬化
Docker 使用 Linux 內(nèi)核的 命名空間(Namespaces) 和 控制組(cgroups) 技術(shù)來實(shí)現(xiàn)容器的資源隔離和限制。命名空間提供了隔離的運(yùn)行環(huán)境库物,控制組則限制了容器能夠使用的資源霸旗。
3、網(wǎng)絡(luò)與存儲
Docker 提供了靈活的網(wǎng)絡(luò)配置選項(xiàng)戚揭,可以通過橋接模式诱告、主機(jī)模式、自定義網(wǎng)絡(luò)等方式配置容器網(wǎng)絡(luò)民晒。Docker 卷(Volumes)用于持久化存儲數(shù)據(jù)精居,使得數(shù)據(jù)可以在容器重啟或刪除后仍然保留。
二. Docker 鏡像的構(gòu)建過程
1潜必、編寫 Dockerfile
Dockerfile 是一個(gè)包含一系列指令的文本文件靴姿,這些指令定義了如何構(gòu)建 Docker 鏡像。每條指令都會(huì)在鏡像中創(chuàng)建一層磁滚,最終形成一個(gè)多層次的鏡像空猜。
示例 Dockerfile:
復(fù)制代碼# 使用一個(gè)基礎(chǔ)鏡像
FROM ubuntu:20.04
# 安裝所需的軟件包
RUN apt-get update && apt-get install -y python3
# 復(fù)制應(yīng)用程序代碼到鏡像中
COPY . /app
# 設(shè)置工作目錄
WORKDIR /app
# 指定容器啟動(dòng)時(shí)要運(yùn)行的命令
CMD ["python3", "app.py"]
2.構(gòu)建 Docker 鏡像
在包含 Dockerfile 的目錄中運(yùn)行以下命令來構(gòu)建鏡像:
docker build -t my-application:latest
這會(huì)創(chuàng)建一個(gè)名為 my-application 的 Docker 鏡像。
- Docker 鏡像的存儲與分發(fā)
本地存儲:構(gòu)建好的 Docker 鏡像存儲在本地 Docker 注冊表中,可以通過 docker images 命令查看辈毯。
推送到遠(yuǎn)程倉庫:為了在其他機(jī)器上使用鏡像,可以將其推送到遠(yuǎn)程鏡像倉庫搜贤,如 Docker Hub谆沃、AWS ECR 等。
docker tag my-application:latest your-dockerhub-username/my-application:latest
docker push your-dockerhub-username/my-application:latest
- 在其他機(jī)器上拉取與運(yùn)行 Docker 鏡像
拉取鏡像: 在另一臺機(jī)器上仪芒,從遠(yuǎn)程倉庫拉取鏡像:
docker pull your-dockerhub-username/my-application:latest
運(yùn)行容器: 使用拉取的鏡像啟動(dòng)容器:
docker run -d --name my-application-container your-dockerhub-username/my-application:latest
-d 參數(shù)表示容器在后臺運(yùn)行唁影,--name 參數(shù)為容器指定一個(gè)名稱。
三掂名、docker鏡像擴(kuò)展機(jī)器
1据沈、kafka集群打包docker鏡像
四、Kubernetes簡介
K8s是一個(gè)用于自動(dòng)化容器化應(yīng)用程序的部署饺蔑、擴(kuò)展和管理的開源平臺锌介。它能夠有效地管理 Docker 鏡像,并在集群中的多個(gè)節(jié)點(diǎn)上運(yùn)行和擴(kuò)展容器猾警。以下是 Kubernetes 管理 Docker 鏡像的基本原理和工作流程:
鏡像存儲與分發(fā)
容器鏡像倉庫:
Kubernetes 使用容器鏡像倉庫(如 Docker Hub孔祸、Google Container Registry、AWS ECR 等)來存儲和分發(fā) Docker 鏡像发皿。在部署應(yīng)用程序時(shí)崔慧,Kubernetes 會(huì)從指定的鏡像倉庫拉取所需的鏡像。配置和部署鏡像
Pod 和 Deployment:
在 Kubernetes 中穴墅,最小的可部署單元是 Pod惶室,一個(gè) Pod 可以包含一個(gè)或多個(gè)容器。為了方便管理和擴(kuò)展玄货,通常使用 Deployment 來定義和管理 Pod皇钞。
以下是一個(gè)簡單的 Deployment YAML 文件示例,用于部署一個(gè)基于 Docker 鏡像的應(yīng)用程序:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-application
spec:
replicas: 3
selector:
matchLabels:
app: my-application
template:
metadata:
labels:
app: my-application
spec:
containers:
- name: my-application-container
image: your-dockerhub-username/my-application:latest
ports:
- containerPort: 80
- 鏡像拉取策略
Kubernetes 支持多種鏡像拉取策略誉结,可以通過 imagePullPolicy 字段進(jìn)行配置:
Always:每次啟動(dòng) Pod 時(shí)總是拉取最新的鏡像鹅士。
IfNotPresent:如果本地沒有該鏡像則拉取,否則使用本地鏡像惩坑。
Never:只使用本地已有的鏡像掉盅,且不會(huì)嘗試?yán) ?br> 示例:
spec:
containers:
- name: my-application-container
image: your-dockerhub-username/my-application:latest
imagePullPolicy: Always
節(jié)點(diǎn)上的鏡像緩存
Kubernetes 集群中的每個(gè)節(jié)點(diǎn)都會(huì)運(yùn)行一個(gè)容器運(yùn)行時(shí)(如 Docker),該運(yùn)行時(shí)負(fù)責(zé)管理本地的鏡像緩存以舒。當(dāng)一個(gè) Pod 被調(diào)度到某個(gè)節(jié)點(diǎn)時(shí)趾痘,如果該節(jié)點(diǎn)上已經(jīng)存在所需的鏡像,則不會(huì)重新拉取鏡像蔓钟,從而加快啟動(dòng)速度永票。安全性與鏡像拉取憑據(jù)
對于私有鏡像倉庫,需要提供鏡像拉取憑據(jù)÷录可以通過創(chuàng)建 Kubernetes Secret 來存儲這些憑據(jù)键俱,并在 Pod 配置中引用它們。
創(chuàng)建 Secret:
kubectl create secret docker-registry myregistrykey --docker-server=myregistrydomain.com --docker-username=myusername --docker-password=mypassword --docker-email=myemail@example.com
在 Pod 配置中引用 Secret:
spec:
imagePullSecrets:
- name: myregistrykey
containers:
- name: my-application-container
image: myregistrydomain.com/my-application:latest
- 鏡像更新與滾動(dòng)更新
Kubernetes 的 Deployment 控制器支持滾動(dòng)更新世分,通過逐步替換舊版本的 Pod 來實(shí)現(xiàn)應(yīng)用程序無縫升級编振。
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
- 高可用與負(fù)載均衡
Kubernetes 使用 Service 來暴露一組 Pod,Service 提供了負(fù)載均衡和服務(wù)發(fā)現(xiàn)功能臭埋,使得應(yīng)用程序可以實(shí)現(xiàn)高可用踪央。
示例:
apiVersion: v1
kind: Service
metadata:
name: my-application-service
spec:
selector:
app: my-application
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
- 集群管理與調(diào)度
Kubernetes 的控制平面(Control Plane)負(fù)責(zé)整個(gè)集群的管理與調(diào)度,包括監(jiān)控節(jié)點(diǎn)狀態(tài)瓢阴、調(diào)度 Pod畅蹂、自動(dòng)擴(kuò)展等功能∪倏郑控制平面組件包括:
API Server:提供集群管理的 REST API 接口液斜。
Scheduler:負(fù)責(zé)將 Pod 調(diào)度到合適的節(jié)點(diǎn)。
Controller Manager:執(zhí)行各種控制循環(huán)募胃,如 Deployment 控制器旗唁、節(jié)點(diǎn)控制器等。
etcd:分布式鍵值存儲痹束,用于存儲集群狀態(tài)數(shù)據(jù)检疫。