เมื่อเร็ว ๆ นี้ ฉันได้เขียนแบบฝึกหัดที่น่าสนใจสองสามข้อเกี่ยวกับการใช้ 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 ของคุณจะน่าพึงพอใจมากขึ้น และคุณได้เรียนรู้เกี่ยวกับการทำงานของสิ่งต่างๆ ในเบื้องหลังแล้ว ไปเลย ขอให้สนุก
ไชโย