Docker 컨테이너 드라이버
Docker 컨테이너 드라이버 (Docker container driver)
Docker 컨테이너 드라이버는 전용 Docker 컨테이너 안에서 관리형이면서 커스터마이즈 가능한 BuildKit 환경을 만들 수 있게 해 주는 드라이버예요.
출처: 문서
본문
Docker 컨테이너 드라이버는 기본 Docker 드라이버에 비해 몇 가지 장점이 있어요. 예를 들어:
- 사용할 커스텀 BuildKit 버전을 지정할 수 있어요.
- 멀티 아키텍처 이미지를 빌드할 수 있어요(해당 QEMU 문서 참고).
- 캐시 import·export에 고급 옵션을 쓸 수 있어요.
동작 방식 (Synopsis)
container라는 이름의, Docker 컨테이너 드라이버를 쓰는 새 빌더를 만드려면 다음 명령을 실행해요:
$ docker buildx create \
--name container \
--driver=docker-container \
--driver-opt=[key=value,...]
container
다음 표는 --driver-opt에 넘길 수 있는 드라이버별 옵션을 설명해요:
| Parameter | Type | Default | Description |
| image | String | | 컨테이너에 사용할 BuildKit 이미지를 설정해요. |
| memory | String | | 컨테이너가 사용할 수 있는 메모리 양을 설정해요. |
| memory-swap | String | | 컨테이너의 메모리 스왑 한도를 설정해요. |
| cpu-quota | String | | 컨테이너에 CPU CFS 쿼터를 부과해요. |
| cpu-period | String | | 컨테이너의 CPU CFS 스케줄러 주기를 설정해요. |
| cpu-shares | String | | 컨테이너의 CPU 공유(상대 가중치)를 구성해요. |
| cpuset-cpus | String | | 컨테이너가 사용할 수 있는 CPU 코어 집합을 제한해요. |
| cpuset-mems | String | | 컨테이너가 사용할 수 있는 CPU 메모리 노드 집합을 제한해요. |
| default-load | Boolean | false | 이미지를 Docker Engine 이미지 저장소에 자동으로 로드해요. |
| network | String | | 컨테이너의 네트워크 모드를 설정해요. |
| cgroup-parent | String | /docker/buildx | Docker가 "cgroupfs" 드라이버를 쓸 때 컨테이너의 cgroup 부모를 설정해요. |
| restart-policy | String | unless-stopped | 컨테이너의 재시작 정책을 설정해요. |
| env.
컨테이너의 리소스 한도를 설정하기 전에 컨테이너 런타임 리소스 제약 구성 문서를 먼저 읽어 보세요.
사용법 (Usage)
빌드를 실행하면 Buildx가 지정한 이미지(기본값은 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
...
캐시 영속성 (Cache persistence)
docker-container 드라이버는 모든 BuildKit 상태와 관련 캐시를 전용 Docker 볼륨에 저장하므로 캐시 영속성을 지원해요.
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용 리눅스 이미지를 빌드하려면:
$ docker buildx build \
--builder=container \
--platform=linux/amd64,linux/arm64 \
-t <registry>/<image> \
--push .
Note
QEMU로 하는 에뮬레이션은 네이티브 빌드보다 훨씬 느릴 수 있어요. 특히 컴파일, 압축·해제처럼 계산량이 많은 작업에서요.
커스텀 네트워크 (Custom network)
빌더 컨테이너가 사용하는 네트워크를 커스터마이즈할 수 있어요. 빌드에 특정 네트워크가 필요할 때 유용해요.
예를 들어 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]