最新の BuildKit リリースである v0.13.0,には、実験的な Windows コンテナーのサポートが含まれています。 BuildKit は何年も前から存在しており、Docker Engine 23以来、Linux のデフォルトのビルド エンジンとなっています。0.0.
BuildKit は、ソースコードを変換してアーティファクト (コンテナーイメージなど) を効率的で表現力豊か、かつ反復可能な方法でビルドするためのツールキットです。 BuildKit では、以前の Docker Builder と比較して、次の利点が導入されました。
- 独立したビルドステージの構築を並列化し、未使用のステージをスキップします。
- ビルド間でビルド コンテキストで変更されたファイルのみを増分転送し、ビルド コンテキスト内の未使用ファイルの転送もスキップします。
- 多くの新機能を備えた Dockerfile フロントエンド実装を使用します。
- 残りの API (中間イメージとコンテナー) の副作用を回避します。
- 自動プルーニングのためにビルドキャッシュに優先順位を付けます。
2018年以来、Windows コンテナーの顧客は、BuildKit リポジトリと Windows コンテナー リポジトリに見られるように、BuildKit の Windows サポートを求めており、何百もの反応とコメントが寄せられています。この 1 年間、ユーザーの声に耳を傾け、リソースを集中させて、BuildKit での Windows コンテナーのサポートを強化しました。
これまでは、Linux イメージと、クロスコンパイルを使用して 非常に限定された Windows イメージをビルドするための Windows 上の Buildx クライアントのみを出荷していました。 本日は、BuildKit での Windows コンテナーの実験的なサポートを導入し、標準の Docker ビルドで間もなく利用できるようにする予定です。
次は何ですか?
今後数か月で、次のようなさらなる改善に取り組んでいきます。
- 一般提供 (GA) 対応: ガイドやドキュメントを含むリリース資料の改善。
- Docker Engine との統合: だからあなたはただ走ることができます
docker build
。 - OCIワーカーのサポート: Linuxでは、OCIワーカーを使用してruncのみでBuildKitを実行するオプションがあります。 現在、Windows では containerd ワーカーのみがサポートされています。
- コンテナドライバ: コンテナー ドライバーでの実行のサポートを追加します。
- 画像出力: Linuxでサポートされている一部の画像出力はWindowsでは機能しない場合があり、テストと評価が必要です。 これには、複数のレジストリへのイメージのエクスポート、イメージ出力のキーがサポートされているかどうかの確認、マルチプラットフォームのイメージ構築サポートのテストが含まれます。
- 他のアーティファクトのビルド: BuildKit を使用して、コンテナーイメージ以外のアーティファクトをビルドできます。 この領域では、バイナリ、ライブラリ、ドキュメントなどの他の成果物が Linux と同様に Windows でもサポートされているかどうかをクロスチェックする必要があります。
- buildkitd の実行に管理者は必要ありません: 現在、Windows で buildkitd を実行するには管理者権限が必要です。 buildkitdを低い権限、別名「ルートレス」で実行することを検討します。
- キャッシュのエクスポート: 特定のキャッシュ エクスポーター (inline、registry、local、gha [GitHub Actions]、 3、azblob) が Windows でもサポートされているかどうかを確認するには、調査を行う必要があります。
- Linux パリティ: Windows と Linux 間の機能パリティのギャップを特定し、アクセスし、埋めます。
チュートリアル — BuildKit と Windows コンテナーを使用して基本的な "Hello World" イメージをビルドする
ここでは、必要な依存関係を含む BuildKit のセットアップ プロセスについて説明し、基本的な Windows イメージをビルドする方法を示しましょう。 フィードバックや問題については、Issues · moby/buildkit (github.com) でチケットを提出してください。 タグ付き エリア/ウィンドウズ.
プラットフォームの要件を以下に示します。 このシナリオでは、 AMD64で基本イメージを実行しますnanoserver:ltsc2022
。
- アーキテクチャ:AMD64、Arm64(バイナリは利用可能ですが、まだ公式にテストされていません)。
- サポートされているオペレーティングシステム:Windows Server 2019、Windows Server 2022、Windows 11。
- 基本イメージ:
servercore:ltsc2019
、、nanoserver:ltsc2022
servercore:ltsc2022
。互換性マップを参照してください。
このワークフローでは、次の手順について説明します。
- Windows コンテナーを有効にします。
- containerd をインストールします。
- BuildKit をインストールします。
- 単純な "Hello World" イメージを作成します。
1. Windows コンテナーを有効にする
PowerShell ターミナルを管理者権限モードで起動します。 次のコマンドを実行して、コンテナー機能が有効になっていることを確認します。
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V, Containers -All
セットアップで RestartNeeded が True と表示される場合は、マシンを再起動し、管理者の PowerShell ターミナルを再度開きます (図 1)。 それ以外の場合は、次の手順に進みます。
2. containerd のインストール
次に、コンテナとイメージを管理するためのコンテナランタイムとして使用される containerdをインストールする必要があります。
手記: 現在、containerd ワーカーのみがサポートされています。 将来的には、runcを使用するOCIワーカーのサポートを追加する予定であるため、この依存関係は削除されます
次のスクリプトを実行して、最新の containerd リリースをインストールします。 containerd が既にインストールされている場合は、以下のスクリプトをスキップして実行 Start-Service containerd
し、containerd サービスを開始します。
注: containerd v1.7.7+ は必須です。
# If containerd previously installed run:
Stop-Service containerd
# Download and extract desired containerd Windows binaries
$Version="1.7.13" # update to your preferred version
curl.exe -L https://github.com/containerd/containerd/releases/download/v$Version/containerd-$Version-windows-amd64.tar.gz -o containerd-windows-amd64.tar.gz
tar.exe xvf .\containerd-windows-amd64.tar.gz
# Copy and configure
Copy-Item -Path ".\bin" -Destination "$Env:ProgramFiles\containerd" -Recurse -Container:$false -Force
cd $Env:ProgramFiles\containerd\
.\containerd.exe config default | Out-File config.toml -Encoding ascii
# Copy
Copy-Item -Path .\bin\* -Destination (New-Item -Type Directory $Env:ProgramFiles\containerd -Force) -Recurse -Force
# add the binaries (containerd.exe, ctr.exe) in $env:Path
$Path = [Environment]::GetEnvironmentVariable("PATH", "Machine") + [IO.Path]::PathSeparator + "$Env:ProgramFiles\containerd"
[Environment]::SetEnvironmentVariable( "Path", $Path, "Machine")
# reload path, so you don't have to open a new PS terminal later if needed
$Env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
# configure
containerd.exe config default | Out-File $Env:ProgramFiles\containerd\config.toml -Encoding ascii
# Review the configuration. Depending on setup you may want to adjust:
# - the sandbox_image (Kubernetes pause image)
# - cni bin_dir and conf_dir locations
Get-Content $Env:ProgramFiles\containerd\config.toml
# Register and start service
containerd.exe --register-service
Start-Service containerd
3. BuildKit のインストール
手記: Docker Desktop を最新バージョンに更新したことを確認します。
次のスクリプトを実行して、最新の BuildKit リリースをダウンロードして抽出します。
$version = "v0.13.0" # specify the release version, v0.13+
$arch = "amd64" # arm64 binary available too
curl.exe -LO https://github.com/moby/buildkit/releases/download/$version/buildkit-$version.windows-$arch.tar.gz
# there could be another `.\bin` directory from containerd instructions
# you can move those
mv bin bin2
tar.exe xvf .\buildkit-$version.windows-$arch.tar.gz
## x bin/
## x bin/buildctl.exe
## x bin/buildkitd.exe
次に、次のコマンドを実行して BuildKit バイナリ Program Files
をディレクトリに追加し、直接 PATH
呼び出せるようにします。
# after the binaries are extracted in the bin directory
# move them to an appropriate path in your $Env:PATH directories or:
Copy-Item -Path ".\bin" -Destination "$Env:ProgramFiles\buildkit" -Recurse -Force
# add `buildkitd.exe` and `buildctl.exe` binaries in the $Env:PATH
$Path = [Environment]::GetEnvironmentVariable("PATH", "Machine") + `
[IO.Path]::PathSeparator + "$Env:ProgramFiles\buildkit"
[Environment]::SetEnvironmentVariable( "Path", $Path, "Machine")
$Env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + `
[System.Environment]::GetEnvironmentVariable("Path","User")
を実行します buildkitd.exe
。 図 2に示すようなものが表示されることが予想されます。
これで、buildKit インスタンスを使用するように buildx (BuildKit クライアント) を設定できます。 ここでは、起動したばかりの Buildkit インスタンスを指す Builder アイテムを、以下を実行して作成します。
docker buildx create --name buildkit-exp --use --driver=remote npipe:////./pipe/buildkitd
ここでは、ビルダーの新しいインスタンスを作成し、それを BuildKit インスタンスにポイントしています。 BuildKit は .npipe:////./pipe/buildkitd
ビルダーにも名前を付けますが、ここでは buildkit-exp
と呼んでいますが、好きな名前を付けることができます。 これを現在のビルダーとして設定することを忘れないでください --use
。
実行 docker buildx inspect
して接続をテストしてみましょう(図 3)。
よし!
また、ビルダーを一覧表示して 管理することもできます。 を実行します docker buildx ls
(図 4)。
4. "Hello World" イメージのビルド
次の Dockerfile に示すように、 単純な "hello world" イメージ を構築します。
FROM mcr.microsoft.com/windows/nanoserver:ltsc2022
COPY hello.txt C:
CMD ["cmd", "/C", "type C:\\hello.txt"]
次のコマンドを実行してディレクトリを作成し、ディレクトリを sample_dockerfile
に変更します。
mkdir sample_dockerfile
cd sample_dockerfile
次のスクリプトを実行して、上記の hello.txt
sample_dockerfile
Dockerfile をディレクトリに追加します。
Set-Content Dockerfile @"
FROM mcr.microsoft.com/windows/nanoserver:ltsc2022
USER ContainerAdministrator
COPY hello.txt C:/
RUN echo "Goodbye!" >> hello.txt
CMD ["cmd", "/C", "type C:\\hello.txt"]
"@
Set-Content hello.txt @"
Hello from buildkit!
This message shows that your installation appears to be working correctly.
"@
これで、を使用して buildx
イメージをビルドし、レジストリにプッシュできます (図 5を参照)。
docker buildx build --builder buildkit-exp --push -t <your_username>/hello-buildkit .
Docker Hub をレジストリとして使用している場合は、実行buildx build
前に実行docker login
してください (図 6)。
万丈! これで、標準 docker run
のコンテナを実行できます。
docker run <HUB ACCOUNT NAME>/hello-buildkit
BuildKit を使ってみる
リリースされた実験的な Windows BuildKit サポート v0.13.0.まず、 ドキュメント やブログで、BuildKit を使用して簡単な Windows イメージを構築する方法を順を追って説明してください。 フィードバックと課題は Issues · moby/buildkit (github.com) で報告してください。 タグ付き エリア/ウィンドウズ.
さらに詳しく
- Docker Newsletter を購読してください。
- Docker デスクトップの最新リリースを入手します。
- 質問がありますか? Docker コミュニティがお手伝いします。
- ドッカーは初めてですか? 始めましょう。
ありがとうございます
@gabriel-samfiraさん、@TBBleさん、@tonistiigiさん、@AkihiroSudaさん、@クレイジーマックス、 @jedevc、 @thaJeztah、 @profnandaa、@イアンキンゴリ[LX11] 、および BuildKit での Windows コンテナー サポートの有効化に貢献した他の多くの主要なコミュニティ メンバー。 また、貴重なフィードバックと分析情報を引き続き提供してくださる Windows コンテナー開発者にも感謝します。