เนื่องจาก Docker Containers เป็นกล่องเล็กๆ ของซอฟต์แวร์ การคัดลอกและย้ายมันระหว่างคอมพิวเตอร์ได้ แต่นี่ไม่ค่อยถูกพูดถึง เพราะองค์กรใหญ่ตั้งค่า Repository ของตัวเอง เพื่อปรับแต่ง Images เองและกระจายไปเซิร์ฟเวอร์ตามที่ต้องการ แตคุณไม่ควรต้องผ่านความยุ่งยากในการตั้งค่าระบบกระจายของตัวเอง หากคุณบางครั้งต้องย้าย Container หนึ่งหรือหลายตัว
อาจเป็นที่คุณทำงานบน Docker Instance บนเครื่อง Local และตัดสินใจย้ายไปเซิร์ฟเวอร์ที่ทรงพลังกว่า หรือคุณแค่อยาก Deploy Container ที่ปรับแต่งเองบนหลายเครื่อง "Copy และ Paste" รอบๆ บางครั้งคุณอาจไม่พอใจ Cloud Provider และอยากเปลี่ยน ไม่ว่าสถานการณ์ จะมีขั้นตอนง่ายๆ สำหรับทำสิ่งนี้ รายละเอียดด้านล่าง
บันทึก Container Image จาก Source Host
ไม่จำเป็นต้องหยุด Container ก่อน แต่แนะนำให้ทำอย่างยิ่ง คุณจะถ่ายภาพสแน็ปชอตของข้อมูลใน Docker Instance หากมันกำลังรันขณะทำ มีโอกาสน้อยบางส่วนที่บางไฟล์อาจไม่สมบูรณ์ในสแน็ปชอต จินตนาการใครอัปโหลดไฟล์ 500MB เมื่ออัปโหลด 250MB คุณสั่ง docker commit การอัปโหลดต่อไป แต่เมื่อคุณ Restore Docker Image นี้บน Host อื่น อาจมีแค่ 250 จาก 500MB
ดังนั้น หากทำได้ ให้หยุด Instance ก่อน:
docker stop NAME_OF_INSTANCE
Docker Container สร้างจาก Generic Initial Image ตามเวลา คุณเพิ่มการเปลี่ยนแปลงของตัวเองเข้าไปใน Base Image กระบวนการที่รันภายใน Container อาจบันทึกข้อมูลของตัวเองหรือทำการเปลี่ยนแปลงอื่นๆ เพื่อเก็บทั้งหมดไว้ คุณสามารถ Commit สถานะใหม่นี้เป็น Image ใหม่
โปรดทราบ หาก Instance กำลังรัน การกระทำนี้จะ Pause มันขณะที่เนื้อหาถูกบันทึก หากคุณเพิ่มข้อมูลมากใน Container การดำเนินการนี้จะใช้เวลานานขึ้น หากนี่เป็นปัญหา คุณหลีกเลี่ยงการ Pause ได้โดยใส่ docker commit -p=false NAME_OF_INSTANCE mycontainerimage แทนคำสั่งถัดไป อย่าทำเช่นนี้ เว้นแต่จำเป็นอย่างยิ่ง โอกาสสร้าง Image ที่มีข้อมูลไม่สอดคล้อง/ไม่สมบูรณ์ เพิ่มขึ้น
ในบทช่วยสอนนี้ เลือกชื่อทั่วไปสำหรับ Image ที่ได้ คือ mycontainerimage คุณเปลี่ยนชื่อได้ หากทำ ให้จำว่าแทนที่ในคำสั่งต่อไปทุกที่ที่เจอ
docker commit NAME_OF_INSTANCE mycontainerimage
ตอนนี้ บันทึก Image นี้เป็นไฟล์และบีบอัด:
docker save mycontainerimage | gzip > mycontainerimage.tar.gz
ต่อไป ใช้วิธีถ่ายโอนไฟล์ที่คุณชอบ และคัดลอก mycontainerimage.tar.gz ไปยัง Host ที่ต้องการย้าย Container
โหลด Container Image บน Destination Host
หลัง Login เข้า Host ที่ถ่ายโอน Image แล้ว นำเข้าเข้า Docker:
gunzip -c mycontainerimage.tar.gz | docker load
เนื่องจากคุณไม่เคย Initialize Container ที่นี่ คุณไม่สามารถ Start ด้วย docker start ได้เลย แทนที่จะใช้ คำสั่งเดียวกับที่คุณเคยใช้ตอนรัน Docker Instance ครั้งแรก ความต่างตอนนี้คือใช้ "mycontainerimage" ท้ายแทน Image ที่เคยใช้
คำสั่งถัดไปเป็นตัวอย่าง อย่าคัดลอกวางหากไม่เกี่ยวข้อง (ไม่มีพารามิเตอร์พิเศษตอนรัน Image ครั้งแรก)
docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
ในทางตรงข้าม ต่อไปนี้เป็นตัวอย่างคำสั่งที่ต้องการพารามิเตอร์ --publish เพื่อ Forward Port 80 บน Host ไป Port 80 บน Container:
docker run -d --name=http-server --publish 80:80 mycontainerimage
หลังจากนั้น คุณหยุดและเริ่ม Container นี้ได้ปกติ ด้วยคำสั่ง docker stop และ docker start
ถ่ายโอน Image โดยไม่สร้างไฟล์
บางครั้งคุณอาจอยากข้ามการสร้างไฟล์ mycontainerimage.tar.gz อาจเพราะพื้นที่ดิสก์ไม่พอ เนื่องจาก Container มีข้อมูลเยอะ คุณสามารถ Save, Compress, Transfer, Uncompress และ Load Image บน Destination Host ในคำสั่งเดียว หลังรันคำสั่ง docker commit ที่อภิปรายในส่วนแรก คุณสามารถใช้:
docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
ควรทำงานจาก Windows ได้ด้วย เนื่องจากตอนนี้มี SSH Client Built-in (PuTTY ไม่จำเป็นแล้ว)
หลังจากนั้น ดำเนินต่อด้วยคำสั่ง docker run ที่เกี่ยวข้องกับสถานการณ์ของคุณ
สรุป
docker save และ docker load ดีมากในฐานะโซลูชัน Ad-hoc สำหรับย้าย Container บางครั้ง แต่จำไว้ว่าหากทำบ่อย คุณอาจอยากตั้งค่า Private Repository ของตัวเองแทน
Image Credit: Air Force Medical Service