4일차_ 멀티 스테이지 빌드

최지웅·2024년 9월 18일
0

인프라

목록 보기
7/19

4-1. Dockerfile이 있는데 빌드 서버가 필요할 까?
1. 멀티 스테이지 빌드: 복잡한 앱을 하나의 dockerfile 스크립트로 빌드가능.

FROM diamol/base AS build-stage
RUN echo 'Building...' > /build.txt #파일 생성. 

FROM diamol/base AS test-stage
COPY --from=build-stage /build.txt /build.txt # 앞선 스테이지 파일을 현재 스테이지로 복사
RUN echo 'Testing...' >>> /build.txt

FROM diamol/base
COPY --from=test-stage /build.txt /build.txt # 앞선 스테이지 파일을 현재 스테이지로 복사
CMD cat /build.txt
  • 각 빌드 단계는 FROM 인스트럭션으로 시작되며, 필요한 경우 AS로 이름을 붙임. 각 빌드 단계는 독립적으로 실행되지만, 앞서서 만들어진 디렉터리나 파일을 복사할 수 있다. --from인자는 앞선 빌드 단계에서의 파일임을 알려준다.
  • RUN은 빌드 중에 컨테이너 안에서 명령을 실행한 뒤 그 결과를 이미지 레이어에 저장.
cd ch04/exercises/multi-stage
docker image build -t multi-stage .
  • 위 코드가 있는 디렉에서 터미널 열고 멀티 스테이지 빌드가 적용된 스크립트로 이미지 빌드하는 코드. 즉 -t로 실행할 이미지가 멀티 스테이지임을 알리고 .로 현재 스크립트 전부 실행.
  • 빌드 서버에 도커만 설치되어있다면 즉시 개발 환경을 갖출 수 있고 중앙 집중적으로 관리 가능.

4-2. 애플리케이션 빌드 실전 예제: 자바 소스 코드

FROM diamol/maven AS builder

WORKDIR /usr/src/iotd
COPY pom.xml .
RUN mvn -B dependency:go-offline # 메이븐 실행에 필요한 의존 모듈 다운

COPY . . # 도커 빌드중인 디렉토리에 위치한 모든 파일과 서브 디렉을 이미지 내 작업 디렉으로 복사
RUN mvn package # 자바 소스코드를 jar 포멧 어플리케이션으로 만듬.

# app
FROM diamol/openjdk # 자바 11 Runtime포함, maven은 미포함 상태의 파일

WORKDIR /app
COPY --from=builder /usr/src/iotd/target/ioid-service-0.1.0.jar . #멀티 스테이지인 builder(diamol/maven)에서 생성한 jar파일을 복사

EXPOSE /80 # 80번 포트를 외부로 공개(웹 서버 어플리케이션)
ENTRYPOINT ["java", "-jar", "/app/iotd-service-0.1.0.jar"] # CMD와 같은 기능으로, 위 이미지를 이용하여 컨테이너 실행 시 도커가 위 명령을 실행하며 java -jar /app/iotd-service-0.1.0.jar이 실행되며 어플을 빌드
  • spring boot기반 환경으로 가정. FROM이 여러개니 멀티 스테이지 빌드.
  • WORKDIR로 작업할 디렉토리를 만든 다음, 메이븐에서 수행할 빌드 절차가 정의된 파일인 pom.xml을 복사한다.
  • 아래는 위 이미지 빌드 코드
cd ch04/exercises/image-of-the-day
docker image build -t image-of-the-day .
  • 컨테이너 실행 시 부여되는 가상 네트워크의 가상 ip로 통신하는데, 아래와 같이 관리가 가능하다. 아래의 코드는 localhost:800/image로 접근 가능하다.
docker network create nat
docker container run --name iotd -d -p 800:80 --network nat image-of-the-day # 컨테이너의 80번 포트를 호스트의 800번 포트에 공개하고 nat 네트워크에 컨테이너를 접속하라.
  • 앱 이미지에는 도커파일의 빌드 단계 중 마지막 단계의 콘텐츠만 포함되기에 빌드 도구는 포함되지 않는다. 만약 추가적으로 포함하고 싶은게 있다면 최종단계에서 따로 처리해야한다.

4-2. 애플리케이션 빌드 실전 예제: Node.js 소스 코드

  • Node.js는 자바앱과는 달리 인터프리터 언어이기에 컴파일 절차가 필요없다. 다만 멀티 스테이지 빌드를 통해 의존 모듈 로딩 최적화가 가능하다.
FROM diamol/node AS builder # node.js 런타임과 npm이 현재 설치된 이미지

WORKDIR /src # 작업 디렉을 만들고
COPY src/package.json . # 이미지 내 json을 작업 디렉에 복사

RUN npm install # 모든 의존 모듈을 내려받는다??? 로 아마 아래의 server.js가 생긴듯

#app
FROM diamol/node # 멀티 스테이지

EXPOSE 80 # 포트 공개 80번(호스트에게)
CMD ["node", "server.js"] # node server.js를 실행

WORKDIR /app # 작업 디렉 따로 만들고

COPY --from=builder /src/node_modules/ /app/node_modules/ # 생성된 노드 모듈들을 복사
COPY src/ . # 작업디렉의 내용을 복사

빌드코드

cd ch04/exercises/access-log
docker image build -t access-log .
docker container run --name accesslog -d -p 801:80 --network nat access-log

4-4. 애플리케이션 빌드 실전 예제: Go 소스 코드

profile
이제 3학년..

0개의 댓글