[java] Docker 이미지-유형. 슬림 vs 슬림 스트레치 vs 스트레치 vs 알파인

Java 앱을 빌드하고 사용 가능한 OpenJDK 이미지의 변형을 살펴보기 위해 도커 이미지를 선택하려고합니다. 나는 여기 https://github.com/docker-library/openjdk/tree/master/8/jdk를 찾고 있으며 알파인, 슬림 및 창을 봅니다. 이들의 차이점은 무엇이며 각 변형은 무엇을 제공합니까?



답변

Docker 라이브러리 문서 (아래 인용문 및 링크)에 대한 요약은 다음과 같습니다.

  • openjdk:<version>

사실상의 이미지. 확실하지 않은 경우 사용하십시오.

  • openjdk:<version>-buster, openjdk:<version>-stretchopenjdk:<version>-jessie

buster, jessie또는 stretch의 릴리스에 대한 스위트 코드 이름입니다 데비안 하고있는 표시 해제 이미지를 기반으로.

  • openjdk:<version>-alpine

마찬가지로이 이미지는 Alpine Linux를 기반으로 하므로 매우 작은 기본 이미지입니다. 가능한 한 작은 이미지 크기가 필요한 경우 권장합니다. 주의 할 점은 비정상적인 라이브러리를 사용하지만 대부분의 소프트웨어에 문제가되지 않는다는 것입니다. 확실하지 않은 경우 아래 공식 문서를 확인하십시오.

  • openjdk:<version>(이후 12), openjdk:<version>-oracleopenjdk:<version>-oraclelinux7

openjdk:12기본 이미지 부터 시작 하여 -oracle-oraclelinux7변형은 공식 Oracle Linux 7 이미지를 기반으로합니다 . 기본 이미지의 OpenJDK 바이너리 -oracle와 및 -oraclelinux7변형은 Oracle에서 빌드하며 OpenJDK 커뮤니티 에서 제공합니다 .

  • openjdk:<version>-slim

이 이미지에는 Java를 실행하는 데 필요한 최소한의 패키지 만 포함되어 있습니다 (예를 들어 많은 UI 관련 Java 라이브러리가 누락 됨). 어디 환경에서 작업하지 않는 경우에만openjdk 이미지를 배포 할 당신은 공간 제약이 기본 이미지는이 중 하나 이상을 권장합니다.

  • openjdk:<version>-windowsservercore

이 이미지는 Windows Server Core ( microsoft/windowsservercore)를 기반으로 합니다 .


전체 문서 ( 아래에 표시된 버전 , 여기최신 버전 ) :

이미지 변형

openjdk이미지가 많은 맛, 특정 사용 케이스를 위해 디자인 된 각 들어온다.

openjdk:<version>

이것은 사실상의 이미지입니다. 필요한 것이 무엇인지 확실하지 않은 경우 이것을 사용하는 것이 좋습니다. 폐기 컨테이너 (소스 코드를 마운트하고 컨테이너를 시작하여 앱을 시작)와 다른 이미지를 빌드하기위한 기반으로 모두 사용하도록 설계되었습니다.

이러한 태그 중 일부에는 jessie 또는 stretch와 같은 이름이있을 수 있습니다. Debian 릴리스의 제품군 코드 이름이며
이미지의 기반이되는 릴리스를 나타냅니다.

openjdk:<version>-alpine

이 이미지는 인기를 기반으로 알파인 리눅스 프로젝트 에서 사용할 수, 공식 이미지 . Alpine Linux는 대부분의 배포 기본 이미지 (~ 5MB)보다 훨씬 작으므로 일반적으로 이미지가 훨씬 더 얇아집니다.alpine

이 변형은 최종 이미지 크기가 최대한 작아야 할 때 적극 권장됩니다. 주의해야 할 주요주의 사항은 glibc 및 friends 대신 musl libc 를 사용 하므로 특정 소프트웨어는 libc 요구 사항의 깊이에 따라 문제가 발생할 수 있다는 것입니다. 그러나 대부분의 소프트웨어에는 문제가 없으므로이 변형은 일반적으로 매우 안전한 선택입니다. 발생할 수있는 문제와 알파인 기반 이미지 사용의 장단점 비교에 대한 자세한 내용은 이 Hacker News 댓글 스레드 를 참조하세요 .

이미지 크기를 최소화하기 위해 추가 관련 도구 (예 : git또는 bash)가 Alpine 기반 이미지에 포함되는 경우는 드뭅니다 . 이 이미지를 기본으로 사용하여 고유 한 Dockerfile에 필요한 항목을 추가합니다 ( 익숙하지 않은 경우 패키지 설치 방법에 대한 예제 는 alpine이미지 설명 참조 ).

openjdk:<version>-windowsservercore

이 이미지는 Windows Server Core ( microsoft/windowsservercore)를 기반으로 합니다 . 따라서 Windows 10 Professional / Enterprise (Anniversary Edition) 또는 Windows Server 2016과 같이 이미지가 수행되는 위치에서만 작동합니다.

Windows에서 Docker를 실행하는 방법에 대한 자세한 내용은 Microsoft에서 제공하는 관련 “빠른 시작”가이드를 참조하십시오.

openjdk:<version>-slim

이 이미지는 -headlessOpenJDK 패키지를 설치 하므로 많은 UI 관련 Java 라이브러리와 기본 태그에 포함 된 일부 공통 패키지가 누락되었습니다. Java를 실행하는 데 필요한 최소한의 패키지 만 포함되어 있습니다. 어디 환경에서 작업하지 않는
경우에만openjdk 이미지를 배포 할하고 공간 제약을 가지고, 우리는 매우이 저장소의 기본 이미지를 사용하는 것이 좋습니다.


답변

사용자의 요구에 맞는 기본 고정 표시기 이미지를 선택 하고 있음을 명심하시기 바랍니다 이미지 크기가 입니다 중요한 측면은 도.

이미지는 컨테이너를 만드는 방법에 대한 일련의 지침으로 간주 할 수 있습니다. Docker에서 한 이미지를 다른 이미지에서 상속 (또는 기반)하여 기본 이미지 위에 추가 지침을 추가 할 수 있습니다. 각 이미지는 사실상 변경 불가능한 여러 레이어로 구성됩니다.

Plase 는 완벽한 Java Docker 빌드 흐름 작성 기사를 읽었습니다 .

Docker 이미지 크기는 실제로 매우 중요합니다. 크기는 다음에 영향을 미칩니다.

  • 네트워크 지연 : 웹을 통해 Docker 이미지를 전송해야 함
  • 저장 :이 모든 비트를 어딘가에 저장해야합니다.
  • 서비스 가용성 및 탄력성 : Kubernetes, Swarm, Nomad, DC / OS 또는 기타와 같은 Docker 스케줄러를 사용할 때 (스케줄러는 호스트간에 컨테이너를 이동할 수 있음)
  • 보안 : 정말로, Java 애플리케이션에 대한 모든 CVE 취약성이있는 libpng 패키지가 정말로 필요합니까?
  • 개발 민첩성 : 작은 Docker 이미지 == 더 빠른 빌드 시간과 더 빠른 배포

자바 애플리케이션을 실행하려면 최소한 JRE가 필요합니다. 예를 들어 봄 프로젝트의 경우 이미지는 다음을 기반으로 할 수 있습니다 slim Alpine Linux with OpenJDK JRE.

#simple dockerFile for java app:

#here we are using Base Alpine Linux based image with OpenJDK JRE only
#For Java 8, try this
FROM openjdk:8-jre-alpine

#For Java 11, try this
#FROM adoptopenjdk/openjdk11:alpine-jre

#copy application WAR/JAR (with libraries inside)
COPY target/spring-boot-*.war/jar yourName.war/jar
# specify default command
CMD ["/usr/bin/java", "-jar", "/yourName.war/jar"]

또한를 사용 docker history yourImageName하여 이미지를 만드는 모든 레이어 (및 해당 크기)를 볼 수 있습니다.


답변