티스토리 뷰
728x90
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
728x90
댓글