본문 바로가기

DevOps/도커(Docker)

도커 컨테이너 이미지 만들기 2 - 컨테이너 용량 줄여 빌드하기

# 컨테이너 용량 줄여 빌드하기

불필요한 공간을 점유하는 건 비용 낭비이기도 하지만, 성능에 영향을 미칠 수 있다. 이번에는 컨테이너 이미지의 용량을 줄여 빌드하는 방법을 알아보자.

# 컨테이너 용량을 줄여 빌드하는 과정
도커파일 작성 > 도커파일 빌드 > 빌드 완료

기본 방법보다 1단계가 줄고, 기초 이미지가 openjdk에서 GCR(Google Container Registery)에서 제공하는 distroless로 변경된다.

 

 

1. 디렉터리 살펴보기

기존 방법과 비교하면 build-in-host.sh 라는 추가된 파일이 있다.

 

 

 

2. build-in-host.sh 확인

#!/usr/bin/env bash
sudo apt install -y openjdk-8-jdk
./mvnw clean package
docker build -t optimal-img .

기존 방법으로 진행한 내용을 스크립트로 작성한것으로 특별한 내용은 없다.

 

 

 

3. Dockerfile 살펴보기

FROM gcr.io/distroless/java:8        # 자바 실행을 위해 설계된 가벼운 이미지
LABEL description="Echo IP Java Application"
EXPOSE 60432     # 노출되는 포트의 중복을 파하고자 변경함
COPY ./target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]

사용되는 기초 이미지가 openjdk에서 gcr.io/distroless/java(앞으로는 distroless로 줄여 표기)로 변경되었다. distroless는 자바 실행을 위해 경량화된 이미지이다. 기본 방법으로 openjdk 이미지를 설치할 때 호스트에 자바 개발 도구인 openjdk-8-jdk도 함께 설치했다. 그리고 자바 소스를 빌드해서 실행가능한 바이너리인 JAR를 만들어 COPY 명령으로 새롭게 만들어질 컨테이너 이미지(optimal-img)에 보냈다. 따라서 이 과정에서 openjdk 이미지에 포함된 자바 개발 도구는 불필요하게 낭비되는 공간이다.

 

 

 

4. 경량화 이미지를 빌드하기 전에 메이븐에 실행 권한을 부여한다.

$ sudo chmod 700 mvnw

 

 

5. build-in-host.sh를 실행해 경량화 이미지를 빌드한다.

$ ./build-in-host.sh

 

 

 

6. 용량 비교

$ docker images | head -n 3

새로 생성된 이미지가 기존 이미지보다 작다.

 

 

 

7. 컨테이너 작동 확인

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

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

 

 

 

8. 컨테이너 삭제

$ docker rm -f optimal-run

openjdk 이미지에 개발 도구가 포함돼 있는데, 왜 openjdk를 호스트에 설치해서 빌드하고 COPY로 넘기는 번거로운 과정을 진행할까? 기초 이미지인 openjdk에서 자바소스를 빌드하면 어떻게 되는지 확인해보자.

 

 

 

 

 


https://dodo-devops.tistory.com/22

 

도커 컨테이너 이미지 만들기 3 - 컨테이너 내부에서 컨테이너 빌드하기

# 컨테이너 내부에서 컨테이너 빌드하기 번거로운 과정없이 바로 자바 소스를 컨테이너 이미지에서 빌드해보자. 도커파일 작성 > 도커파일 빌드 > 빌드완료 1. 파일 살펴보기 FROM openjdk:8 LABEL descr

dodo-devops.tistory.com

 

 

출처:

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