본문 바로가기

DevOps/도커(Docker)

도커 컨테이너 이미지 만들기 4 - 멀티 스테이지 빌드

# 최적화해 컨테이너 빌드하기(멀티 스테이지 빌드)

지금까지의 빌드 방법은 이미지 용량이 커지거나 빌드과정이 번거로운 등의 단점이 있었다. 멀티 스테이지 빌드(Multi-Stage Build) 방법은 최종 이미지의 용량을 줄일 수 있고 호스트에 어떠한 빌드 도구도 설치할 필요가 없다.

도커파일 작성 > 도커파일 빌드 > 빌드완료

멀티 스테이지는 docker-ce 17.06 버전부터 지원된다.

 

 

1. 파일 살펴보기

 

 

 

2. Dockerfile 확인

# 1단계: 자바 소스를 빌드해 JAR로 만듦
FROM openjdk:8 AS int-build  # openjdk 이미지에 int-build라는 별칭을 붙임
LABEL description="Java Application builder" 
RUN git clone <https://github.com/iac-source/inbuilder.git>
WORKDIR inbuilder
RUN chmod 700 mvnw
RUN ./mvnw clean package

# 2단계: 빌드된 JAR을 경량화 이미지에 복사함
FROM gcr.io/distroless/java:8
LABEL description="Echo IP Java Application"
EXPOSE 60434
COPY --from=int-build inbuilder/target/app-in-host.jar /opt/app-in-image.jar 
# int-build(openjdk)에서 빌드가 완성된 app-in-host.jar을 distroless에 /opt/app-in-image.jar 로 복사
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]

 

 

 

3. Dockerfile을 호출해서 컨테이너 이미지를 빌드한다.

$ docker build -t multistage-img .

 

 

 

4. 기존 이미지와 용량 비교

$ docker images | head -n 3

멀티 스테이지로 빌드된 컨테이너 이미지의 용량을 확인하면 optimal-img와 같다. 두 컨테이너 이미지는 빌드 단계가 같고 자바 소스를 호스트에서 빌드했느냐, 컨테이너에서 빌드했느냐의 차이밖에 없다.

 

 

 

5. 댕글링 이미지 삭제

$ docker rmi $(docker images -f dangling=true -q)

앞서 확인한 컨테이너 이미지 중에 <none> 으로 표시되는 이미지가 있다. 이름이 없는 이런 이미지를 댕글링(dangling) 이미지라고 한다. 멀티 스테이지 과정에서 자바 소스를 빌드하는 과정에 생성된 이미지로 보면 된다. 공간을 적게 사용하는 이미지를 만드는 것이 목적이므로 댕글링 이미지(dangling=true)를 삭제한다.

 

 

 

6. 컨테이너 작동 확인

# 컨테이너 실행
$ docker run -d -p 60434:80 --name multistage-run --restart always multistage-img

# 외부 요청 응답 확인
$ curl 127.0.0.1:60434

 

 

 

7. 컨테이너 삭제

$ docker rm -f multistage-run

 

 

 

 

출처:

"컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 조훈,심근우,문성주 지음/길벗출판사" 책을 기반으로 실습한 내용입니다.