ความแตกต่างระหว่างการบันทึกและการส่งออกในนักเทียบท่าคืออะไร


157

ฉันเล่นกับDockerสักสองสามวันแล้วฉันก็สร้างรูป (ซึ่งสนุกจริงๆ!) ตอนนี้ผมต้องการที่จะยังคงมีอยู่และการทำงานของฉันมาถึงsaveและexportคำสั่ง แต่ผมไม่เข้าใจพวกเขา

ความแตกต่างระหว่างsaveและexportในนักเทียบท่าคืออะไร?


4
ฉันยังเขียนโพสต์บล็อกเกี่ยวกับสิ่งนี้ที่tuhrig.de/difference-between-save-and-export-in-docker
Thomas Uhrig

คำตอบ:


169

คำตอบสั้น ๆ คือ:

  • saveจะดึงรูปภาพ: สำหรับ VM หรือเซิร์ฟเวอร์จริงนั่นคือการติดตั้งอิมเมจหรือดิสก์ ISO ระบบปฏิบัติการพื้นฐาน

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

  • exportจะดึงข้อมูลคอนเทนเนอร์ทั้งหมด: เหมือนกับสแน็ปช็อตของ VM ปกติ บันทึกระบบปฏิบัติการแน่นอน แต่ยังมีการเปลี่ยนแปลงใด ๆ ที่คุณทำไฟล์ข้อมูลใด ๆ ที่เขียนในช่วงชีวิตของภาชนะ อันนี้เหมือนกับการสำรองข้อมูลแบบเดิม

    มันจะให้ไฟล์. tar แบบแบนที่มีระบบไฟล์ของคอนเทนเนอร์ของคุณ

แก้ไข: เนื่องจากคำอธิบายของฉันอาจยังทำให้เกิดความสับสนฉันคิดว่ามันเป็นสิ่งสำคัญที่จะต้องเข้าใจว่าหนึ่งในคำสั่งเหล่านี้ทำงานกับคอนเทนเนอร์ในขณะที่คนอื่นทำงานกับรูปภาพ

  • ภาพจะต้องมีการพิจารณาว่าเป็น 'ตาย' หรือเปลี่ยนรูปเริ่มต้น 0 1000 หรือภาชนะบรรจุจากมันจะไม่เปลี่ยนแปลง byte เดียว นั่นเป็นเหตุผลที่ฉันทำการเปรียบเทียบกับระบบการติดตั้ง ISO ก่อนหน้านี้ มันอาจจะใกล้เคียงกับไลฟ์ซีดีมากขึ้น

  • ภาชนะ "รองเท้า" ภาพและเพิ่มชั้นด้านบนของมัน เลเยอร์นี้เก็บการเปลี่ยนแปลงใด ๆ บนคอนเทนเนอร์ (ไฟล์ที่สร้าง / เปลี่ยนแปลง / ลบ ... )


2
เพื่อความชัดเจนของฉัน: สมมติว่าฉันมีคอนเทนเนอร์ที่ใช้งานซึ่งฉันทำการเปลี่ยนแปลงบางอย่าง (เช่นฉันสร้างโฟลเดอร์ใหม่) ตอนนี้ฉันสามารถสร้างภาพของคอนเทนเนอร์นี้ (พร้อมdocker commit) ฉันสามารถsaveภาพ หรือฉันสามารถexportคอนเทนเนอร์โดยตรง และทั้งสองวิธี ( saveรูปภาพและexportคอนเทนเนอร์) จะมีผลลัพธ์เหมือนกันหรือไม่
โทมัส Uhrig

2
ใช่และไม่. exportจะทำให้คุณแบน .tar เก็บที่มีระบบแฟ้มภาชนะของคุณ saveจะแพ็คเลเยอร์และข้อมูลเมตาของห่วงโซ่ทั้งหมดที่จำเป็นในการสร้างภาพ จากนั้นคุณสามารถโหลดsavedอิมเมจลูกโซ่นี้ลงในอินสแตนซ์ของ Docker อื่นและสร้างคอนเทนเนอร์จากรูปภาพเหล่านี้
mbarthelemy

7
@ThomasUhrig คุณสามารถใช้การส่งออกไปยัง "แผ่" ภาชนะไปยังภาพหนึ่งชั้น / ฐาน นอกจากนี้คุณสามารถใช้มันเพื่อสำรองภาชนะ (fe data container) แต่สามารถทำได้โดยไม่มีexportฟังก์ชั่นด้วย
Jiri

9
นอกจากนี้exportข้อมูลเมตาทั้งหมดจะหายไปดังนั้นในกรณีที่คุณพยายามเรียกใช้คอนเทนเนอร์ด้วยอิมเมจนั้นคุณได้ทำการอ้างอิง CMD และข้อมูลเมตาอื่น ๆ saveทำงานได้ดีสำหรับฉัน แต่การส่งออกเป็นความเจ็บปวด
Mirage

1
ฉันต้องการอัพเดทภาพเป็นเวอร์ชั่นล่าสุด คอนเทนเนอร์ที่ทำงานอยู่ในขณะนี้ได้ทำการเปลี่ยนแปลงบางอย่างกับระบบไฟล์ภายใน หลังจากการอัพเกรดฉันต้องการให้การเปลี่ยนแปลงเหล่านี้กลับคืนมา ตามที่ฉันเข้าใจทั้งการบันทึก / โหลดและการส่งออก / นำเข้าจะสร้างภาพใหม่สำหรับฉันซึ่งไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการใช้อิมเมจเวอร์ชันใหม่จาก dockerhub แต่คืนค่าข้อมูลจากคอนเทนเนอร์ที่มีอยู่ หลักสูตรที่ดีที่สุดคืออะไร
Dmitry z

20

มีความแตกต่างที่สำคัญสองประการระหว่างsaveและexportคำสั่ง

  1. saveคำสั่งบันทึกภาพทั้งหมดที่มีประวัติและข้อมูลเมตา แต่exportคำสั่งส่งออกโครงสร้างไฟล์เท่านั้น (ไม่มีประวัติและข้อมูลเมตา) ดังนั้นไฟล์ tar ที่ส่งออกจะมีขนาดเล็กลงดังนั้นไฟล์ที่บันทึกไว้

  2. เมื่อคุณใช้ระบบไฟล์ที่ส่งออกสำหรับการสร้างภาพใหม่แล้วภาพใหม่นี้จะไม่มีการใด ๆUSER, EXPOSE, RUNฯลฯ คำสั่งจาก Dockerfile ของคุณ โครงสร้างไฟล์เท่านั้นที่จะถูกถ่ายโอน ดังนั้นเมื่อคุณใช้คำหลักที่กล่าวถึงใน Dockerfile ของคุณคุณจะไม่สามารถใช้คำสั่งส่งออกสำหรับการถ่ายโอนภาพไปยังเครื่องอื่น - คุณต้องใช้คำสั่งบันทึก


4

รูปภาพที่ส่งออกจะไม่มีการบันทึกเลเยอร์หรือข้อมูลประวัติดังนั้นจะมีขนาดเล็กลงและคุณจะไม่สามารถย้อนกลับได้

รูปภาพที่บันทึกไว้จะมีข้อมูลเลเยอร์และประวัติใหญ่กว่า

หากให้สิ่งนี้กับลูกค้าคุณต้องการเก็บเลเยอร์เหล่านั้นหรือไม่?


ดังนั้นการส่งออกจะคล้ายกับไฟล์ txt โดยที่ไม่มีสิ่งใดเขียนอยู่ใช่มั้ย ?? @neil
AATHITH RAJENDRAN

4
มันเหมือนไฟล์ข้อความที่ไม่มีบัฟเฟอร์การเลิกทำ 8)
Neil McGill

2

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


1

Docker saveสร้าง repo ไฟล์ tar ที่มีเลเยอร์พาเรนต์ทั้งหมดและแท็ก + เวอร์ชันทั้งหมดหรือ repo ที่ระบุ: แท็กสำหรับแต่ละอาร์กิวเมนต์ที่จัดเตรียมจากอิมเมจภาพ

การเอ็กซ์พอร์ตนักเทียบท่าสร้างไฟล์ที่ระบุ (สามารถเป็น tar หรือ tgz) ที่มีเนื้อหาแบบแฟลตโดยไม่มีเนื้อหาของวอลุ่มที่ระบุจากคอนเทนเนอร์ตู้คอนเทนเนอร์

ประหยัดนักเทียบท่าจำเป็นต้องใช้กับภาพนักเทียบท่าในขณะที่การส่งออกนักเทียบท่าจำเป็นต้องใช้ในภาชนะ (เช่นเดียวกับการเรียกใช้ภาพ)

บันทึกการใช้งาน

นักเทียบท่าบันทึก [ตัวเลือก] IMAGE [IMAGE ... ]

บันทึกภาพลงในไฟล์เก็บถาวร tar (สตรีมไปยัง STDOUT ตามค่าเริ่มต้น)

--help = false การใช้งานพิมพ์ -, - เอาท์พุท = "" เขียนไปยังไฟล์แทนที่จะเป็น STDOUT

ส่งออกการใช้งาน

ส่งออกนักเทียบท่า [OPTIONS] คอนเทนเนอร์

ส่งออกเนื้อหาของระบบไฟล์ของคอนเทนเนอร์เป็นไฟล์เก็บถาวร tar

--help = false การใช้งานพิมพ์ -, - เอาท์พุท = "" เขียนไปยังไฟล์แทนที่จะเป็น STDOUT


1
คำถามเกี่ยวกับความแตกต่างระหว่างสองคำสั่งไม่เกี่ยวกับคำจำกัดความทั่วไปและการใช้งาน!
อาบู Shumon

0

export: ->container (filesystem) : -> ชั้นเดียวเท่านั้นimage tar
importexported image tarimage

save: ->image : -> เลเยอร์ทั้งหมดจะถูกกู้คืนimage tar
loadsaved image tarimage

จากDocker in Action, Second Edition p190

อิมเมจแบบเลเยอร์รักษาประวัติของภาพเมทาดาทาการสร้างคอนเทนเนอร์และไฟล์เก่าที่อาจถูกลบหรือแทนที่

รูปภาพที่แบนจะมีเฉพาะชุดไฟล์ปัจจุบันบนระบบไฟล์

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