このゲスト投稿は、Pulumi のソリューション アーキテクトである Diana Esteves によって寄稿されました。
Pulumi は、Docker を含むあらゆるクラウドまたは SaaS プロバイダー全体のリソース管理を簡素化する Infrastructure as Code (IaC) プラットフォームです。 Pulumi プロバイダー は、便利なツールやベンダーとの統合です。 Pulumi の新しい Docker ビルド プロバイダーは、ビルドをさらに簡単に、より速く、より信頼性の高いものにすることを目的としています。
この投稿では、Pulumi の新しい Docker Build プロバイダーが Docker Build Cloud と連携して、コンテナー化されたアプリケーションの構築、デプロイ、管理を合理化する方法について詳しく説明します。 まず、Docker Build Cloud と Pulumi を使用してプロジェクトをセットアップします。 次に、このプロバイダーを活用してビルドとデプロイのパイプラインを簡素化する方法を紹介する優れたユース ケースを探ります。
Pulumi Docker ビルド プロバイダーの機能
Pulumi Docker ビルド プロバイダーの主な機能は次のとおりです。
- Docker Build Cloud のサポート: ビルドをクラウドにオフロードし、ローカル リソースを解放します。 ビルドが速いということは、頭痛の種が少ないことを意味します。
- マルチプラットフォームのサポート: さまざまなハードウェアアーキテクチャで動作するDockerイメージを、汗をかくことなく構築できます。
- 高度なキャッシング: 冗長なビルドに別れを告げましょう。 Docker Build Cloudを使用するときに利用できる共有キャッシュに加えて、このプロバイダーは、Amazon S3、GitHub Actions、さらにはローカルディスクなどの複数のキャッシュバックエンドをサポートして、ビルドの効率を維持します。
- 柔軟なエクスポートオプション: Dockerイメージのビルド後の保存先をカスタマイズし、レジストリやファイルシステムなど、ワークフローに必要な場所にエクスポートできます。
Docker Build Cloud と Pulumi を使い始める
Docker Build Cloudは、Dockerの最新製品であり、クラウド内のAMDビルダーとArmビルダーのペアと共有キャッシュをチームに提供するため、イメージビルドが最大 39倍高速になります。 Docker Pro、Team、Business の各プランには、Build Cloud の分数が設定されています。 ( Docker プランの詳細については、価格ページを参照してください。
この例では、Docker Build Cloud ビルダーを使用して NGINX Dockerfile をビルドします。 Docker Build Cloud ビルダーを作成し、Typescript で Pulumi プログラムを作成し、イメージをビルドします。
前提 条件
- Docker Build Cloud の Docker 製品スイート (分)
- プルミCLI
- Pulumi Cloud アカウント (個々の無料利用枠で機能します)
- Pulumi がサポートする言語
ステップ 1: Docker Build Cloud ビルダーをセットアップする
イメージをローカルでビルドするということは、ローカルのコンピューティングとストレージの可用性に左右されることを意味します。 Pulumi を使用すると、ユーザーは Docker Build Cloud を使用してイメージをビルドできます。
Pulumi Docker Build プロバイダーは Docker Build Cloud を完全にサポートしており、個々のチーム メンバーまたは CI/CD パイプラインが、改善されたビルド速度、共有ビルド キャッシュ、ネイティブ マルチプラットフォーム ビルドを十分に活用できるため、新しい機能のロックを解除します。
それでもビルダーを作成する必要がある場合は、以下の手順に従ってください。それ以外の場合は、手順 1C に進みます。
A. Docker Build Cloud アカウントにログインします。
B. my-cool-builder という名前の新しいクラウド ビルダーを作成します。
C. ローカル マシンで、Docker アカウントにサインインします。
$ docker login
D. 既存のクラウドビルダーエンドポイントを追加します。
$ docker buildx create --driver cloud ORG/BUILDER_NAME
# Replace ORG with the Docker Hub namespace of your Docker organization.
# This creates a builder named cloud-ORG-BUILDER_NAME.
# Example:
$ docker buildx create --driver cloud pulumi/my-cool-builder
# cloud-pulumi-my-cool-builder
# check your new builder is configured
$ docker buildx ls
E. 必要に応じて、新しいビルダーが Docker Desktop で使用可能であることを確認します。
Docker Build Cloud の設定に関する追加のガイダンスについては、Docker のドキュメントを参照してください。
ステップ 2: Pulumi プロジェクトをセットアップする
最初の Pulumi プロジェクトを作成するには、まず Pulumi テンプレートを使用します。 Pulumi は、を介して Pulumi CLI pulumi new
と直接統合される何百もの テンプレート をキュレーションしています。特に、Pulumi チームは、Docker Build Cloud 用の Pulumi テンプレートを作成しました。
Pulumi プログラミング モデルは、一般的なプログラミング言語を使用してインフラストラクチャを定義することに重点を置いています。このアプローチでは、既存のプログラミングツールを活用し、ループや条件などの使い慣れた構文を使用してクラウドリソースを定義できます。
Pulumi テンプレートをローカルにコピーするには:
$ pulumi new https://github.com/pulumi/examples/tree/master/dockerbuildcloud-ts --dir hello-dbc
# project name: hello-dbc
# project description: (default)
# stack name: dev
# Note: Update the builder value to match yours
# builder: cloud-pulumi-my-cool-builder
$ cd hello-dbc
# update all npm packages (recommended)
$ npm update --save
必要に応じて、Pulumi プログラムを探索します。 この hello-dbc
フォルダーには、Pulumi を使用して Dockerfile をイメージにビルドするために必要なものがすべて含まれています。 Pulumi プログラムは、エントリ ポイント (通常は選択したプログラミング言語で記述された関数) から始まります。 この関数は、プロジェクトのインフラストラクチャ リソースと構成を定義します。 TypeScript の場合、そのファイルは index.ts
です。 そして、その内容を以下に示します。
import * as dockerBuild from "@pulumi/docker-build";
import * as pulumi from "@pulumi/pulumi";
const config = new pulumi.Config();
const builder = config.require("builder");
const image = new dockerBuild.Image("image", {
// Configures the name of your existing buildx builder to use.
// See the Pulumi.<stack>.yaml project file for the builder configuration.
builder: {
name: builder, // Example, "cloud-pulumi-my-cool-builder",
},
context: {
location: "app",
},
// Enable exec to run a custom docker-buildx binary with support
// for Docker Build Cloud (DBC).
exec: true,
push: false,
});
ステップ 3: Docker イメージをビルドする
pulumi up
コマンドを実行して、新しく構成されたビルダーでビルドされているイメージを確認します。
$ pulumi up --yes
ブラウザーのリンクをたどって Pulumi Cloud ダッシュボードに移動し、画像リソースに移動し、builder パラメーターに注意して適切に構成されていることを確認できます。
必要に応じて、Docker Build Cloud ダッシュボードでビルド時間の使用状況も確認します。
万丈! Docker Build Cloud と Pulumi を使用して NGINX Dockerfile を構築しました。 これは、新しい Docker Build Cloud ビルダーを作成し、それを Pulumi テンプレートに渡すことで実現されました。 その後、Pulumi CLI を使用して変更をデプロイします。
buildx と BuildKit を使用した高度なユースケース
一般的な buildx と BuildKit の機能を紹介するには、次の Pulumi コード サンプルの 1 つ以上をテストします。これらには、マルチプラットフォーム、高度なキャッシュ、およびエクスポートが含まれます。 各機能は、Pulumi Docker ビルド イメージ リソースの入力 (またはパラメーター) として使用できることに注意してください。
Docker Build Cloud のマルチプラットフォーム イメージ ビルド
Dockerイメージは複数のプラットフォームをサポートできるため、1つのイメージにアーキテクチャやオペレーティングシステムのバリアントが含まれる場合があります。
次のコード スニペットは、ビルド出力のターゲット プラットフォームを指定するフラグを使用して --platform
Docker CLI からビルドを呼び出すのと似ています。
import * as dockerBuild from "@pulumi/docker-build";
const image = new dockerBuild.Image("image", {
// Build a multi-platform image manifest for ARM and AMD.
platforms: [
dockerBuild.Platform.Linux_amd64,
dockerBuild.Platform.Linux_arm64,
],
push: false,
});
Pulumi プログラムに加えた変更をデプロイします。
$ pulumi up --yes
AWS ECR との間のキャッシュ
Docker イメージのビルド中にキャッシュされたレイヤーを維持することで、ビルドの高速化が可能になり、貴重な時間を節約できます。 ただし、キャッシュされたレイヤーを利用することは、ビルド間で環境がリサイクルされるため、CI/CD パイプラインで歴史的に困難でした。 とcacheTo
パラメーターを使用するとcacheFrom
、プログラムによるビルドでキャッシュ動作を最適化できます。
Docker イメージ リソースを更新して、キャッシュを利用します。
import * as dockerBuild from "@pulumi/docker-build";
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws"; // Required for ECR
// Create an ECR repository for pushing.
const ecrRepository = new aws.ecr.Repository("ecr-repository", {});
// Grab auth credentials for ECR.
const authToken = aws.ecr.getAuthorizationTokenOutput({
registryId: ecrRepository.registryId,
});
const image = new dockerBuild.Image("image", {
push: true,
// Use the pushed image as a cache source.
cacheFrom: [{
registry: {
ref: pulumi.interpolate`${ecrRepository.repositoryUrl}:cache`,
},
}],
cacheTo: [{
registry: {
imageManifest: true,
ociMediaTypes: true,
ref: pulumi.interpolate`${ecrRepository.repositoryUrl}:cache`,
},
}],
// Provide our ECR credentials.
registries: [{
address: ecrRepository.repositoryUrl,
password: authToken.password,
username: authToken.userName,
}],
})
AWS ECR の追加リソースの宣言に注目してください。
ビルドを tar ファイルとしてエクスポートする
エクスポートにより、ビルド呼び出しから得られたイメージを共有またはバックアップできます。
ビルドをローカル.tarとしてエクスポートするには ファイルで、リソースを変更して入力を含め exports
ます。
const image = new dockerBuild.Image("image", {
push: false,
exports: [{
docker: {
tar: true,
},
}],
})
Pulumi プログラムに加えた変更をデプロイします。
$ pulumi up --yes
Pulumi Docker ビルド プロバイダー ガイドを確認して、ビルド引数、ビルド コンテキスト、リモート コンテキストなど、他の Docker ビルド機能を調べてください。
次のステップ
Infrastructure as Code (IaC) は最新のクラウドネイティブ開発を管理するための鍵であり、Docker を使用すると、開発者は Dockerfile と Docker Compose ファイルを使用してイメージを作成および制御できます。 しかし、異なるクラウドプラットフォームに展開するなど、状況がより複雑になった場合、Pulumiはさらなる柔軟性と高度なインフラストラクチャ機能を提供できます。 Docker Build プロバイダーは Docker Build Cloud をサポートし、コンテナー化されたアプリケーションの構築、デプロイ、管理を合理化し、開発チームがより効果的に連携し、俊敏性を維持するのに役立ちます。
BuildKit を搭載した Pulumi の最新の Docker ビルド プロバイダーは、Docker ビルドの柔軟性と効率を向上させます。 IaC の原則を適用することで、開発者は複雑なシナリオでもコードを使用してインフラストラクチャを管理できます。 つまり、複雑なインフラストラクチャの課題に煩わされることなく、コンテナ化されたワークロードの構築とデプロイに集中できます。
Pulumi のリリースのお知らせとプロバイダーのドキュメントにアクセスして、Docker ビルド プロバイダーの使用を開始してください。
さらに詳しく
- Pulumi Docker Build プロバイダーの使用を開始します。
- Pulumi Docker ビルド プロバイダーのドキュメントをお読みください。
- Docker Build のドキュメントをお読みください。
- Docker Build Cloud について学習します。