소개
이 랩에서는 docker buildx history trace를 사용하여 Docker 이미지의 빌드 트레이스를 보고 분석하는 방법을 배우게 됩니다. 먼저 간단한 Docker 이미지를 빌드하고 표준 Docker 명령을 사용하여 빌드 기록을 기록하는 것으로 시작합니다.
초기 빌드 후, 기록된 빌드 기록 레코드를 나열하는 방법을 살펴본 다음, 특정 빌드 레코드의 상세한 OpenTelemetry 트레이스를 보는 방법을 자세히 살펴보겠습니다. 마지막으로, 두 개의 서로 다른 빌드 레코드의 트레이스를 비교하는 방법을 배우게 되며, 이를 통해 빌드 프로세스 및 잠재적인 최적화에 대한 귀중한 통찰력을 얻을 수 있습니다.
이미지 빌드 및 기록 기록
이 단계에서는 Docker 이미지를 빌드하고 빌드 기록을 기록하는 방법을 배우게 됩니다. Docker 이미지는 Dockerfile에서 빌드됩니다. Dockerfile은 사용자가 명령줄에서 이미지를 조립하기 위해 호출할 수 있는 모든 명령을 포함하는 텍스트 파일입니다.
먼저, 간단한 Dockerfile을 만들어 보겠습니다. 아직 해당 디렉토리에 있지 않다면 ~/project 디렉토리로 이동합니다.
cd ~/project
이제 nano 편집기를 사용하여 Dockerfile이라는 파일을 만듭니다.
nano Dockerfile
다음 내용을 Dockerfile에 추가합니다.
FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends fortune-mod
CMD ["/usr/games/fortune"]
이 Dockerfile은 최신 Ubuntu 이미지를 시작하고, 패키지 목록을 업데이트하고, fortune-mod 패키지를 설치하며, 기본 명령을 fortune 프로그램을 실행하도록 설정합니다.
파일을 저장하고 nano를 종료합니다 ( Ctrl + X를 누른 다음 Y를 누르고 Enter를 누릅니다).
이제 docker build 명령을 사용하여 Docker 이미지를 빌드해 보겠습니다. 이미지를 my-fortune-image로 태그하고 현재 디렉토리 (.) 를 빌드 컨텍스트로 사용합니다.
docker build -t my-fortune-image .
기본 이미지를 다운로드하고 apt-get 명령을 실행하는 것을 포함하여 빌드 프로세스를 나타내는 출력을 볼 수 있습니다.
빌드 기록을 기록하기 위해 docker history 명령을 사용할 수 있습니다. 이 명령은 이미지의 기록을 보여줍니다.
docker history my-fortune-image
출력에는 이미지를 구성하는 레이어 목록과 각 레이어를 생성하는 데 사용된 명령, 레이어 크기 및 생성 시기가 표시됩니다. 이 기록은 이미지가 어떻게 빌드되었는지 이해하고 디버깅하는 데 유용합니다.
빌드 기록 레코드 나열
이 단계에서는 Docker 이미지의 빌드 기록 레코드 목록에 대해 자세히 알아보겠습니다. 이전 단계에서 보았듯이 docker history 명령은 이미지를 구성하는 레이어에 대한 자세한 보기를 제공합니다.
이전 단계에서 빌드한 my-fortune-image에 대해 docker history 명령을 다시 실행해 보겠습니다.
docker history my-fortune-image
출력에는 여러 열이 표시됩니다.
- IMAGE: 이미지 레이어의 ID.
- CREATED: 레이어가 생성된 타임스탬프.
- CREATED BY: 레이어를 생성한 명령.
- SIZE: 레이어의 크기.
- COMMENT: 레이어와 관련된 모든 주석.
출력의 각 줄은 이미지의 레이어를 나타냅니다. 레이어는 가장 최근 (상단) 에서 가장 오래된 (하단) 순으로 나열됩니다. 기본 이미지 (ubuntu:latest의 경우) 는 하단 레이어입니다.
-q 플래그를 사용하여 이미지 ID 만 표시할 수도 있습니다.
docker history -q my-fortune-image
이는 스크립팅 또는 기타 목적으로 레이어 ID 만 필요한 경우 유용할 수 있습니다.
docker history 명령은 Docker 이미지의 구성을 이해하고 이미지 레이어와 관련된 문제를 디버깅하는 강력한 도구입니다.
빌드 기록의 OpenTelemetry 추적 보기
이 단계에서는 Docker 빌드 기록의 OpenTelemetry 추적을 보는 방법을 배우게 됩니다. OpenTelemetry 는 소프트웨어의 성능과 동작을 분석하는 데 도움이 되도록 원격 측정 데이터 (메트릭, 로그 및 추적) 를 계측, 생성, 수집 및 내보내는 데 사용되는 도구, API 및 SDK 모음입니다. Docker 는 OpenTelemetry 와 통합하여 빌드 프로세스에 대한 자세한 추적을 제공할 수 있습니다.
OpenTelemetry 추적을 보려면 이미지를 빌드할 때 추적을 활성화해야 합니다. my-fortune-image를 추적을 활성화하여 다시 빌드하겠습니다.
먼저, ~/project 디렉토리에 있는지 확인합니다.
cd ~/project
이제 이미지를 다시 빌드하지만, 이번에는 BUILDKIT_TRACE 환경 변수를 설정하여 추적을 활성화합니다. 또한 --progress=plain 플래그를 사용하여 빌드 출력을 직접 볼 것입니다.
BUILDKIT_TRACE=trace.json docker build --progress=plain -t my-fortune-image .
이 명령은 이미지를 다시 빌드하고 OpenTelemetry 추적 데이터를 현재 디렉토리의 trace.json 파일에 저장합니다.
빌드가 완료된 후 trace.json 파일의 내용을 볼 수 있습니다. 이 파일에는 JSON 형식의 추적 데이터가 포함되어 있습니다.
cat trace.json
출력은 각 단계의 기간, 종속성 및 기타 메타데이터를 포함하여 빌드 프로세스에 대한 자세한 정보를 담고 있는 큰 JSON 객체입니다. 이 추적 데이터는 시각화 및 분석을 위해 OpenTelemetry 호환 추적 백엔드 (Jaeger 또는 Zipkin 과 같은) 로 가져올 수 있습니다.
이 랩에서는 전체 추적 백엔드를 설정하지 않지만, Docker 빌드 분석을 위해 OpenTelemetry 를 활용하는 첫 번째 단계는 추적 파일을 생성하는 방법을 이해하는 것입니다.
두 빌드 기록의 추적 비교
이 단계에서는 두 개의 서로 다른 Docker 빌드 기록에서 OpenTelemetry 추적을 생성하고 비교하는 방법을 배우게 됩니다. 추적을 비교하는 것은 빌드 간의 성능 차이를 식별하는 데 유용하며, 특히 Dockerfile 또는 빌드 환경을 변경한 후에 유용합니다.
먼저, ~/project 디렉토리에 있는지 확인합니다.
cd ~/project
이전 빌드에서 이미 trace.json 파일이 있습니다. 이를 trace1.json으로 이름을 변경하여 보관하겠습니다.
mv trace.json trace1.json
이제 Dockerfile을 약간 변경하고 이미지를 다시 빌드하여 두 번째 추적 파일을 생성해 보겠습니다. Dockerfile에 간단한 LABEL 지시문을 추가합니다.
편집을 위해 Dockerfile을 엽니다.
nano Dockerfile
CMD 지시문 뒤에 다음 줄을 추가합니다.
LABEL version="1.0"
업데이트된 Dockerfile은 다음과 같아야 합니다.
FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends fortune-mod
CMD ["/usr/games/fortune"]
LABEL version="1.0"
파일을 저장하고 nano를 종료합니다.
이제 이미지를 다시 빌드하여 trace2.json이라는 새 추적 파일을 생성합니다.
BUILDKIT_TRACE=trace2.json docker build --progress=plain -t my-fortune-image .
빌드가 완료되면 trace1.json과 trace2.json의 두 개의 추적 파일이 생성됩니다.
원시 JSON 파일을 직접 비교하는 것은 어려울 수 있지만, 이러한 파일은 OpenTelemetry 추적 백엔드에서 사용하도록 설계되었습니다. 실제 시나리오에서는 trace1.json과 trace2.json을 모두 추적 시각화 도구 (Jaeger 와 같은) 로 가져올 것입니다. 이 도구를 사용하면 두 빌드의 타임라인과 스팬을 시각적으로 비교하여 실행 시간의 차이점을 쉽게 파악하고 변경 사항의 영향을 받은 단계를 식별할 수 있습니다.
예를 들어, Jaeger 에서 이러한 추적을 보면 Docker 빌드의 개별 단계 (예: FROM, RUN, CMD, LABEL) 가 스팬으로 표시됩니다. 그런 다음 두 추적 간의 이러한 스팬의 기간을 비교하여 LABEL 지시문을 추가한 것이 빌드 시간에 측정 가능한 영향을 미쳤는지 확인할 수 있습니다.
이 랩에서는 추적 백엔드를 설정하지 않았으므로, 두 추적 파일이 모두 존재하는지 확인하기만 합니다.
요약
이 랩에서는 docker build 명령을 사용하여 Dockerfile에서 Docker 이미지를 빌드하고, 쉽게 식별할 수 있도록 이미지를 태깅하는 방법을 배웠습니다. 그런 다음 docker history 명령을 사용하여 생성된 이미지의 빌드 기록을 보는 방법을 탐구하여 빌드 프로세스 중에 사용된 레이어와 명령에 대한 통찰력을 얻었습니다.
이 랩은 또한 docker history 명령을 통해 사용할 수 있는 정보를 보여주면서 빌드 기록 레코드를 자세히 나열하는 방법을 안내했습니다. 또한 특정 빌드 기록의 OpenTelemetry 추적을 보는 방법을 배워 빌드 프로세스를 더 깊이 분석할 수 있었습니다. 마지막으로, 두 개의 서로 다른 빌드 기록의 추적을 비교하는 연습을 하여 변경 사항을 이해하고 빌드 문제를 디버깅하는 데 유용함을 알았습니다.



