Docker 容器驅動程式
Docker 容器驅動程式允許在專用的 Docker 容器中建立受管理且可自定義的 BuildKit 環境。
與預設的 Docker 驅動程式相比,使用 Docker 容器驅動程式有幾個優點。例如:
概要
執行以下指令以建立一個名為 container 的新建構器,並使用 Docker 容器驅動程式:
$ docker buildx create \
--name container \
--driver=docker-container \
--driver-opt=[key=value,...]
container
下表說明了您可以傳遞給 --driver-opt 的可用驅動程式特定選項
| 參數 | 類型 | 預設值 | 描述 |
|---|---|---|---|
image | String | 設定用於容器的 BuildKit 映像檔。 | |
記憶體 (memory) | String | 設定容器可使用的記憶體量。 | |
記憶體交換空間 (memory-swap) | String | 設定容器的記憶體交換空間限制。 | |
CPU 配額 (cpu-quota) | String | 對容器強制執行 CPU CFS 配額。 | |
CPU 週期 (cpu-period) | String | 設定容器的 CPU CFS 排程器週期。 | |
CPU 份額 (cpu-shares) | String | 配置容器的 CPU 份額(相對權重)。 | |
CPU 核心集合 (cpuset-cpus) | String | 限制容器可使用的 CPU 核心集。 | |
CPU 記憶體節點 (cpuset-mems) | String | 限制容器可使用的 CPU 記憶體節點集。 | |
預設載入 | 布林值 | false | 自動將映像檔載入到 Docker Engine 映像檔儲存庫。 |
network(網路) | String | 設定容器的網路模式。 | |
cgroup 父層 (cgroup-parent) | String | /docker/buildx | 如果 Docker 使用 "cgroupfs" 驅動程式,則設定容器的 cgroup 父層。 |
重啟策略 (restart-policy) | String | unless-stopped | 設定容器的重啟策略。 |
環境變數 env.<key> | String | 將容器中環境變數 key 的值設定為指定的 value。 |
在設定容器的資源限制之前,請先閱讀配置容器的執行時期資源限制。
使用方式
當您執行建構時,Buildx 會提取指定的 image(預設為 moby/buildkit)。容器啟動後,Buildx 會將建構任務提交給容器化的建構伺服器。
$ docker buildx build -t <image> --builder=container .
WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
#1 [internal] booting buildkit
#1 pulling image moby/buildkit:buildx-stable-1
#1 pulling image moby/buildkit:buildx-stable-1 1.9s done
#1 creating container buildx_buildkit_container0
#1 creating container buildx_buildkit_container0 0.5s done
#1 DONE 2.4s
...
快取持續性
docker-container 驅動程式支援快取持續性,因為它將所有 BuildKit 狀態與相關快取儲存在專用的 Docker 儲存卷 (volume) 中。
若要在使用 docker buildx rm 與 docker buildx create 重建驅動程式後,仍維持 docker-container 驅動程式的快取,您可以在銷毀建構器時使用 --keep-state 旗標:
例如,若要建立一個名為 container 的建構器,並在移除時保留其狀態:
# setup a builder
$ docker buildx create --name=container --driver=docker-container --use --bootstrap
container
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
container * docker-container
container0 desktop-linux running v0.10.5 linux/amd64
$ docker volume ls
DRIVER VOLUME NAME
local buildx_buildkit_container0_state
# remove the builder while persisting state
$ docker buildx rm --keep-state container
$ docker volume ls
DRIVER VOLUME NAME
local buildx_buildkit_container0_state
# the newly created driver with the same name will have all the state of the previous one!
$ docker buildx create --name=container --driver=docker-container --use --bootstrap
container
QEMU
docker-container 驅動程式支援使用 QEMU(使用者模式)來建構非原生平台。使用 --platform 旗標來指定您要建構的架構。
例如,若要建構適用於 amd64 與 arm64 的 Linux 映像檔:
$ docker buildx build \
--builder=container \
--platform=linux/amd64,linux/arm64 \
-t <registry>/<image> \
--push .
注意使用 QEMU 模擬的速度可能比原生建構慢得多,特別是在編譯、壓縮或解壓縮等計算密集型任務上。
自定義網路
您可以自定義建構器容器所使用的網路。如果您需要為建構任務使用特定網路,這將非常有用。
例如,讓我們建立一個網路,命名為 foonet:
$ docker network create foonet
現在,建立一個將使用此網路的 docker-container 建構器:
$ docker buildx create --use \
--name mybuilder \
--driver docker-container \
--driver-opt "network=foonet"
啟動並檢查 mybuilder:
$ docker buildx inspect --bootstrap
檢查建構器容器並查看目前使用的網路:
$ docker inspect buildx_buildkit_mybuilder0 --format={{.NetworkSettings.Networks}}
map[foonet:0xc00018c0c0]
延伸閱讀
有關 Docker 容器驅動程式的更多資訊,請參閱 buildx 參考文件。