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

常用容器鏡像構建工具和方案介紹

云計算
在使用 Docker 的時候一般情況下我們都會直接使用 docker build 來構建鏡像,切換到 Containerd 的時候,接下來我們就來介紹下在 Containerd 容器運行時下面鏡像構建的主要工具和方案。

[[420216]]

在使用 Docker 的時候一般情況下我們都會直接使用 docker build 來構建鏡像,切換到 Containerd 的時候,上節我們也介紹了可以使用 nerdctl + buildkit 來構建容器鏡像,除了這些方式之外,還有其他常見的鏡像構建工具嗎?

接下來我們就來介紹下在 Containerd 容器運行時下面鏡像構建的主要工具和方案。

使用 Docker 做鏡像構建服務

在 Kubernetes 集群中,部分 CI/CD 流水線業務可能需要使用 Docker 來提供鏡像打包服務??赏ㄟ^宿主機的 Docker 實現,將 Docker 的 UNIX Socket(/var/run/docker.sock) 通過 hostPath 掛載到 CI/CD 的業務 Pod 中,之后在容器里通過 UNIX Socket 來調用宿主機上的 Docker 進行構建,這個就是之前我們使用較多的 Docker outside of Docker 方案。該方式操作簡單,比真正意義上的 Docker in Docker 更節省資源,但該方式可能會遇到以下問題:

  • 無法運行在 Runtime 是 containerd 的集群中。
  • 如果不加以控制,可能會覆蓋掉節點上已有的鏡像。
  • 在需要修改 Docker Daemon 配置文件的情況下,可能會影響到其他業務。
  • 在多租戶的場景下并不安全,當擁有特權的 Pod 獲取到 Docker 的 UNIX Socket 之后,Pod 中的容器不僅可以調用宿主機的 Docker 構建鏡像、刪除已有鏡像或容器,甚至可以通過 docker exec 接口操作其他容器。

對于部分需要 containerd 集群,而不改變 CI/CD 業務流程仍使用 Docker 構建鏡像一部分的場景,我們可以通過在原有 Pod 上添加 DinD 容器作為 Sidecar 或者使用 DaemonSet 在節點上部署專門用于構建鏡像的 Docker 服務。

使用 DinD 作為 Pod 的 Sidecar

如下所示,我們有一個名為 clean-ci 的容器,會該容器添加一個 Sidecar 容器,配合 emptyDir,讓 clean-ci 容器可以通過 UNIX Socket 訪問 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: {} 

通過上面添加的 dind 容器來提供 dockerd

服務,然后在業務構建容器中通過 emptyDir{} 來共享 /var/run 目錄,業務容器中的 docker 客戶端就可以通過 unix:///var/run/docker.sock 來與 dockerd 進行通信。

使用 DaemonSet 在每個 containerd 節點上部署 Docker除了上面的 Sidecar 模式之外,還可以直接在 containerd 集群中通過 DaemonSet 來部署 Docker,然后業務構建的容器就和之前使用的模式一樣,直接通過 hostPath 掛載宿主機的 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 會在每個節點上運行一個 dockerd 服務,這其實就類似于將以前的 docker 服務放入到了 Kubernetes 集群中進行管理,然后其他的地方和之前沒什么區別,甚至都不需要更改以前方式的任何東西。將業務構建 Pod 與 DaemonSet 共享同一個 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 開源的一款容器鏡像構建工具,可以在容器或 Kubernetes 集群內從 Dockerfile 構建容器鏡像,Kaniko 構建容器鏡像時并不依賴于 docker daemon,也不需要特權模式,而是完全在用戶空間中執行 Dockerfile 中的每條命令,這使得在無法輕松或安全地運行 docker daemon 的環境下構建容器鏡像成為了可能。 

kaniko

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

Kaniko executor 讀取 Dockerfile 后會逐條解析 Dockerfile 內容,一條條執行命令,每一條命令執行完以后會在用戶空間下面創建一個 snapshot,并與存儲與內存中的上一個狀態進行比對,如果有變化,就將新的修改生成一個鏡像層添加在基礎鏡像上,并且將相關的修改信息寫入鏡像元數據中,等所有命令執行完,kaniko 會將最終鏡像推送到指定的遠端鏡像倉庫。。整個過程中,完全不依賴于 docker daemon。

如下所示我們有一個簡單的 Dokerfile 示例:

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

然后我們可以啟動一個 kaniko 容器去完成上面的鏡像構建,當然也可以直接在 Kubernetes 集群中去運行,如下所示新建一個 kaniko 的 Pod 來構建上面的鏡像:

  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 執行的 args 參數中,主要就是指定 kaniko 運行時需要的三個參數: Dockerfile、構建上下文以及遠端鏡像倉庫。

推送至指定遠端鏡像倉庫需要 credential 的支持,所以需要將 credential 以 secret 的方式掛載到 /kaniko/.docker/ 這個目錄下,文件名稱為 config.json,內容如下:

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

其中 auth 的值為: docker_registry_username:docker_registry_password base64 編碼過后的值。然后 Dockerfile 通過 Configmap 的形式掛載進去,如果構建上下文中還有其他內容也需要一同掛載進去。

關于 kaniko 的更多使用方式可以參考官方倉庫:https://github.com/GoogleContainerTools/kaniko。

Jib

如果你是在 Java 環境下面,還可以使用 Jib 來構建鏡像,Jib 也是 Google 開源的,只是是針對 Java 容器鏡像構建的工具。

Jib

通過使用 Jib,Java 開發人員可以使用他們熟悉的 Java 工具來構建鏡像。Jib 是一個快速而簡單的容器鏡像構建工具,它負責處理將應用程序打包到容器鏡像中所需的所有步驟,它不需要你編寫 Dockerfile 或安裝 Docker,而且可以直接集成到 Maven 和 Gradle 中,只需要將插件添加到構建中,就可以立即將 Java 應用程序容器化。

Jib 利用了 Docker 鏡像的分層機制,將其與構建系統集成,并通過以下方式優化 Java 容器鏡像的構建:

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

以下示例將使用 Jib 提供的 gradle 插件集成到一個 spring boot 項目的構建中,并展示 Jib 如何簡單快速的構建鏡像。

首先,在項目的 build.gradle 構建文件中引入 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' 

如果需要配置相關參數,可以使用下面的 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.     } 

然后執行以下命令就可以直接觸發構建生成容器鏡像了:

  1. # 構建 jib.to.image 指定的鏡像,并且推送至鏡像倉庫 
  2. $ gradle jib 

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

  1. gradle jibDockerBuild 

當然還有前文我們介紹的 buildkit 可以用于鏡像構建,還有一個經常和 Podman 搭配使用的 Buildah,是一個可以用于構建符合 OCI 標準容器鏡像的命令行工具,有了這些工具,在構建容器鏡像時已經完全可以脫離 docker daemon 了,而且這些工具都能很好的與 Kubernetes 集成,支持在容器環境下完成構建。

 

責任編輯:姜華 來源: k8s技術圈
相關推薦

2010-02-03 15:09:13

Python 構建工具

2016-01-31 09:47:13

Java程序員構建工具

2024-06-04 22:04:39

2023-08-22 10:13:53

模塊工具JavaScrip

2023-03-15 23:59:13

前端構建工具

2020-09-07 14:40:20

Vue.js構建工具前端

2019-09-10 13:34:30

Linux操作系統軟件

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

2011-12-30 09:23:25

JavaPhing

2022-05-16 09:14:28

前端構建工具

2021-06-05 18:01:05

工具Rollup前端

2016-11-17 16:38:14

華為計算平臺

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

開源buildah工具

2019-05-22 15:36:22

Linux容器鏡像
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产毛片毛片 | 国产精品国产三级国产aⅴ中文 | 中文福利视频 | 欧美国产一区二区 | 一本岛道一二三不卡区 | 久久一二区 | 在线免费看黄 | 在线精品亚洲欧美日韩国产 | 精品亚洲视频在线 | 精品一区二区三区四区 | 国产成人一区二区三区电影 | 亚洲美女网站 | 欧美一区不卡 | 亚洲国产成人精品久久久国产成人一区 | 在线观看视频亚洲 | 日韩一区中文字幕 | 免费精品| 免费一区在线 | 在线视频一区二区三区 | 极情综合网| 成人在线观看免费观看 | 色综合一区二区 | 天天射网站 | 一区二区欧美在线 | 久久久久国产精品免费免费搜索 | 在线免费观看a级片 | 亚洲一区二区三区免费观看 | 四虎最新视频 | 色狠狠一区 | 成人网在线观看 | 日韩一区二区三区视频 | 亚洲精品白浆高清久久久久久 | 日韩精品视频在线 | 国产精品特级片 | 91成人精品 | 精品国产不卡一区二区三区 | 精品久久九九 | 91av免费看 | 国产一区欧美 | 国产999精品久久久久久 | 亚洲综合色视频在线观看 |