一般的なコンテナイメージ構築ツールとソリューションの紹介

一般的なコンテナイメージ構築ツールとソリューションの紹介

[[420216]]

Docker を使用する場合、通常は docker build を使用してイメージを直接ビルドします。 Containerd に切り替える場合、前のセクションで nerdctl + buildkit を使用してコンテナ イメージをビルドできることも紹介しました。これらの方法に加えて、他の一般的なイメージ構築ツールはありますか?

次に、Containerd コンテナ ランタイムでイメージを構築するための主なツールとソリューションを紹介します。

イメージ構築サービスにDockerを使用する

Kubernetes クラスターでは、一部の CI/CD パイプライン サービスでイメージ パッケージング サービスを提供するために Docker を使用する必要がある場合があります。これは、ホストマシンの Docker を通じて実現できます。 Docker UNIX ソケット (/var/run/docker.sock) は、hostPath を介して CI/CD ビジネス Pod にマウントされます。次に、コンテナ内の UNIX ソケットを介してホストマシン上の Docker が呼び出され、ビルドが行われます。これは、これまで頻繁に使用されてきた Docker 外部の Docker ソリューションです。この方法は操作が簡単で、Docker 内の実際の Docker よりも多くのリソースを節約できますが、次の問題が発生する可能性があります。

  • ランタイムが containerd であるクラスターでは実行できません。
  • 制御されない場合、ノード上の既存のイメージが上書きされる可能性があります。
  • Docker デーモン構成ファイルを変更する必要がある場合、他のサービスに影響が及ぶ可能性があります。
  • マルチテナントのシナリオでは安全ではありません。特権 Pod が Docker の UNIX ソケットを取得すると、Pod 内のコンテナはホストの Docker を呼び出してイメージを構築したり、既存のイメージやコンテナを削除したりできるだけでなく、docker exec インターフェースを介して他のコンテナを操作することもできます。

コンテナ クラスターが必要であるものの、CI/CD ビジネス プロセスを変更せずに Docker を使用してイメージの一部をビルドするシナリオでは、DinD コンテナをサイドカーとして元の Pod に追加したり、DaemonSet を使用してノード上にイメージをビルドするための Docker サービスをデプロイしたりできます。

DinD をポッドサイドカーとして使用する

以下に示すように、 clean-ci という名前のコンテナがあります。コンテナに Sidecar コンテナを追加し、emptyDir を使用して clean-ci コンテナが UNIX ソケット経由で DinD コンテナにアクセスできるようにします。

  1. APIバージョン: v1
  2. 種類: ポッド
  3. メタデータ:
  4. 名前: clean-ci
  5. 仕様:
  6. コンテナ:
  7. -名前: ディンド
  8. イメージ: 'docker:stable-dind'  
  9. 指示:
  10. -ドッカー
  11. - --host=unix:///var/run/docker.sock  
  12. - --host=tcp://0.0.0.0:8000  
  13. セキュリティコンテキスト:
  14. 特権: true  
  15. ボリュームマウント:
  16. - マウントパス: /var/run
  17. 名前: キャッシュディレクトリ
  18. -名前: clean-ci
  19. イメージ: 'docker:stable'  
  20. コマンド: [ "/bin/sh" ]
  21. 引数: [ "-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. ボリュームマウント:
  23. - マウントパス: /var/run
  24. 名前: キャッシュディレクトリ
  25. ボリューム:
  26. -名前: キャッシュディレクトリ
  27. 空ディレクトリ: {}

上記で追加したdindコンテナを通じてdockerdを提供する

サービス、そして業務構築コンテナ内のemptyDir{}を介して/var/runディレクトリを共有します。ビジネス コンテナー内の docker クライアントは、unix:///var/run/docker.sock を介して dockerd と通信できます。

DaemonSet を使用して、各 containerd ノードに Docker をデプロイします。上記のサイドカー モードに加えて、DaemonSet を介して Docker を containerd クラスターに直接デプロイすることもできます。すると、ビジネスによって構築されたコンテナは以前のモードと同じになります。ホストの unix:///var/run/docker.sock ファイルを hostPath 経由で直接マウントするだけです。

DaemonSet をデプロイするには、次の YAML を使用します。次に例を示します。

  1. APIバージョン: アプリ/v1
  2. 種類: DaemonSet
  3. メタデータ:
  4. 名前: docker-ci
  5. 仕様:
  6. セレクタ:
  7. 一致ラベル:
  8. アプリ: docker-ci
  9. テンプレート:
  10. メタデータ:
  11. ラベル:
  12. アプリ: docker-ci
  13. 仕様:
  14. コンテナ:
  15. -名前: docker-ci
  16. イメージ: 'docker:stable-dind'  
  17. 指示:
  18. -ドッカー
  19. - --host=unix:///var/run/docker.sock  
  20. - --host=tcp://0.0.0.0:8000  
  21. セキュリティコンテキスト:
  22. 特権: true  
  23. ボリュームマウント:
  24. -マウントパス: /var/run
  25. 名前: ホスト
  26. ボリューム:
  27. -名前: ホスト
  28. ホストパス:
  29. パス: /var/run

上記の DaemonSet は各ノードで dockerd サービスを実行します。これは、以前の docker サービスを Kubernetes クラスターに管理用に配置するのと似ています。残りは以前と変わらず、以前の方法で何かを変更する必要さえありません。以下に示すように、ビジネス ビルディング Pod と DaemonSet は同じ hostPath を共有します。

  1. APIバージョン: v1
  2. 種類: ポッド
  3. メタデータ:
  4. 名前: clean-ci
  5. 仕様:
  6. コンテナ:
  7. -名前: clean-ci
  8. イメージ: 'docker:stable'  
  9. コマンド: [ "/bin/sh" ]
  10. 引数: [ "-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. ボリュームマウント:
  12. -マウントパス: /var/run
  13. 名前: ホスト
  14. ボリューム:
  15. -名前: ホスト
  16. ホストパス:
  17. パス: /var/run

カニコ

Kaniko は、コンテナまたは Kubernetes クラスター内の Dockerfile からコンテナ イメージを構築できる、Google のオープンソース コンテナ イメージ構築ツールです。 Kaniko は、コンテナ イメージを構築するときに Docker デーモンに依存せず、特権モードも必要ありません。代わりに、Dockerfile 内の各コマンドを完全にユーザー空間で実行することで、Docker デーモンを簡単または安全に実行できない環境でもコンテナ イメージを構築できるようになります。

カニコ

Kaniko がコンテナ イメージをビルドするときは、Dockerfile、ビルド コンテキスト、およびビルドが成功した後のウェアハウス内のイメージのストレージ アドレスを使用する必要があります。さらに、Kaniko は、ローカル フォルダー、GCS バケット、S3 バケットなどを使用するなど、ビルド コンテキストをコンテナにマウントする複数の方法をサポートしています。GCS または S3 を使用する場合、コンテキストを tar.gz に圧縮する必要があり、Kaniko はビルド中にコンテキストを自動的に解凍します。

Dockerfile を読み取った後、Kaniko Executor は Dockerfile の内容を 1 つずつ解析し、コマンドを 1 つずつ実行します。各コマンドが実行されると、ユーザー スペースの下にスナップショットが作成され、ストレージとメモリ内の以前の状態と比較されます。変更があった場合、新しい変更がイメージ レイヤーとして生成され、ベース イメージに追加され、関連する変更情報がイメージ メタデータに書き込まれます。すべてのコマンドが実行されると、Kaniko は最終イメージを指定されたリモート イメージ リポジトリにプッシュします。 。プロセス全体は Docker デーモンから完全に独立しています。

以下に簡単な Dockerfile の例を示します。

  1. アルパイン:最新より
  2. apk add busybox-extras curlを実行します
  3. CMD [ "エコー" , "こんにちはカニコ" ]

次に、kaniko コンテナを起動して、上記のイメージの構築を完了します。もちろん、Kubernetes クラスター内で直接実行することもできます。以下に示すように、上記のイメージを構築するための新しい kaniko Pod を作成します。

  1. APIバージョン: v1
  2. 種類: ポッド
  3. メタデータ:
  4. 名前: かにこ
  5. 仕様:
  6. コンテナ:
  7. -名前:かにこ
  8. 画像: gcr.io/kaniko-project/executor:latest
  9. 引数: [ "--dockerfile=/workspace/Dockerfile" ,
  10. "--context=/ワークスペース/"
  11. "--destination=cnych/kaniko-test:v0.0.1" ]
  12. ボリュームマウント:
  13. -名前:カニコシークレット
  14. マウントパス: /kaniko/.docker
  15. -名前: dockerfile
  16. マウントパス: /workspace/Dockerfile
  17. サブパス: Dockerfile
  18. ボリューム:
  19. -名前: dockerfile
  20. 構成マップ:
  21. 名前: dockerfile
  22. -名前:カニコシークレット
  23. 予測:
  24. 出典:
  25. - 秘密:
  26. 名前: regcred
  27. アイテム:
  28. -キー: .dockerconfigjson
  29. パス: config.json

上記の Pod 実行の args パラメータは、主に kaniko の実行に必要な 3 つのパラメータ (Dockerfile、ビルド コンテキスト、リモート イメージ リポジトリ) を指定します。

指定されたリモート イメージ リポジトリにプッシュするには資格情報のサポートが必要なので、資格情報をシークレットとして /kaniko/.docker/ ディレクトリにマウントする必要があります。ファイル名はconfig.jsonで、内容は次のとおりです。

  1. {
  2. 「認証」 : {
  3. "https://index.docker.io/v1/" : {
  4. 「認証」 : 「AbcdEdfgEdg​​gds="  
  5. }
  6. }
  7.  
  8. }

auth の値は、docker_registry_username:docker_registry_password で、base64 でエンコードされた値です。その後、Dockerfile は Configmap としてマウントされます。ビルド コンテキストに他の何かがある場合は、それもマウントする必要があります。

kaniko の使用方法の詳細については、公式リポジトリ (https://github.com/GoogleContainerTools/kaniko) を参照してください。

ジブ

Java 環境の場合は、Jib を使用してイメージを構築することもできます。 Jib も Google のオープンソースですが、Java コンテナ イメージを構築するためのツールです。

ジブ

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. ビルドスクリプト{
  2. ...
  3. 依存関係 {
  4. ...
  5. クラスパス"gradle.plugin.com.google.cloud.tools:jib-gradle-plugin:1.1.2"  
  6. }
  7. }
  8.  
  9. プラグインを適用: 'com.google.cloud.tools.jib'  

関連するパラメータを設定する必要がある場合は、次の Gradle 設定を使用できます。

  1. ジブ {
  2. から{
  3. イメージ = 'harbor.k8s.local/library/base:1.0'  
  4. 認証{
  5. ユーザー名 = '********'  
  6. パスワード= '********'  
  7. }
  8. }
  9. {
  10. イメージ = 'harbor.k8s.local/library/xxapp:1.0'  
  11. 認証{
  12. ユーザー名 = '********'  
  13. パスワード= '********'  
  14. }
  15. }
  16. 容器 {
  17. jvmFlags = [ '-Djava.security.egd=file:/dev/./urandom' ]
  18. ポート = [ '8080' ]
  19. useCurrentTimestamp = false  
  20. 作業ディレクトリ = "/app"  
  21. }
  22. }

次に、次のコマンドを実行してビルドを直接トリガーし、コンテナ イメージを生成します。

  1. # jib で指定されたイメージをビルドします。 .image変更し、イメージリポジトリにプッシュします。
  2. $ gradle ジブ

ビルドしたイメージをローカルの dockerd に保存したい場合は、次のコマンドを使用してビルドできます。

  1. gradle jibDockerBuild

もちろん、前回の記事で紹介したイメージビルドに使用できるビルドキットもあります。 Podman と一緒によく使用される Buildah もあります。これは、OCI 標準に準拠したコンテナ イメージを構築するために使用できるコマンド ライン ツールです。これらのツールを使用すると、コンテナ イメージを構築するときに docker デーモンを完全に排除できます。さらに、これらのツールは Kubernetes と適切に統合され、コンテナ環境での構築をサポートします。

<<:  Longhorn クラウド ネイティブ コンテナ分散ストレージ - エアギャップ インストール

>>:  Docker イメージの削減: 1.43G から 22.4MB へ

推薦する

zgovps 日本大阪 EPYC パフォーマンス VPS シリーズのレビュー

zgovpsは、日本の大阪で高性能でソフトバンク回線を備えた日本のVPSを提供しています。Hostc...

深センのウェブサイト構築会社が良いかどうかはどうやって判断しますか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますはじめに:...

クラウドネイティブコンピューティング財団の第11回インキュベーションプロジェクトが卒業し、中国で誕生

中国で誕生した最初のインキュベーションプロジェクトであるHarborが、Cloud Native C...

#イースター# virpus-シアトル VPS/50% オフ/512M メモリ VPS 年間支払い 25 ドル

virpus は、イースター VPS プロモーションとして、Xen PVx 仮想化、1Gbps ポー...

毎日の話題:LeTVが華爾映画を買収し、垂直統合して業界チェーンを完成させる

ウェブマスターネットワーク(www.admin5.com)が10月9日に伝えたところによると、買収発...

中国におけるデジタル音楽著作権の恥ずかしさ:パイが十分に大きくない場合、どうやって分配すればよいのか?

陳漢慈ある日の午後、一杯のコーヒーを飲みながら、4時間以上にわたって、恒大音楽会社の社長である宋科は...

ウェブサイト構築における初心者ウェブマスターの「本末転倒」な考え方の簡単な分析

現在、ウェブマスターは少数の人だけが就く職業ではなくなりました。ますます多くの仲間が私たちの陣営に加...

草の根ウェブマスター、あなたには執行力がありますか?

今日、私は a5 の「草の根ウェブマスターのインターネット起業の鍵は実行力」という記事を見て、私たち...

分散ロックの複数の実装

現在、ほぼすべての大規模な Web サイトとアプリケーションは分散形式で展開されています。分散シナリ...

ウェブサイト最適化競合分析

新しく引き継いだウェブサイトでも、競合他社の調査でも、SEO データ分析は不可欠です。ウェブサイト分...

dedioutlet: Phoenix サーバー、月額 54 ドル、2*e5-2680v2/32g メモリ/256gSSD+1T HDD/100T トラフィック

dedioutletは2009年に設立されたアメリカの会社で、主に低価格のアメリカの独立サーバー事業...

胡先東氏が検索最適化の実用化について語る

5月25日、厦門でグローバル検索エンジン戦略会議が開催されました。Yousou Technology...

タオバオモバイルは12の印刷メディアと提携し、メディア電子商取引の分野をテストするためにタオバオを立ち上げた。

新浪科技は4月1日午前、アリババが本日、タオバオモバイルと全国12の主流新聞社との戦略的提携「馬商淘...

無料チャンネルで遊ぶ方法 - 3 か月で 30 万人のユーザーを獲得

新しいAPP製品が市場に参入するとき、短期間で最初のシード ユーザーをいかにして迅速に集めるかが、す...