2 분 소요

4.3 4가지 방법으로 컨테이너 이미지 만들기

4.3.1 기본 방법으로 빌드하기

자바소스 빌드 -> 도커파일 작성 -> 도커파일 빌드 -> 빌드 완료

  • 도커 빌드에 사용 된 Dockerfile은 DSL로 작성된 파일이다.
    FROM openjdk:8
    LABEL description="Echo IP Java Application"
    EXPOST 60431
    COPY ./abc.jar /opt/abc.jar
    WORKDIR /opt
    ENTRYPOINT ["java", "-jar", "abc.jar"]
    
  도커 파일 내용 배시 명령으로 유사 해석 설명
1 FROM openjdk:8 import openjdk:8 image openjdk를 기초 이미지로 사용한다.
2 LABEL description=”Echo IP Java Application” Label_desc=”Echo IP Java Application” 이미지에 부가적인 설명을 위한 레이블을 추가할 떄 사용
3 EXPOST 60431 EXPOST=60431 사용할 포트
4 COPY ./abc.jar /otp/abc.jar scp ./target/abc.jar /opt/abc.jar 컨테이너 이미지로 필요한 파일 복사
5 WORKDIR /opt cd /opt 이미지의 현재 작업 위치를 opt로 변경
6 ENTRYPOINT [“java”, “-jar”, “abc.jar”] ./java -jar .abc.jar abc.jar를 java -jar 명령어를 통해 실행
# 생성한 이미지 확인
docker images basic-img
# 1.0 태그 이미지 생성
docker build -t basic-img:1.0
# sed를 이용한 Dockerfile 내용 중 일부 수정
sed -i 's/Application/Development/' Dockerfile

# 버전이 중복 되지 않도록 태그 2.0 으로 사용
docker build -t basic-img:2.0 .
# 컨테이너 동작
docker run -d -p 60431:80 --name basic-run --restart always basic-img

4.3.2 컨테이너 용량 줄이기

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

Dockerfile

FROM gcr.io/distroless/java:8 # 자바 실행을 위해 설계 된 가벼운 이미지
LABEL description="Echo IP Java Application"
EXPOST 60432
COPY ./abc.jar /opt/abc.jar
WORKDIR /opt
ENTRYPOINT ["java", "-jar", "abc.jar"]
  • Dockerfile 에서 변경 된 FROM 에 distroless 는 자바 실행으 위해 경량화 된 이미지이다.

용량을 줄여 빌드한 컨테이너 이미지와 원래 빌드한 이미지를 비교.

# 현재 새로 생성된 이미지만 볼 수 있게 head -n 3 옵션을 추가
docker images | head -n 3
REPOSITORY      TAG     SIZE
optimal-img     latest  145MB
basic-img       latest  528MB

# 정상 작동하는지 확인
docker run -d -p 60432:80 --name optimal-run --restart always optimal-img

4.3.3 컨테이너 내부에서 컨테이너 빌드하기

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

FROM openjdk:8
LABEL description="Echo IP Java Application"
EXPOST 60433
RUN git clone https://github.com/iac-source/inbuilder.git # 이미지 내부에서 실행하기 위해 RUN을 추가
WORKDIR inbuilder # git clone으로 내려받은 디렉터리 현재 작업 공간으로 설정
RUN chmod 700 mvnw # mvnw에 실행 권한 설정
RUN ./mvnw clean package # 메이븐 래퍼로 JAR 빌드
RUM mv target/abc.jar /opt/abc.jar # 빌드된 jar를 옮김
WORKDIR /opt
ENTRYPOINT ["java", "-jar", "abc.jar"]
# docker 파일 빌드
docker build -t nohost-img
# 정상 작동 확인
docker run -d -p 60433:80 --name nohost-run --restart always nohost-img
# 빌드한 컨테이너 삭제
docker rm -f optimal-run
docker rm -f basic-run
docker rm -f nohost-run

4.3.4 최적화해 컨테이너 빌드하기

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

  • 멀티 스테이지 빌드은 최종 이미지의 용량을 줄일 수 있고 호스트에 어떠한 빌드 도굴르 설치할 필요도 없다.

  • docker-ce 17.06 버전 부터 지원한다.

Dockerfile

# 1단계: 자바 소스를 빌드해 JAR로 만든다.
FROM openjdk:8 AS int-build # openjdk 이미지에 별칭을 붙인다.`
LABEL description="Echo IP Java Application"
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/abc.jar /opt/abc.jar # 1단계에서 빌드가 완성된 jar를 distroless에 복사 함
WORKDIR /otp
ENTRYPOINT ["java", "-jar", "abc.jar"]
docker build -t multistage-img
  • 컨테이너 이미지 중에 으로 표시되는 이미지가 있다, 이런 이미지를 댕글링 이미지라고 한다.
  • 멀티 스테이지 과정에서 자바 소스를 빌드하는 과정에 생성 된 이미지로, 불필요한 이미지이기에 삭제 한다.
    docker rmi $(docker images -f danling=true -q)
    
    # 정상 작동 확인
    docker run -d -p 60434:80 --name multistage-run --restart always multistage-img
    
    # 그동안 빌드한 컨테이너 삭제
    docker rm -f optimal-run
    docker rm -f basic-run
    docker rm -f nohost-run
    docker rm -f multistage-run