รูปภาพ Docker - ประเภท Slim vs Slim-Stretch vs Stretch เทียบกับ Alpine


113

ฉันต้องการรับอิมเมจนักเทียบท่าเพื่อสร้างแอพ java และดูรูปแบบต่างๆของอิมเมจ OpenJDK ที่มีอยู่ ฉันกำลังดูที่นี่https://github.com/docker-library/openjdk/tree/master/8/jdkและเห็นอัลไพน์บางเฉียบและหน้าต่าง อะไรคือความแตกต่างระหว่างสิ่งเหล่านี้และแต่ละตัวแปรให้อะไร?



การอ่านFROMบรรทัดของ Dockerfiles ในลิงค์ที่คุณให้ก็เป็นข้อมูลเช่นกัน ภาพอัลไพน์มีขนาดเล็กกว่าภาพที่ใช้ Debian มาก แต่ยังสามารถพบปัญหาความเข้ากันได้ในรูปแบบต่างๆ
David Maze

1
นอกจากนี้ยังมีคำอธิบายในรูปภาพ README (จากหน้า Docker Hub ของรูปภาพ )
David Maze

คำตอบ:


109

ตามเอกสารห้องสมุดนักเทียบท่า (คำพูดและลิงค์ด้านล่าง) นี่คือบทสรุป:

  • openjdk:<version>

ภาพ defacto ใช้มันหากไม่แน่ใจ

  • openjdk:<version>-buster, openjdk:<version>-stretchและopenjdk:<version>-jessie

buster, jessieหรือstretchมีชื่อรหัสชุดสำหรับรุ่นของDebianและระบุปล่อยภาพที่อยู่บนพื้นฐานของ

  • openjdk:<version>-alpine

ในทำนองเดียวกันภาพนี้ใช้Alpine Linuxดังนั้นจึงเป็นภาพพื้นฐานที่มีขนาดเล็กมาก ขอแนะนำหากคุณต้องการขนาดภาพที่เล็กที่สุด ข้อแม้คือมันใช้ libs ที่ผิดปกติ แต่ไม่น่าจะเป็นปัญหาสำหรับซอฟต์แวร์ส่วนใหญ่ หากมีข้อสงสัยโปรดตรวจสอบเอกสารอย่างเป็นทางการด้านล่าง

  • openjdk:<version>(ตั้งแต่วันที่ 12 เป็นต้นไป) openjdk:<version>-oracleและopenjdk:<version>-oraclelinux7

เริ่มต้นด้วยopenjdk:12ภาพเริ่มต้นเช่นเดียวกับ-oracleและ-oraclelinux7สายพันธุ์ที่อยู่บนพื้นฐานของอย่างเป็นทางการของ Oracle Linux 7 ภาพ ไบนารี OpenJDK ในภาพเริ่มต้นเช่นเดียวกับ-oracleและ-oraclelinux7สายพันธุ์ที่ถูกสร้างขึ้นโดย Oracle และมีที่มาจากชุมชน OpenJDK

  • openjdk:<version>-slim

อิมเมจนี้มีเฉพาะแพ็กเกจขั้นต่ำที่จำเป็นในการรัน Java (และไม่มีไลบรารี Java ที่เกี่ยวข้องกับ UI จำนวนมากเป็นต้น) จนกว่าคุณจะได้ทำงานในสภาพแวดล้อมที่ซึ่งเพียงopenjdkภาพจะถูกนำไปใช้และคุณมีข้อ จำกัด ของพื้นที่, ภาพเริ่มต้นขอแนะนำมากกว่านี้

  • openjdk:<version>-windowsservercore

ภาพนี้จะขึ้นอยู่กับWindows Server หลัก (microsoft/windowsservercore )



เอกสารฉบับเต็ม ( รุ่นที่แสดงด้านล่างนี่ , รุ่นล่าสุดที่นี่ ):

รูปแบบรูปภาพ

openjdkภาพมาในรสชาติจำนวนมากในแต่ละที่ออกแบบมาสำหรับกรณีการใช้งานที่เฉพาะเจาะจง

openjdk:<version>

นี่คือภาพ defacto หากคุณไม่แน่ใจว่าความต้องการของคุณคืออะไรคุณอาจต้องการใช้สิ่งนี้ ได้รับการออกแบบมาเพื่อใช้เป็นคอนเทนเนอร์แบบทิ้ง (ติดตั้งซอร์สโค้ดของคุณและเริ่มคอนเทนเนอร์เพื่อเริ่มแอปของคุณ) รวมถึงฐานในการสร้างรูปภาพอื่น ๆ

แท็กเหล่านี้บางแท็กอาจมีชื่อเหมือนเจสซี่หรือยืด นี่คือชื่อรหัสชุดสำหรับการเผยแพร่ Debianและระบุว่าอิมเมจรุ่นใดใช้

openjdk:<version>-alpine

ภาพนี้จะขึ้นอยู่กับความนิยมของโครงการลินุกซ์อัลไพน์ที่มีอยู่ในภาพอย่างเป็นทางการ Alpine Linux มีขนาดเล็กกว่าอิมเมจฐานการกระจายส่วนใหญ่มาก (~ 5MB) ดังนั้นจึงนำไปสู่ภาพที่บางกว่าโดยทั่วไปalpine

ขอแนะนำให้ใช้ตัวแปรนี้เมื่อต้องการให้ขนาดภาพสุดท้ายเล็กที่สุด ข้อแม้หลักที่ควรทราบคือมันใช้musl libcแทนglibc และเพื่อนดังนั้นซอฟต์แวร์บางตัวอาจพบปัญหาขึ้นอยู่กับความลึกของข้อกำหนด libc อย่างไรก็ตามซอฟต์แวร์ส่วนใหญ่ไม่มีปัญหากับสิ่งนี้ดังนั้นตัวแปรนี้จึงเป็นตัวเลือกที่ปลอดภัยมาก ดูหัวข้อความคิดเห็นของ Hacker Newsสำหรับการสนทนาเพิ่มเติมเกี่ยวกับปัญหาที่อาจเกิดขึ้นและการเปรียบเทียบเชิงโปร / การเปรียบเทียบกับการใช้รูปภาพจาก Alpine

ในการย่อขนาดรูปภาพจึงเป็นเรื่องปกติที่เครื่องมือที่เกี่ยวข้องเพิ่มเติม (เช่นgitหรือbash) จะรวมอยู่ในรูปภาพที่ใช้อัลไพน์ ใช้ภาพนี้เป็นฐานเพิ่มสิ่งที่คุณต้องการใน Dockerfile ของคุณเอง (ดูalpineคำอธิบายภาพสำหรับตัวอย่างวิธีการติดตั้งแพ็คเกจหากคุณไม่คุ้นเคย)

openjdk:<version>-windowsservercore

ภาพนี้จะขึ้นอยู่กับWindows Server หลัก (microsoft/windowsservercore ) ด้วยเหตุนี้จึงใช้งานได้เฉพาะในสถานที่ที่มีอิมเมจเช่น Windows 10 Professional / Enterprise (Anniversary Edition) หรือ Windows Server 2016

สำหรับข้อมูลเกี่ยวกับวิธีทำให้ Docker ทำงานบน Windows โปรดดูคู่มือ "Quick Start" ที่เกี่ยวข้องซึ่งจัดทำโดย Microsoft:

openjdk:<version>-slim

อิมเมจนี้ติดตั้ง-headlessแพ็กเกจของ OpenJDK ดังนั้นจึงไม่มีไลบรารี Java ที่เกี่ยวข้องกับ UI จำนวนมากและแพ็กเกจทั่วไปบางส่วนที่มีอยู่ในแท็กดีฟอลต์ ประกอบด้วยแพ็คเกจขั้นต่ำที่จำเป็นในการรัน Java เท่านั้น จนกว่าคุณจะได้ทำงานในสภาพแวดล้อมที่ซึ่ง เพียงopenjdkภาพจะถูกนำไปใช้และคุณมีพื้นที่ จำกัด เราขอแนะนำให้ใช้ภาพเริ่มต้นของพื้นที่เก็บข้อมูลนี้


1

เลือกภาพนักเทียบท่าพื้นฐานที่เหมาะกับความต้องการของคุณและโปรดทราบว่าขนาดภาพก็เป็นสิ่งสำคัญเช่นกัน

รูปภาพถือได้ว่าเป็นชุดคำแนะนำในการสร้างคอนเทนเนอร์ ใน Docker ภาพหนึ่งอาจได้รับการสืบทอดจาก (หรืออิง) อีกภาพหนึ่งโดยเพิ่มคำแนะนำเพิ่มเติมที่ด้านบนของภาพฐาน แต่ละภาพประกอบด้วยหลายเลเยอร์ซึ่งไม่เปลี่ยนรูปได้อย่างมีประสิทธิภาพ

โปรดอ่านบทความการสร้างขั้นตอนการสร้าง Java Docker ที่สมบูรณ์แบบ

ขนาดของภาพ Docker มีความสำคัญมาก ขนาดมีผลกระทบต่อ:

  • เวลาแฝงของเครือข่าย : ต้องถ่ายโอนอิมเมจนักเทียบท่าผ่านเว็บ
  • การจัดเก็บ : จำเป็นต้องเก็บบิตเหล่านี้ไว้ที่ใดที่หนึ่ง
  • ความพร้อมใช้งานและความยืดหยุ่นของบริการ : เมื่อใช้ตัวกำหนดตารางเวลา Docker เช่น Kubernetes, Swarm, Nomad, DC / OS หรืออื่น ๆ (ตัวกำหนดตารางเวลาสามารถย้ายคอนเทนเนอร์ระหว่างโฮสต์ได้)
  • ความปลอดภัย : จริงๆแล้วฉันหมายถึงต้องการแพ็คเกจ libpng ที่มีช่องโหว่ CVE ทั้งหมดสำหรับแอปพลิเคชัน Java ของคุณหรือไม่
  • ความคล่องตัวในการพัฒนา : อิมเมจ Docker ขนาดเล็ก == สร้างเวลาได้เร็วขึ้นและปรับใช้งานได้เร็วขึ้น


ในการเรียกใช้แอปพลิเคชัน java คุณต้องมี 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เพื่อดูเลเยอร์ทั้งหมด (และขนาด) ที่ทำให้รูปภาพของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.