티스토리 뷰

Docker Linux 종류

<version>

adoptopenjdk/openjdk8
  • 위와 같이 이미지의 버전만 명시한 것을 의미한다.
  • 사실상 모든것의 기반 이미지이다.
  • 무슨 이미지를 선택할지 모르겠다면 이 이미지를 사용하면 된다.
  • 다른 이미지를 만들기 위한 기반 이미지로 사용하거나 소스 코드 배포 후 실행하는 컨테이너로 사용된다.
  • jessie, stretch 와 같은 태그는 Debian리눅의 릴리즈명을 의미한다.

<version>-alpine

adoptopenjdk/openjdk8:alpine
  • 알파인 리눅스를 기반으로 만들어 짐.
  • 알파인 리눅스는 가볍고 간단하고 보안성을 목적으로 개발한 리눅스 배포판
  • 용량이 80M인 경량화된 배포판이므로 Embbeded 나 네트웍 서버등 특정 용도에 적합하며 특히 도커(docker)에 채택되어 5M 크기의 리눅스 이미지로 유명함.

 <version>-slim

  • openjdk의 -headless패키지를 사용.
    • -headless: 최소한의 자바 런타임 환경으로 자바 GUI프로그램 실행이 아닐경우 사용.
  • 자바 런타임 환경에서 필요한 최소한의 패키지만 설치되어 있음.
  • openjdk만 사용되고 공간 제약이 있는 경우가 아니면 기본 이미지 사용을 추천.

Dockerfile 작성 모범 사례

구성 최소화

  • docker의 경우 컨테이너 오케스트레이션으로 사용되므로 scale in/out시 빠른 배포를 위하여 최소한으로 구성하는 것이 좋음.
  • 복잡도, 의존성을 고려해 앱 실행이 가능한 최소한의 패키지만 설치하는 것이 좋다.

.dockerignore 사용

  • .dockerignore를 사용하면 빌드시 필요없는 파일들을 무시할 수 있음. (.gitignore와 같은 맥락)
  • 빌드시 필요없는 폴더들을 제외하여 빌드 성능을 높일 수 있음.
  • 자바 프로젝트의 경우 빌드된 폴더(build 폴더), 컴파일러가 자동생성한 클래스 파일(generated 폴더), 임시폴더가 해당될수있음.

빌드 레이어 최소화

  • docker가 이미지를 빌드시에 레이어란 개념을 사용함.
  • 컨테이너 내의 파일 변경, 명령어의 줄수에따라 레이어가 생성되며 레이어를 최소화를 통해 용량을 줄일수 있음.
  • docker 빌드 레이어는 history명령어로 확인 가능함.
docker history <image id>

명령어 최소화

  • 위에 말한것과 같이 명령어 줄수에 따라 레이어가 생성됨.
  • 명령어 최소화로 용량을 줄일 수 있음.

 

  • 명령어 동시에 사용
  • 명령어를 여러줄로 나눠쓰면 그만큼 레이어가 생긴다.
FROM adoptopenjdk/openjdk8:alpine-jre
RUN echo 'this'
RUN echo 'that'
docker build -talpine-test . -- buile
 
 
docker history adc3d6559b6d -- show history
 
 
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
adc3d6559b6d        11 minutes ago      /bin/sh -c echo 'that'                          0B
55498dd55263        11 minutes ago      /bin/sh -c echo 'this'                          0B
b8efe9daa3b4        4 days ago          /bin/sh -c #(nop)  ENV JAVA_HOME=/opt/java/o…   0B
 
 
-- 레이어가 2개 생김
  • 위와 같이 RUN을 나눠서 사용하면 레이어가 2개가 생기므로 그만큼 용량이 늘어남 (현재 echo만 사용하여 size가 0으로 측정됨)
  • RUN을 연속으로 사용시 한줄로 사용한다.
FROM mdock.daumkakao.io/adoptopenjdk/openjdk8:alpine-jre
RUN echo 'this' \
    && echo 'that'
docker build -talpine-test . -- buile
 
 
docker history a8fb0d076c33 -- show history
 
 
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
a8fb0d076c33        37 seconds ago      /bin/sh -c echo 'this'     && echo 'that'       0B
b8efe9daa3b4        4 days ago          /bin/sh -c #(nop)  ENV JAVA_HOME=/opt/java/o…   0B
 
 
-- 레이어가 2개에서 하나로 줄었음.

ADD vs COPY

  • add와 copy 모두 호스트의 파일을 컨테이너 내부로 복사하는 기능은 같지만 세부 사항이 다름.
    • copy: 호스트 파일을 복사하는 기능만 수행함.
    • add: copy기능을 포함, http 파일의 다운로드 및 tar/zip 압축해제를 자동으로 해준다.
  • add사용시 가독성이 떨어지므로 copy사용 권장.

출처

https://trylhc.tistory.com/entry/Dockerfile-Best-Practice
https://devthomas.tistory.com/4
https://stackoverflow.com/questions/54954187/docker-images-types-slim-vs-slim-stretch-vs-stretch-vs-alpine
https://stackoverflow.com/questions/24280872/difference-between-openjdk-6-jre-openjdk-6-jre-headless-openjdk-6-jre-lib
https://www.lesstif.com/pages/viewpage.action?pageId=35356819

댓글