Docker Buildx 를 사용하여 멀티 아키텍처 이미지 빌드
Docker Buildx 의 가장 강력한 기능 중 하나는 여러 아키텍처에 대한 이미지를 동시에 빌드하는 기능입니다. 이 단계에서는 멀티 아키텍처 이미지를 만드는 방법을 배우겠습니다.
멀티 아키텍처 이미지 이해
멀티 아키텍처 이미지를 사용하면 동일한 이미지 이름이 서로 다른 플랫폼 (AMD64, ARM64 등) 에서 작동할 수 있습니다. 이미지를 가져올 때 Docker 는 호스트 아키텍처에 적합한 버전을 자동으로 선택합니다.
이는 특히 다음과 같은 경우에 유용합니다.
- x86 및 ARM 기반 장치 모두 지원
- 애플리케이션이 다양한 클라우드 제공업체에서 실행되도록 보장
- 서로 다른 아키텍처를 가진 IoT 장치용 빌드
멀티 아키텍처 빌드 설정
Docker Buildx 는 멀티 아키텍처 빌드를 위해 구성되어야 합니다. 먼저, 빌더가 이 기능을 지원하는지 확인해 보겠습니다.
docker buildx inspect --bootstrap mybuilder
빌더를 사용할 수 없다는 오류가 표시되면, 올바른 구성으로 다시 생성해 보겠습니다.
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
멀티 아키텍처 이미지 생성
이제 여러 아키텍처에 대해 Nginx 이미지를 빌드해 보겠습니다.
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
다음과 유사한 오류 메시지가 표시될 수 있습니다.
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
이것은 기본 Docker 드라이버가 멀티 아키텍처 빌드를 지원하지 않기 때문에 발생합니다. 접근 방식을 수정해 보겠습니다.
데모 목적으로, 특정 플랫폼에 대해 별도로 빌드합니다.
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
이렇게 하면 AMD64 아키텍처에 대해 이미지를 특별히 빌드하고 Docker 의 로컬 이미지 저장소에 로드합니다.
빌드 인수 사용
Docker Buildx 를 사용하면 빌드 인수를 사용하여 빌드를 사용자 정의할 수 있습니다. 빌드 인수를 사용하도록 Dockerfile 을 수정해 보겠습니다.
nano Dockerfile
Dockerfile 내용을 다음과 같이 업데이트합니다.
FROM ubuntu:22.04
ARG PACKAGE=nginx
RUN apt-get update && apt-get install -y \
curl \
${PACKAGE} \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Ctrl+O를 누른 다음 Enter를 눌러 저장하고, Ctrl+X를 눌러 nano 를 종료합니다.
이제 사용자 지정 패키지로 이미지를 빌드할 수 있습니다.
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
레지스트리에 푸시 (선택 사항)
멀티 아키텍처 이미지를 완전히 활용하려면 일반적으로 레지스트리에 푸시해야 합니다. 이 작업에는 Docker Hub 자격 증명 또는 개인 레지스트리가 필요합니다. 실제 시나리오에서는 명령이 다음과 같습니다.
## Example only - not required for this lab
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
이미지 검사
생성한 이미지를 검사해 보겠습니다.
docker images | grep nginx
다음과 유사한 출력을 볼 수 있습니다.
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
이미지 테스트
마지막으로, 이미지를 사용하여 컨테이너를 실행하여 작동하는지 확인해 보겠습니다.
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
컨테이너가 실행 중인지 확인합니다.
docker ps
컨테이너가 실행 중임을 나타내는 출력을 볼 수 있습니다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdef123456 nginx-test:latest "nginx -g 'daemon of…" 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp test-nginx
nginx 서버가 응답하는지 확인하기 위해 curl 을 사용해 보겠습니다.
curl http://localhost:8080
기본 Nginx 환영 페이지 HTML 을 볼 수 있습니다.
작업이 완료되면 컨테이너를 정리합니다.
docker stop test-nginx
docker rm test-nginx
축하합니다! Docker Buildx 로 성공적으로 작업하고, "requires exactly 1 argument" 오류를 이해하고 해결했으며, 서로 다른 아키텍처에 대한 특수 빌드를 만드는 방법을 배웠습니다.