소개
도커 멀티 스테이지 빌드 (Multi-stage Build) 는 하나의 Dockerfile 내에서 여러 단계를 정의하여 최종 도커 이미지를 생성할 수 있게 해주는 기능입니다. 이번 챌린지에서는 멀티 스테이지 빌드를 활용해 이미지 크기를 최적화하고 효율적인 배포 이미지를 만드는 과정을 실습합니다.
멀티 스테이지 빌드를 적용한 Dockerfile 작성
이 단계에서는 멀티 스테이지 빌드 방식을 사용하는 Dockerfile을 작성합니다.
수행 과제
- 두 개의 스테이지로 구성된
Dockerfile을 생성하세요. 첫 번째 스테이지에서는 필요한 의존성을 설치하고 빌드 스크립트를 실행하여 애플리케이션을 빌드합니다. 두 번째 스테이지에서는 첫 번째 스테이지에서 컴파일된 코드만 복사해오고, 실행에 필요한 최소한의 의존성만 유지하며 필요한 포트를 개방하여 최종 이미지를 구성합니다.
예시 가이드
다음은 실습 진행을 위한 예시 절차입니다:
myapp이라는 새 디렉토리를 생성하고 해당 위치로 이동합니다.mkdir myapp cd myapphttps://github.com/labex-labs/nodejs-example.git에서 NodeJS 소스 코드를 내려받습니다.git clone https://github.com/labex-labs/nodejs-example.git다운로드한 코드를
myapp디렉토리 바로 아래로 옮깁니다.mv nodejs-example/* . rm -rf nodejs-examplemyapp디렉토리에 다음과 같은 내용으로Dockerfile을 생성합니다:## Stage 1: Build the application FROM node:14-alpine AS base WORKDIR /app COPY . ./ RUN npm install ## Stage 2: Create the final image FROM node:14-alpine WORKDIR /app COPY --from=base /app/ . EXPOSE 3000 CMD [ "npm", "start" ]
요구 사항
챌린지를 완료하려면 다음 조건을 충족해야 합니다:
/home/labex/project경로 아래에myapp디렉토리를 생성해야 합니다.myapp디렉토리 안에 NodeJS 소스 코드를 클론해야 합니다.- 지정된 내용이 포함된
Dockerfile을myapp디렉토리에 작성해야 합니다.
도커 이미지 빌드
이 단계에서는 작성한 Dockerfile을 사용하여 이미지를 빌드합니다.
수행 과제
myapp이라는 이름의 새로운 이미지를 빌드하세요.
예시 가이드
다음은 수행해야 할 작업의 예시입니다:
docker build명령어를 사용하여myapp이라는 이름의 이미지를 빌드합니다.docker build -t myapp .docker images명령어를 통해 이미지가 성공적으로 생성되었는지 확인합니다.
요구 사항
챌린지를 완료하려면 다음 조건을 충족해야 합니다:
/home/labex/project/myapp디렉토리 내에서docker build명령어를 실행해야 합니다.- 이미지 이름은 반드시
myapp으로 설정해야 합니다.
도커 컨테이너 실행
이 단계에서는 빌드한 도커 이미지를 사용하여 컨테이너를 실행합니다.
수행 과제
myapp이미지를 사용하여 컨테이너를 실행하세요. 컨테이너 내부의3000번 포트를 호스트의3030번 포트로 연결 (포트 포워딩) 한 후, 브라우저에서 애플리케이션에 접속해야 합니다.
예시 가이드
다음은 수행해야 할 작업의 예시입니다:
my-app이라는 이름으로 새 도커 컨테이너를 시작합니다.docker run --name my-app -p 3030:3000 myapp웹 브라우저를 열고
http://localhost:3030으로 접속하여 애플리케이션이 정상 작동하는지 확인합니다.
요구 사항
챌린지를 완료하려면 다음 조건을 충족해야 합니다:
- 컨테이너 이름을
my-app으로 지정하여 실행해야 합니다. - 컨테이너 내부의
3000포트를 호스트의3030포트로 매핑해야 합니다.
요약
이 챌린지에서는 도커 멀티 스테이지 빌드를 사용하여 더 작고 효율적인 도커 이미지를 만드는 방법을 배웠습니다. Dockerfile에서 여러 단계를 활용하면 빌드 환경과 실행 환경을 완벽히 분리할 수 있으며, 결과적으로 최종 이미지의 용량을 획기적으로 줄일 수 있습니다. 이제 이러한 지식을 바탕으로 실제 프로젝트에서도 최적화된 도커 이미지를 직접 구축해 보시기 바랍니다.



