จะย้ายคอนเทนเนอร์ Docker ระหว่างโฮสต์ต่างๆได้อย่างไร


99

ฉันไม่พบวิธีการย้ายนักเทียบท่าที่ใช้คอนเทนเนอร์จากโฮสต์หนึ่งไปยังอีกโฮสต์หนึ่ง

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


ดูที่ flocker github.com/ClusterHQ/flocker
Adrian Mouat

โปรดทราบว่าคุณอาจต้องการใช้บันทึก / โหลดแทนการส่งออก / นำเข้าเนื่องจากบันทึกจะเก็บรักษาข้อมูลเมตาและประวัติไว้
Burstaholic

นี่ควรเป็นความคิดเห็นสำหรับคำตอบของ @ aholt หรือไม่?
Martin Thompson

docker saveใช้สำหรับบันทึกภาพไม่ใช่คอนเทนเนอร์ docs.docker.com/engine/reference/commandline/save
stmllr

คำตอบ:


59

คุณไม่สามารถย้ายคอนเทนเนอร์นักเทียบท่าที่กำลังทำงานอยู่จากโฮสต์หนึ่งไปยังอีกโฮสต์หนึ่ง

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

Nb:ไม่เก็บข้อมูลที่เก็บไว้ในไดรฟ์ข้อมูล คุณต้องย้ายปริมาณข้อมูลด้วยตนเองไปยังโฮสต์ใหม่


@larsks ขั้นแรกจะไม่หยุดคอนเทนเนอร์แล้วทำการคอมมิตหรือไม่?
valentt

@valentt ทั้งสองเป็นไปได้ที่จะทำงานและหยุดคอนเทนเนอร์
crollywood

2
คำตอบนี้ไม่ได้อธิบายคำสั่งที่คุณต้องใช้อย่างแท้จริงซึ่งทำให้ยากสำหรับ noob อย่างฉัน
Paul Kruger

นักเทียบท่าสามารถช่วยให้คุณย้ายคอนเทนเนอร์ที่ "รัน" ระหว่างโฮสต์ได้หากทั้งคู่รองรับ CRIU
dGRAMOP

2
1. หยุดภาชนะdocker stop x; 2. กระทำการเปลี่ยนแปลง ur docker commit -p x x; 3. บันทึกภาชนะที่ภาพdocker save -o x x; 4. ย้ายไฟล์ x ไปยังโฮสต์ใหม่และในโฮสต์ใหม่ให้โหลดอิมเมจใหม่dokcer load -i x(ถ้าคุณเริ่มคอนเทนเนอร์ด้วย-vตัวเลือกคุณจะต้องย้ายไฟล์เหล่านี้ไปยังโฮสต์ใหม่ด้วย) 5. เรียกใช้ภาพนี้ด้วยdocker run (-v is required to mount these files if needed)
Lau Real

96

หรือหากคุณไม่ต้องการส่งไปยังที่เก็บ:

  1. ส่งออกคอนเทนเนอร์ไปยัง tarball

    docker export <CONTAINER ID> > /home/export.tar
    
  2. ย้าย tarball ของคุณไปยังเครื่องใหม่

  3. นำเข้ากลับ

    cat /home/export.tar | docker import - some-name:latest
    

8
ยังไม่เก็บรักษาข้อมูลที่เก็บไว้ในไดรฟ์ข้อมูล
stmllr

1
มันควรจะทำงานอย่างไร? หลังจากนำเข้าฉันได้รับภาพใหม่แล้วอะไรล่ะ? เพียงแค่ทำคำสั่ง run ใหม่?
valentt

2
นี่เป็นคำแนะนำที่ไม่ดีจริงๆโดยเฉพาะอย่างยิ่งสำหรับคอนเทนเนอร์ที่ใช้ฐานข้อมูล ฉันลองทำตามคำแนะนำนี้แล้วก็ไม่ได้ผล อาจใช้งานได้กับการหยุดคอนเทนเนอร์ก่อนหรือไม่?
valentt

2
คำแนะนำนี้มีไว้เพื่อเป็นทางเลือกเท่านั้น อาจใช้ได้กับสถานการณ์ของคุณ แต่อาจไม่ สำหรับฉันฉันกำลังตั้งค่าคอนเทนเนอร์นักเทียบท่าจำลองฐานข้อมูลในเวลานั้นและสำหรับการส่งออก / นำเข้าไม่สนใจเรื่องการเก็บรักษาข้อมูลเนื่องจากฉันกำลังเรียกใช้การสำรองข้อมูลฐานข้อมูลไปยัง tarball อื่นเป็นประจำ สำหรับสิ่งนี้ทำงานได้อย่างสมบูรณ์แบบ
aholt

34

ในที่สุดสิ่งที่ได้ผลสำหรับฉันหลังจากคู่มือที่สับสนและแบบฝึกหัดที่สับสนมากมายเนื่องจาก Docker เห็นได้ชัดว่าในขณะที่ฉันเขียนด้วยความคาดหวังที่สูงเกินจริงคือ:

  1. บันทึกภาพนักเทียบท่าลงในที่เก็บถาวร:
    docker save image_name > image_name.tar
  2. คัดลอกบนเครื่องอื่น
  3. บนเครื่องเทียบท่าอื่น ๆ ให้เรียกใช้โหลดนักเทียบท่าด้วยวิธีต่อไปนี้:
    cat image_name.tar | docker load

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

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

ไม่จำเป็นต้องพูดก็คือถ้าคุณมีพอร์ตเหล่านั้นอยู่แล้วใน docker hyper-visor ที่คุณกำลังนำเข้าโดยคอนเทนเนอร์นักเทียบท่าอื่น ๆ คุณจะจบลงด้วยความขัดแย้งและคุณจะต้องกำหนดค่าพอร์ตที่เปิดเผยใหม่


1
มีประโยชน์อย่างมาก ข้อความ "ไม่ระบุคำสั่ง" ทำให้ฉันแทบคลั่ง
Rintoul

ข้อความ "ไม่ระบุคำสั่ง" ก็ทำให้ฉันแทบคลั่งเช่นกัน ฉันใช้นักเทียบท่าคอมมิต <container-id> stackstorm-local: 2.9 และนักเทียบท่าดึง stackstorm-local: 2.9 จากโฮสต์อื่น
Hua Zhang

นั่นเหมาะกับฉัน
M. Ali El-Sayed

18

จากเอกสาร Docker:

docker exportไม่ส่งออกเนื้อหาของไดรฟ์ข้อมูลที่เกี่ยวข้องกับคอนเทนเนอร์ หากไดรฟ์ข้อมูลติดตั้งอยู่ด้านบนของไดเร็กทอรีที่มีอยู่ในคอนเทนเนอร์docker exportจะเอ็กซ์พอร์ตเนื้อหาของ ไดเร็กทอรีที่อยู่ภายใต้ไม่ใช่เนื้อหาของไดรฟ์ข้อมูล โปรดดูการสำรองคืนค่าหรือโอนย้ายปริมาณข้อมูล ในคู่มือผู้ใช้สำหรับตัวอย่างการส่งออกข้อมูลในไดรฟ์ข้อมูล


คลัสเตอร์ hq shutdown ... และ BTW เพื่อย้ายคอนเทนเนอร์คอนเทนเนอร์ควรทำงานบน ZFS / lun หน่วยเก็บข้อมูลที่รองรับ
asvignesh

7

ใช้สคริปต์นี้: https://github.com/ricardobranco777/docker-volumes.sh

สิ่งนี้จะเก็บรักษาข้อมูลในปริมาณ

ตัวอย่างการใช้งาน:

# Stop the container   
docker stop $CONTAINER

# Create a new image   
docker commit $CONTAINER $CONTAINER

# Save image
docker save -o $CONTAINER.tar $CONTAINER

# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar

# Copy image and volumes to another host
scp $CONTAINER.tar $CONTAINER-volumes.tar $USER@$HOST:

# On the other host:
docker load -i $CONTAINER.tar
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER

# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar

# Start container
docker start $CONTAINER

1
ไม่ได้ผลสำหรับฉันบน AWS Linux (Centos) ในตอนท้ายฉันใช้วิธีการเทคโนโลยีขั้นต่ำในการใช้นักเทียบท่าตรวจสอบเพื่อค้นหาไดรฟ์ข้อมูลจากนั้นคัดลอกด้วยตนเอง
JasonPlutext

@JasonPlutext อาจจะมีบางอย่างที่เกี่ยวข้องกับ SELinux? คุณเปิดใช้งาน SELinux หรือไม่
Ricardo Branco

รับทราบ: tar: การลบนำหน้า `/ 'ออกจากชื่อสมาชิก
hjahan

@hjahan นั่นเป็นข้อความ tar ทั่วไป ไม่ใช่ข้อผิดพลาดและไม่มีแม้แต่คำเตือน
Ricardo Branco

1

ฉันลองวิธีแก้ปัญหามากมายสำหรับสิ่งนี้และนี่คือวิธีที่เหมาะกับฉัน:

1. คำสั่ง / บันทึกคอนเทนเนอร์เป็นรูปภาพใหม่:

  1. ++ ยอมรับคอนเทนเนอร์:
    # นักเทียบท่าหยุด
    # นักเทียบท่ากระทำ CONTAINER_NAME
    # นักเทียบท่าบันทึก - เอาท์พุท IMAGE_NAME.tar IMAGE_NAME: TAG


ps: "คอนเทนเนอร์ CONTAINER_NAME ของเรามีวอลลุ่มต่อที่" / var / home "" (คุณต้องตรวจสอบคอนเทนเนอร์ของคุณเพื่อระบุเส้นทางปริมาณ: # นักเทียบท่าตรวจสอบ CONTAINER_NAME)

  1. ++ บันทึกระดับเสียง: เราจะใช้อิมเมจของอูบุนตูเพื่อทำสิ่งนี้
    # mkdir backup
    # docker run --rm --volumes-from CONTAINER_NAME -v $ {pwd} / backup: / backup ubuntu bash -c“ cd / var / home && tar cvf /backup/volume_backup.tar”

ตอนนี้เมื่อคุณดู $ {pwd} / backup คุณจะพบไดรฟ์ข้อมูลของเราในรูปแบบ tar
จนถึงขณะนี้เรามีภาพ "IMAGE_NAME.tar" ของ conatainer และระดับเสียง "volume_backup.tar"

ตอนนี้คุณสามารถสร้างคอนเทนเนอร์เดิมขึ้นใหม่บนโฮสต์ใหม่

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