成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

常用容器鏡像構(gòu)建工具和方案介紹

云計(jì)算
在使用 Docker 的時(shí)候一般情況下我們都會(huì)直接使用 docker build 來(lái)構(gòu)建鏡像,切換到 Containerd 的時(shí)候,接下來(lái)我們就來(lái)介紹下在 Containerd 容器運(yùn)行時(shí)下面鏡像構(gòu)建的主要工具和方案。

[[420216]]

在使用 Docker 的時(shí)候一般情況下我們都會(huì)直接使用 docker build 來(lái)構(gòu)建鏡像,切換到 Containerd 的時(shí)候,上節(jié)我們也介紹了可以使用 nerdctl + buildkit 來(lái)構(gòu)建容器鏡像,除了這些方式之外,還有其他常見(jiàn)的鏡像構(gòu)建工具嗎?

接下來(lái)我們就來(lái)介紹下在 Containerd 容器運(yùn)行時(shí)下面鏡像構(gòu)建的主要工具和方案。

使用 Docker 做鏡像構(gòu)建服務(wù)

在 Kubernetes 集群中,部分 CI/CD 流水線業(yè)務(wù)可能需要使用 Docker 來(lái)提供鏡像打包服務(wù)。可通過(guò)宿主機(jī)的 Docker 實(shí)現(xiàn),將 Docker 的 UNIX Socket(/var/run/docker.sock) 通過(guò) hostPath 掛載到 CI/CD 的業(yè)務(wù) Pod 中,之后在容器里通過(guò) UNIX Socket 來(lái)調(diào)用宿主機(jī)上的 Docker 進(jìn)行構(gòu)建,這個(gè)就是之前我們使用較多的 Docker outside of Docker 方案。該方式操作簡(jiǎn)單,比真正意義上的 Docker in Docker 更節(jié)省資源,但該方式可能會(huì)遇到以下問(wèn)題:

  • 無(wú)法運(yùn)行在 Runtime 是 containerd 的集群中。
  • 如果不加以控制,可能會(huì)覆蓋掉節(jié)點(diǎn)上已有的鏡像。
  • 在需要修改 Docker Daemon 配置文件的情況下,可能會(huì)影響到其他業(yè)務(wù)。
  • 在多租戶的場(chǎng)景下并不安全,當(dāng)擁有特權(quán)的 Pod 獲取到 Docker 的 UNIX Socket 之后,Pod 中的容器不僅可以調(diào)用宿主機(jī)的 Docker 構(gòu)建鏡像、刪除已有鏡像或容器,甚至可以通過(guò) docker exec 接口操作其他容器。

對(duì)于部分需要 containerd 集群,而不改變 CI/CD 業(yè)務(wù)流程仍使用 Docker 構(gòu)建鏡像一部分的場(chǎng)景,我們可以通過(guò)在原有 Pod 上添加 DinD 容器作為 Sidecar 或者使用 DaemonSet 在節(jié)點(diǎn)上部署專門(mén)用于構(gòu)建鏡像的 Docker 服務(wù)。

使用 DinD 作為 Pod 的 Sidecar

如下所示,我們有一個(gè)名為 clean-ci 的容器,會(huì)該容器添加一個(gè) Sidecar 容器,配合 emptyDir,讓 clean-ci 容器可以通過(guò) UNIX Socket 訪問(wèn) DinD 容器:

  1. apiVersion: v1 
  2. kind: Pod 
  3. metadata: 
  4.   name: clean-ci 
  5. spec: 
  6.   containers: 
  7.   - name: dind 
  8.     image: 'docker:stable-dind' 
  9.     command: 
  10.     - dockerd 
  11.     - --host=unix:///var/run/docker.sock 
  12.     - --host=tcp://0.0.0.0:8000 
  13.     securityContext: 
  14.       privileged: true 
  15.     volumeMounts: 
  16.     - mountPath: /var/run 
  17.       name: cache-dir 
  18.   - name: clean-ci 
  19.     image: 'docker:stable' 
  20.     command: ["/bin/sh"
  21.     args: ["-c""docker info >/dev/null 2>&1; while [ $? -ne 0 ] ; do sleep 3; docker info >/dev/null 2>&1; done; docker pull library/busybox:latest; docker save -o busybox-latest.tar library/busybox:latest; docker rmi library/busybox:latest; while true; do sleep 86400; done"
  22.     volumeMounts: 
  23.     - mountPath: /var/run 
  24.       name: cache-dir 
  25.   volumes: 
  26.   - name: cache-dir 
  27.     emptyDir: {} 

通過(guò)上面添加的 dind 容器來(lái)提供 dockerd

服務(wù),然后在業(yè)務(wù)構(gòu)建容器中通過(guò) emptyDir{} 來(lái)共享 /var/run 目錄,業(yè)務(wù)容器中的 docker 客戶端就可以通過(guò) unix:///var/run/docker.sock 來(lái)與 dockerd 進(jìn)行通信。

使用 DaemonSet 在每個(gè) containerd 節(jié)點(diǎn)上部署 Docker除了上面的 Sidecar 模式之外,還可以直接在 containerd 集群中通過(guò) DaemonSet 來(lái)部署 Docker,然后業(yè)務(wù)構(gòu)建的容器就和之前使用的模式一樣,直接通過(guò) hostPath 掛載宿主機(jī)的 unix:///var/run/docker.sock 文件即可。

使用以下 YAML 部署 DaemonSet。示例如下:

  1. apiVersion: apps/v1 
  2. kind: DaemonSet 
  3. metadata: 
  4.   name: docker-ci 
  5. spec: 
  6.   selector: 
  7.     matchLabels: 
  8.       app: docker-ci 
  9.   template: 
  10.     metadata: 
  11.       labels: 
  12.         app: docker-ci 
  13.     spec: 
  14.       containers: 
  15.       - name: docker-ci 
  16.         image: 'docker:stable-dind' 
  17.         command: 
  18.         - dockerd 
  19.         - --host=unix:///var/run/docker.sock 
  20.         - --host=tcp://0.0.0.0:8000 
  21.         securityContext: 
  22.           privileged: true 
  23.         volumeMounts: 
  24.         - mountPath: /var/run 
  25.           name: host 
  26.       volumes: 
  27.       - name: host 
  28.         hostPath: 
  29.           path: /var/run 

上面的 DaemonSet 會(huì)在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè) dockerd 服務(wù),這其實(shí)就類似于將以前的 docker 服務(wù)放入到了 Kubernetes 集群中進(jìn)行管理,然后其他的地方和之前沒(méi)什么區(qū)別,甚至都不需要更改以前方式的任何東西。將業(yè)務(wù)構(gòu)建 Pod 與 DaemonSet 共享同一個(gè) hostPath,如下所示:

  1. apiVersion: v1 
  2. kind: Pod 
  3. metadata: 
  4.   name: clean-ci 
  5. spec: 
  6.   containers: 
  7.   - name: clean-ci 
  8.     image: 'docker:stable' 
  9.     command: ["/bin/sh"
  10.     args: ["-c""docker info >/dev/null 2>&1; while [ $? -ne 0 ] ; do sleep 3; docker info >/dev/null 2>&1; done; docker pull library/busybox:latest; docker save -o busybox-latest.tar library/busybox:latest; docker rmi library/busybox:latest; while true; do sleep 86400; done"
  11.     volumeMounts: 
  12.     - mountPath: /var/run 
  13.       name: host 
  14.   volumes: 
  15.   - name: host 
  16.     hostPath: 
  17.       path: /var/run 

Kaniko

Kaniko 是 Google 開(kāi)源的一款容器鏡像構(gòu)建工具,可以在容器或 Kubernetes 集群內(nèi)從 Dockerfile 構(gòu)建容器鏡像,Kaniko 構(gòu)建容器鏡像時(shí)并不依賴于 docker daemon,也不需要特權(quán)模式,而是完全在用戶空間中執(zhí)行 Dockerfile 中的每條命令,這使得在無(wú)法輕松或安全地運(yùn)行 docker daemon 的環(huán)境下構(gòu)建容器鏡像成為了可能。 

kaniko

Kaniko 構(gòu)建容器鏡像時(shí),需要使用 Dockerfile、構(gòu)建上下文、以及構(gòu)建成功后鏡像在倉(cāng)庫(kù)中的存放地址。此外 Kaniko 支持多種方式將構(gòu)建上下文掛載到容器中,比如可以使用本地文件夾、GCS bucket、S3 bucket 等方式,使用 GCS 或者 S3 時(shí)需要把上下文壓縮為 tar.gz,kaniko 會(huì)自行在構(gòu)建時(shí)解壓上下文。

Kaniko executor 讀取 Dockerfile 后會(huì)逐條解析 Dockerfile 內(nèi)容,一條條執(zhí)行命令,每一條命令執(zhí)行完以后會(huì)在用戶空間下面創(chuàng)建一個(gè) snapshot,并與存儲(chǔ)與內(nèi)存中的上一個(gè)狀態(tài)進(jìn)行比對(duì),如果有變化,就將新的修改生成一個(gè)鏡像層添加在基礎(chǔ)鏡像上,并且將相關(guān)的修改信息寫(xiě)入鏡像元數(shù)據(jù)中,等所有命令執(zhí)行完,kaniko 會(huì)將最終鏡像推送到指定的遠(yuǎn)端鏡像倉(cāng)庫(kù)。。整個(gè)過(guò)程中,完全不依賴于 docker daemon。

如下所示我們有一個(gè)簡(jiǎn)單的 Dokerfile 示例:

  1. FROM alpine:latest 
  2. RUN apk add busybox-extras curl 
  3. CMD ["echo","Hello Kaniko"

然后我們可以啟動(dòng)一個(gè) kaniko 容器去完成上面的鏡像構(gòu)建,當(dāng)然也可以直接在 Kubernetes 集群中去運(yùn)行,如下所示新建一個(gè) kaniko 的 Pod 來(lái)構(gòu)建上面的鏡像:

  1. apiVersion: v1 
  2. kind: Pod 
  3. metadata: 
  4.   name: kaniko 
  5. spec: 
  6.   containers: 
  7.   - name: kaniko 
  8.     image: gcr.io/kaniko-project/executor:latest 
  9.     args: ["--dockerfile=/workspace/Dockerfile"
  10.           "--context=/workspace/"
  11.           "--destination=cnych/kaniko-test:v0.0.1"
  12.     volumeMounts: 
  13.       - name: kaniko-secret 
  14.         mountPath: /kaniko/.docker 
  15.       - name: dockerfile 
  16.         mountPath: /workspace/Dockerfile 
  17.         subPath: Dockerfile 
  18.   volumes: 
  19.     - name: dockerfile 
  20.       configMap: 
  21.         name: dockerfile 
  22.     - name: kaniko-secret 
  23.         projected: 
  24.          sources: 
  25.          - secret: 
  26.             name: regcred 
  27.             items: 
  28.             - key: .dockerconfigjson 
  29.               path: config.json 

上面的 Pod 執(zhí)行的 args 參數(shù)中,主要就是指定 kaniko 運(yùn)行時(shí)需要的三個(gè)參數(shù): Dockerfile、構(gòu)建上下文以及遠(yuǎn)端鏡像倉(cāng)庫(kù)。

推送至指定遠(yuǎn)端鏡像倉(cāng)庫(kù)需要 credential 的支持,所以需要將 credential 以 secret 的方式掛載到 /kaniko/.docker/ 這個(gè)目錄下,文件名稱為 config.json,內(nèi)容如下:

  1.     "auths": { 
  2.         "https://index.docker.io/v1/": { 
  3.             "auth""AbcdEdfgEdggds=" 
  4.        } 
  5.     } 
  6.  

其中 auth 的值為: docker_registry_username:docker_registry_password base64 編碼過(guò)后的值。然后 Dockerfile 通過(guò) Configmap 的形式掛載進(jìn)去,如果構(gòu)建上下文中還有其他內(nèi)容也需要一同掛載進(jìn)去。

關(guān)于 kaniko 的更多使用方式可以參考官方倉(cāng)庫(kù):https://github.com/GoogleContainerTools/kaniko。

Jib

如果你是在 Java 環(huán)境下面,還可以使用 Jib 來(lái)構(gòu)建鏡像,Jib 也是 Google 開(kāi)源的,只是是針對(duì) Java 容器鏡像構(gòu)建的工具。

Jib

通過(guò)使用 Jib,Java 開(kāi)發(fā)人員可以使用他們熟悉的 Java 工具來(lái)構(gòu)建鏡像。Jib 是一個(gè)快速而簡(jiǎn)單的容器鏡像構(gòu)建工具,它負(fù)責(zé)處理將應(yīng)用程序打包到容器鏡像中所需的所有步驟,它不需要你編寫(xiě) Dockerfile 或安裝 Docker,而且可以直接集成到 Maven 和 Gradle 中,只需要將插件添加到構(gòu)建中,就可以立即將 Java 應(yīng)用程序容器化。

Jib 利用了 Docker 鏡像的分層機(jī)制,將其與構(gòu)建系統(tǒng)集成,并通過(guò)以下方式優(yōu)化 Java 容器鏡像的構(gòu)建:

  • 簡(jiǎn)單:Jib 使用 Java 開(kāi)發(fā),并作為 Maven 或 Gradle 的一部分運(yùn)行。你不需要編寫(xiě) Dockerfile 或運(yùn)行 Docker 守護(hù)進(jìn)程,甚至無(wú)需創(chuàng)建包含所有依賴的大 JAR 包。因?yàn)?Jib 與 Java 構(gòu)建過(guò)程緊密集成,所以它可以訪問(wèn)到打包應(yīng)用程序所需的所有信息。
  • 快速:Jib 利用鏡像分層和緩存來(lái)實(shí)現(xiàn)快速、增量的構(gòu)建。它讀取你的構(gòu)建配置,將你的應(yīng)用程序組織到不同的層(依賴項(xiàng)、資源、類)中,并只重新構(gòu)建和推送發(fā)生變更的層。在項(xiàng)目進(jìn)行快速迭代時(shí),Jib 只將發(fā)生變更的層(而不是整個(gè)應(yīng)用程序)推送到鏡像倉(cāng)庫(kù)來(lái)節(jié)省寶貴的構(gòu)建時(shí)間。
  • 可重現(xiàn):Jib 支持根據(jù) Maven 和 Gradle 的構(gòu)建元數(shù)據(jù)進(jìn)行聲明式的容器鏡像構(gòu)建,因此,只要輸入保持不變,就可以通過(guò)配置重復(fù)創(chuàng)建相同的鏡像。

以下示例將使用 Jib 提供的 gradle 插件集成到一個(gè) spring boot 項(xiàng)目的構(gòu)建中,并展示 Jib 如何簡(jiǎn)單快速的構(gòu)建鏡像。

首先,在項(xiàng)目的 build.gradle 構(gòu)建文件中引入 jib 插件:

  1. buildscript{ 
  2.     ... 
  3.     dependencies { 
  4.         ... 
  5.         classpath "gradle.plugin.com.google.cloud.tools:jib-gradle-plugin:1.1.2" 
  6.     } 
  7.  
  8. apply plugin: 'com.google.cloud.tools.jib' 

如果需要配置相關(guān)參數(shù),可以使用下面的 gradle 配置:

  1. jib { 
  2.     from { 
  3.         image = 'harbor.k8s.local/library/base:1.0' 
  4.         auth { 
  5.             username = '********' 
  6.             password = '********' 
  7.         } 
  8.     } 
  9.     to { 
  10.         image = 'harbor.k8s.local/library/xxapp:1.0' 
  11.         auth { 
  12.             username = '********' 
  13.             password = '********' 
  14.         } 
  15.     } 
  16.     container { 
  17.         jvmFlags = ['-Djava.security.egd=file:/dev/./urandom'
  18.         ports = ['8080'
  19.         useCurrentTimestamp = false 
  20.         workingDirectory = "/app" 
  21.     } 

然后執(zhí)行以下命令就可以直接觸發(fā)構(gòu)建生成容器鏡像了:

  1. # 構(gòu)建 jib.to.image 指定的鏡像,并且推送至鏡像倉(cāng)庫(kù) 
  2. $ gradle jib 

如果你還想將構(gòu)建的鏡像保存到本地 dockerd,則可以使用下面的命令構(gòu)建:

  1. gradle jibDockerBuild 

當(dāng)然還有前文我們介紹的 buildkit 可以用于鏡像構(gòu)建,還有一個(gè)經(jīng)常和 Podman 搭配使用的 Buildah,是一個(gè)可以用于構(gòu)建符合 OCI 標(biāo)準(zhǔn)容器鏡像的命令行工具,有了這些工具,在構(gòu)建容器鏡像時(shí)已經(jīng)完全可以脫離 docker daemon 了,而且這些工具都能很好的與 Kubernetes 集成,支持在容器環(huán)境下完成構(gòu)建。

 

責(zé)任編輯:姜華 來(lái)源: k8s技術(shù)圈
相關(guān)推薦

2010-02-03 15:09:13

Python 構(gòu)建工具

2016-01-31 09:47:13

Java程序員構(gòu)建工具

2024-06-04 22:04:39

2023-03-15 23:59:13

前端構(gòu)建工具

2023-08-22 10:13:53

模塊工具JavaScrip

2020-09-07 14:40:20

Vue.js構(gòu)建工具前端

2019-09-10 13:34:30

Linux操作系統(tǒng)軟件

2013-01-31 10:15:28

JavaScriptGrunt

2021-05-25 16:34:06

JavaScript前端

2021-05-31 17:37:26

ViteReactesbuild

2011-12-07 10:56:29

ApacheMakeJava

2022-05-16 09:14:28

前端構(gòu)建工具

2021-06-05 18:01:05

工具Rollup前端

2011-12-30 09:23:25

JavaPhing

2016-11-17 16:38:14

華為計(jì)算平臺(tái)

2022-01-17 07:50:36

Maven Gradle 工具

2020-04-23 08:55:01

LinuxGradle工具

2025-03-26 01:00:00

2022-11-30 21:32:23

開(kāi)源buildah工具

2019-05-22 15:36:22

Linux容器鏡像
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产欧美一区二区精品久导航 | 一区二区三区免费 | www.青青草| 日本在线观看网址 | 亚洲国产成人精品女人久久久 | 国产日产久久高清欧美一区 | 色爱区综合 | 青娱乐一区二区 | 国产目拍亚洲精品99久久精品 | 欧美 中文字幕 | 古典武侠第一页久久777 | 日韩高清国产一区在线 | 国产精品美女久久久久aⅴ国产馆 | 亚洲视频区 | 九九热在线视频 | 国产精品色 | www.欧美视频 | 久久久久久国模大尺度人体 | 国产精品一区网站 | 精品欧美一区免费观看α√ | 久久精品这里精品 | 成人影音 | 男女一区二区三区 | 毛片一区二区三区 | 91免费版在线观看 | 日韩一二区 | 中文字幕1区2区3区 日韩在线视频免费观看 | 我我色综合 | 国产区第一页 | 久久久久久久久久久91 | 一区二区三区中文字幕 | 亚洲社区在线 | 亚洲网站在线观看 | 亚洲午夜精品一区二区三区他趣 | 日韩不卡一二区 | 午夜理伦三级理论三级在线观看 | 欧美在线观看一区 | 日日日日日日bbbbb视频 | 一级a性色生活片久久毛片 一级特黄a大片 | 国产精品无码专区在线观看 | 久久国产精品久久久久久 |