# 최적화해 컨테이너 빌드하기(멀티 스테이지 빌드)
지금까지의 빌드 방법은 이미지 용량이 커지거나 빌드과정이 번거로운 등의 단점이 있었다. 멀티 스테이지 빌드(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
출처:
"컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 조훈,심근우,문성주 지음/길벗출판사" 책을 기반으로 실습한 내용입니다.
'DevOps > 도커(Docker)' 카테고리의 다른 글
깃허브 액션으로 도커 이미지 build, push 해보기 (1) | 2023.06.19 |
---|---|
쿠버네티스에서 도커 이미지 구동하기 (0) | 2022.06.13 |
도커 컨테이너 이미지 만들기 3 - 컨테이너 내부에서 컨테이너 빌드하기 (0) | 2022.06.13 |
도커 컨테이너 이미지 만들기 2 - 컨테이너 용량 줄여 빌드하기 (0) | 2022.06.13 |
도커 컨테이너 이미지 만들기 1 - 기본 방법으로 빌드하기 (1) | 2022.06.03 |