Computer >> คอมพิวเตอร์ >  >> ซอฟต์แวร์ >> เครื่องเสมือน

ปัญหาในการเริ่มต้น/ลบคอนเทนเนอร์ Docker - วิธีแก้ไข

เมื่อเร็ว ๆ นี้ ฉันได้เขียนแบบฝึกหัดที่น่าสนใจสองสามข้อเกี่ยวกับการใช้ Docker ซึ่งเป็นเทคโนโลยีที่ประณีตที่ห่อหุ้ม LXC ไว้ด้วยความสนุกสนานมากมาย และฉันจะบอกได้อย่างไรว่านักพัฒนา วิศวกร และผู้ดูแลระบบที่มีความโน้มเอียงน้อยกว่าจะไม่สนใจ บน Python อาเจียน เพลิดเพลินไปกับความมหัศจรรย์ของการจำลองเสมือนระดับ OS แต่มีปัญหา

ปัญหาสองประการที่เราจะพูดถึงในวันนี้เกิดขึ้นเมื่อคุณเริ่มคอนเทนเนอร์ที่มีชื่อ หรือพยายามลบออก กล่าวคือ ตัวอักษรแฟนซีบนหน้าจอจะอ่านได้ประมาณว่า:"Conflict ชื่อ W ถูกใช้โดยคอนเทนเนอร์ XYZ แล้ว คุณต้องลบ..." และปัญหาชิ้นที่สองจะอ่านว่า:"Conflict ไม่สามารถลบค่าดีฟอลต์ได้ ชื่อของคอนเทนเนอร์..." นอกเหนือจากการใช้เครื่องหมายวรรคตอนในทางที่ผิดอย่างโจ่งแจ้งแล้ว ตอนนี้เราต้องหาวิธีแยกแยะสิ่งนี้ออก

ปัญหา

เอาล่ะ เรามีปัญหานี้:

นักเทียบท่ารัน -d -ti -p 22 -p 80 --name
FATA[0000] การตอบสนองข้อผิดพลาดจาก daemon:ความขัดแย้ง ชื่อ "XYZ" ถูกใช้โดยคอนเทนเนอร์ hexacode แล้ว คุณต้องลบ (หรือเปลี่ยนชื่อ) คอนเทนเนอร์นั้นเพื่อให้สามารถใช้ชื่อนั้นซ้ำได้

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

นักเทียบท่า rm --link <ชื่อ>
การตอบสนองข้อผิดพลาดจาก daemon:ความขัดแย้ง ไม่สามารถลบชื่อเริ่มต้นของคอนเทนเนอร์ได้
ข้อผิดพลาด FATA[0000]:ไม่สามารถลบคอนเทนเนอร์หนึ่งรายการขึ้นไป

ดูเหมือนทางตัน แล้วตอนนี้ล่ะ?

วิธีแก้ไข

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

มีสองวิธีที่เราสามารถแก้ไขปัญหาได้ เราจะเริ่มด้วยตัวที่สง่างามก่อน หากคุณเรียกใช้คำสั่ง docker ps คุณจะไม่เห็นคอนเทนเนอร์เก่าของคุณ เนื่องจากคอนเทนเนอร์ไม่ได้ทำงานอยู่จริง แต่ถ้าคุณรันคำสั่ง docker os ด้วยแฟล็ก -a คุณควรจะเห็นประวัติการรันคอนเทนเนอร์ของคุณทั้งหมด:

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

นักเทียบท่า rm 85c2981e63f6 26ea04f41ab3

วิธีที่สองคือการลบไฟล์ที่เหลือด้วยตนเองจากภายใต้ /var โดยเฉพาะ ไฟล์สามารถพบได้ภายใต้ /var/lib/docker/containers/ ไดเร็กทอรีคอนเทนเนอร์แต่ละรายการจะมีตัวระบุแฮชที่ยาวเป็นพิเศษ และภายในนั้นมีเอาต์พุต JSON ที่น่าเกลียดมากมาย หากคุณค้นหาสตริงเฉพาะที่ตรงกับชื่อคอนเทนเนอร์ที่คุณต้องการ คุณจะพบไดเร็กทอรีที่เกี่ยวข้องที่เก็บไฟล์การกำหนดค่า

ลบไดเร็กทอรีหลักที่ตรงกับการค้นหาชื่อ จากนั้นเริ่มบริการ Docker ใหม่ หลังจากนั้นคุณควรจะสามารถใช้ชื่อของคุณได้อีกครั้ง นี่เป็นเหมือนสิ่งที่เราเห็นจาก KVM และ libvirt ที่เหลือ

systemctl รีสตาร์ทนักเทียบท่า

และคุณควรจะเริ่มต้นได้แล้ว ไอ้แก่!

สรุป

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

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

ไชโย