docker buildx debug build 명령어를 사용하여 이미지 빌드 및 검사 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker buildx debug build 명령을 효과적으로 사용하여 Docker 이미지를 빌드하고 검사하는 방법을 배우게 됩니다. 먼저 Dockerfile을 사용하여 기본 설정을 갖춘 간단한 이미지를 빌드하는 것으로 시작합니다.

기본 사항을 바탕으로 빌드 인수를 통합하고 이미지를 레이블링하는 등 보다 고급 빌드 시나리오를 탐색합니다. 또한 빌드 프로세스 중에 특정 플랫폼을 타겟팅하고 결과 이미지를 파일로 출력하는 방법도 배우게 됩니다. 마지막으로, 이 랩에서는 빌드 캐시를 제어하고 빌드 중에 보안적으로 비밀을 노출하는 기술을 다루어 docker buildx debug build 명령의 기능을 포괄적으로 이해할 수 있도록 합니다.

기본 설정으로 간단한 이미지 빌드

이 단계에서는 Dockerfile을 사용하여 간단한 Docker 이미지를 빌드하는 방법을 배우게 됩니다. Dockerfile은 사용자가 이미지를 조립하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서입니다. Docker 는 Dockerfile의 지침을 읽어 자동으로 이미지를 빌드할 수 있습니다.

먼저, 이 랩의 작업 디렉토리인 ~/project 디렉토리로 이동합니다.

cd ~/project

이제 간단한 Dockerfile을 만들어 보겠습니다. ~/project 디렉토리에 Dockerfile이라는 파일을 생성합니다. 이 Dockerfileubuntu 기본 이미지를 기반으로 이미지를 생성하고 cowsay 패키지를 설치하는 단계를 정의합니다.

nano 편집기를 사용하여 Dockerfile을 생성하고 편집합니다.

nano Dockerfile

다음 내용을 Dockerfile에 추가합니다.

FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello, Docker!"]

Dockerfile을 자세히 살펴보겠습니다.

  • FROM ubuntu:latest: 이 지시는 새 이미지의 기본 이미지를 지정합니다. Docker Hub 에서 제공하는 공식 Ubuntu 이미지의 최신 버전을 사용하고 있습니다.
  • RUN apt-get update && apt-get install -y cowsay: 이 지시는 현재 이미지 위에 새 레이어에서 명령을 실행하고 결과를 커밋합니다. 여기서는 패키지 목록을 업데이트하고 cowsay 패키지를 설치합니다. -y 플래그는 프롬프트에 자동으로 예로 응답합니다.
  • CMD ["cowsay", "Hello, Docker!"]: 이 지시는 실행 중인 컨테이너에 대한 기본 명령을 제공합니다. 이 이미지에서 명령을 지정하지 않고 컨테이너를 시작하면 cowsay "Hello, Docker!"가 실행됩니다.

Ctrl + X, Y, Enter를 눌러 파일을 저장합니다.

이제 Dockerfile이 있으므로 이미지를 빌드할 수 있습니다. docker build 명령을 사용합니다. 명령 끝에 있는 .은 Docker 에게 현재 디렉토리 (~/project) 에서 Dockerfile을 찾도록 지시합니다. 또한 이미지에 이름을 태그로 지정합니다 (예: my-cowsay-image).

docker build -t my-cowsay-image .

이 명령은 Dockerfile의 지침을 단계별로 실행합니다. 기본 이미지를 다운로드하고 (아직 없는 경우) cowsay를 설치하는 등 각 단계가 처리되는 것을 나타내는 출력을 볼 수 있습니다.

빌드 프로세스가 완료된 후 docker images 명령을 사용하여 사용 가능한 이미지를 나열하여 이미지가 성공적으로 생성되었는지 확인할 수 있습니다.

docker images

출력에 my-cowsay-image가 나열되어야 합니다.

마지막으로, 방금 빌드한 이미지에서 컨테이너를 실행하여 예상대로 작동하는지 확인해 보겠습니다.

docker run my-cowsay-image

이 명령은 my-cowsay-image를 기반으로 새 컨테이너를 생성하고 시작합니다. Dockerfile에서 CMD 지시를 정의했으므로 컨테이너는 자동으로 cowsay "Hello, Docker!"를 실행하며, 터미널 출력에서 소가 "Hello, Docker!"라고 말하는 것을 볼 수 있습니다.

빌드 인수 및 레이블을 사용하여 이미지 빌드

이 단계에서는 Dockerfile에서 빌드 인수 (ARG) 와 레이블 (LABEL) 을 사용하는 방법을 배우게 됩니다. 빌드 인수를 사용하면 빌드 프로세스에 변수를 전달하여 Dockerfile을 더욱 유연하게 만들 수 있습니다. 레이블은 메타데이터를 추가하기 위해 이미지에 첨부할 수 있는 키 - 값 쌍입니다.

먼저, ~/project 디렉토리에 있는지 확인합니다.

cd ~/project

이제 이전 단계에서 생성한 Dockerfile을 수정해 보겠습니다. cowsay에서 표시되는 메시지를 사용자 정의하기 위해 빌드 인수를 추가하고 이미지에 레이블을 추가합니다.

편집을 위해 Dockerfile을 엽니다.

nano Dockerfile

ARGLABEL 지침을 포함하도록 내용을 수정합니다.

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <your.email@example.com>"
CMD ["cowsay", "$MESSAGE"]

변경 사항을 살펴보겠습니다.

  • ARG MESSAGE="Hello, Docker!": 이 지시는 "Hello, Docker!"를 기본값으로 하는 MESSAGE라는 빌드 인수를 정의합니다. 이 값은 빌드 프로세스 중에 재정의될 수 있습니다.
  • LABEL maintainer="Your Name <your.email@example.com>": 이 지시는 이미지에 레이블을 추가합니다. 레이블은 유지 관리자, 버전 또는 기타 관련 메타데이터와 같은 정보를 추가하는 데 유용합니다.
  • CMD ["cowsay", "$MESSAGE"]: CMD 지침을 변경하여 MESSAGE 빌드 인수의 값을 사용하도록 했습니다.

Ctrl + X, Y, Enter를 눌러 수정된 Dockerfile을 저장합니다.

이제 이미지를 다시 빌드해 보지만 이번에는 --build-arg 플래그를 사용하여 MESSAGE 빌드 인수에 대한 값을 전달합니다. 또한 새 태그인 my-custom-cowsay-image를 지정합니다.

docker build --build-arg MESSAGE="Building with arguments!" -t my-custom-cowsay-image .

빌드 프로세스 중에 출력을 관찰합니다. ARG 지침이 처리되고 MESSAGE의 값이 "Building with arguments!"로 설정되는 것을 볼 수 있습니다.

빌드가 완료된 후 이 새 이미지에서 컨테이너를 실행해 보겠습니다.

docker run my-custom-cowsay-image

이번에는 컨테이너가 사용자 정의 메시지 "Building with arguments!"를 출력해야 합니다.

또한 이미지를 검사하여 추가된 레이블을 확인할 수도 있습니다. 이미지 이름 뒤에 docker inspect 명령을 사용합니다.

docker inspect my-custom-cowsay-image

출력에서 “Labels” 섹션을 찾습니다. Dockerfile에서 지정한 값을 가진 maintainer 레이블을 찾아야 합니다.

특정 플랫폼을 대상으로 이미지 빌드 및 파일로 출력

이 단계에서는 특정 플랫폼용 Docker 이미지를 빌드하고 빌드된 이미지를 파일로 출력하는 방법을 배우게 됩니다. 서로 다른 아키텍처 (예: ARM 대 x86) 를 가진 시스템에 애플리케이션을 배포해야 할 때 서로 다른 플랫폼용으로 빌드하는 것이 유용합니다. 파일로 출력하면 이미지를 tar 아카이브로 저장할 수 있으며, 이 아카이브는 다른 Docker 환경에서 쉽게 전송하고 로드할 수 있습니다.

먼저, ~/project 디렉토리에 있는지 확인합니다.

cd ~/project

이전 단계에서 사용한 동일한 Dockerfile을 사용합니다. cat 명령을 사용하여 내용을 볼 수 있습니다.

cat Dockerfile

출력은 다음과 같아야 합니다.

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <your.email@example.com>"
CMD ["cowsay", "$MESSAGE"]

이제 linux/arm64 플랫폼을 위해 특별히 이미지를 빌드해 보겠습니다. --platform 플래그를 사용합니다. 다른 플랫폼용으로 빌드하려면 최신 Docker 설치에 일반적으로 포함된 Docker Buildx 가 필요합니다.

docker build --platform linux/arm64 -t my-arm64-cowsay-image .

이 명령은 ARM64 아키텍처용 이미지를 빌드합니다. 이전 빌드와 유사한 출력을 볼 수 있지만 빌드 프로세스는 다른 아키텍처를 대상으로 합니다.

빌드가 완료된 후 이미지를 나열하여 새로 생성된 이미지를 볼 수 있습니다. 이 이미지의 경우 ARCHITECTURE 열에 arm64가 표시됩니다.

docker images

다음으로, 이 이미지를 tar 파일로 출력해 보겠습니다. 이는 레지스트리를 사용하지 않고 이미지를 저장하고 공유하는 데 유용합니다. type=tar 옵션과 함께 --output 플래그를 사용합니다.

docker build --platform linux/arm64 -t my-arm64-cowsay-image . --output type=tar,dest=my-arm64-cowsay-image.tar

이 명령은 이미지를 다시 빌드하고 (빌드 캐시를 사용할 수 있음) ~/project 디렉토리에 my-arm64-cowsay-image.tar라는 tar 파일로 저장합니다.

ls 명령을 사용하여 tar 파일이 생성되었는지 확인할 수 있습니다.

ls -lh my-arm64-cowsay-image.tar

크기와 함께 파일이 나열되어야 합니다. 이 tar 파일에는 my-arm64-cowsay-image의 모든 레이어가 포함되어 있습니다. 그런 다음 이 파일을 다른 머신으로 전송하고 docker load -i my-arm64-cowsay-image.tar를 사용하여 로드할 수 있습니다.

캐시 제어 및 보안 노출을 통한 이미지 빌드

이 단계에서는 Docker 빌드 캐시를 제어하는 방법과 BuildKit 의 secret 마운트 유형을 사용하여 빌드 프로세스 중에 비밀을 처리하는 방법을 배우게 됩니다. 빌드 캐시는 빌드 속도를 크게 높일 수 있지만, 때로는 이를 비활성화해야 할 수도 있습니다. 이미지 레이어에 민감한 정보를 포함하지 않도록 안전하게 비밀을 처리하는 것이 중요합니다.

먼저, ~/project 디렉토리에 있는지 확인합니다.

cd ~/project

캐싱을 제어하고 비밀 처리를 시연하려는 단계를 포함하도록 Dockerfile을 수정해 보겠습니다. 간단한 파일 생성 단계와 가상으로 비밀을 사용하는 단계를 추가합니다.

편집을 위해 Dockerfile을 엽니다.

nano Dockerfile

타임스탬프가 있는 파일을 생성하고 비밀 사용을 위한 자리 표시자를 포함하도록 내용을 수정합니다.

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <your.email@example.com>"
RUN echo "Build time: $(date)" > /app/build_info.txt
## This is a placeholder for a command that would use a secret
## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
CMD ["cowsay", "$MESSAGE"]

RUN echo "Build time: $(date)" > /app/build_info.txt를 추가했습니다. 이 명령은 이 레이어가 빌드된 시점의 타임스탬프를 포함하는 파일 /app/build_info.txt를 생성합니다. 기본적으로 Docker 는 레이어를 캐시합니다. 이 RUN 명령 앞의 지침을 변경하지 않고 이미지를 여러 번 빌드하면 이 레이어가 캐시에서 제공될 수 있으며 타임스탬프가 업데이트되지 않습니다.

Ctrl + X, Y, Enter를 눌러 수정된 Dockerfile을 저장합니다.

이제 새 태그 my-cached-image로 이미지를 빌드해 보겠습니다.

docker build -t my-cached-image .

출력을 관찰합니다. 최근에 이미지를 빌드한 경우 일부 단계에 대해 ---> Using cache를 볼 수 있습니다.

캐시 제어를 시연하기 위해 이미지를 다시 빌드하지만 이번에는 --no-cache 플래그를 사용하여 전체 빌드에 대한 캐시를 비활성화합니다.

docker build --no-cache -t my-no-cache-image .

지침이 변경되지 않은 경우에도 Docker 가 모든 레이어를 다시 빌드하는 것을 볼 수 있습니다. 이는 모든 종속성을 새로 가져오거나 이전 빌드가 캐시를 손상시키는 방식으로 실패한 경우에 유용합니다.

이제 비밀 처리에 대해 논의해 보겠습니다. 주석 처리된 줄 ## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt는 BuildKit 으로 비밀을 사용하는 방법을 보여줍니다. 이를 사용하려면 BuildKit 을 활성화하고 (최신 Docker 버전에서는 기본적으로 활성화되는 경우가 많음) --secret 플래그를 사용하여 빌드 중에 비밀을 제공해야 합니다.

예를 들어, 비밀이 포함된 mysecret.txt라는 파일이 있는 경우 다음과 같이 빌드합니다 (이 명령은 mysecret.txt 파일이 없고 줄이 주석 처리되어 있으므로 그대로 작동하지 않지만 구문을 보여줍니다).

## docker build --secret id=mysecret,src=mysecret.txt -t my-secret-image .

RUN --mount=type=secret,id=mysecret 지침은 빌드 단계 동안에만 /run/secrets/mysecret에서 비밀의 내용을 사용할 수 있도록 합니다. 비밀은 최종 이미지 레이어에 포함되지 않습니다. 이는 빌드 중에 API 키 또는 암호와 같은 민감한 정보를 처리하는 안전한 방법입니다.

비밀 파일이 없고 줄이 주석 처리되어 있으므로 비밀 관련 빌드 명령을 실행하지 않습니다. 그러나 --no-cachesecret 마운트 유형의 개념을 이해하는 것은 빌드를 제어하고 민감한 데이터를 처리하는 데 중요합니다.

요약

이 Lab 에서는 Dockerfile을 사용하여 Docker 이미지를 빌드하는 기본 사항을 배웠습니다. Ubuntu 를 기반으로 하는 간단한 Dockerfile을 생성하고, 패키지를 설치하고, 기본 명령을 정의하는 것으로 시작했습니다. 이를 통해 FROM, RUN, CMD와 같은 핵심 지침과 태그를 사용하여 docker build로 이미지를 빌드하는 방법을 익혔습니다.

기본 사항을 바탕으로 더 발전된 이미지 빌드 기술을 탐구했습니다. 빌드 프로세스를 사용자 정의하고 이미지에 메타데이터를 추가하기 위해 Dockerfile에 빌드 인수와 레이블을 통합하는 방법을 배웠습니다. 또한 특정 플랫폼용 이미지를 빌드하고 결과 이미지를 파일로 출력하여 빌드 출력을 제어하는 방법을 실습했습니다. 마지막으로, 효율적이고 안전한 이미지 생성을 위한 모범 사례를 강조하면서 빌드 캐시를 관리하고 빌드 프로세스 중에 안전하게 비밀을 처리하는 방법을 자세히 살펴보았습니다.