- ใช้ฟังก์ชันนโยบายการรีบูตดั้งเดิมของ Docker เพื่อจัดการกับความล้มเหลวของระบบ
- การใช้งานสคริปต์แบบกำหนดเองและ cron สำหรับคอนเทนเนอร์ที่มีสถานะไม่สมบูรณ์
- การผสานรวมขั้นสูงกับ systemd เพื่อควบคุมลำดับการเริ่มต้นและปิดระบบ
- ทางเลือกและเครื่องมือตรวจสอบภายนอก เช่น Podman Quadlet
ฉันแน่ใจว่าคุณเคยเจอปัญหานี้มาก่อน: คุณมีบริการที่กำลังทำงานอยู่ ด็อกเกอร์ ซึ่งด้วยเหตุผลลึกลับบางประการ ทำให้เกิดปัญหาติดขัดทุกๆ สองสามวัน จะรีสตาร์ทคอนเทนเนอร์ Docker โดยอัตโนมัติได้อย่างไรเมื่อมันหยุดทำงาน? มันน่าหงุดหงิดที่จะพยายามปรับแต่งโค้ดหรือการตั้งค่าแล้วไม่มีอะไรได้ผล จนกระทั่งพบว่าการรีบูตเครื่องด้วยตนเองง่ายๆ ก็แก้ปัญหาได้และทำให้ทุกอย่างทำงานได้ต่อไปอีกหนึ่งสัปดาห์ แทนที่จะคอยตรวจสอบเวลาอยู่ตลอดเวลา วิธีแก้ปัญหาที่ดีที่สุดคือการตั้งค่าระบบที่ทำหน้าที่นี้แทนคุณ
การจัดการความพร้อมใช้งานของคอนเทนเนอร์นั้นเกี่ยวข้องมากกว่าแค่การทำให้แน่ใจว่าคอนเทนเนอร์เริ่มต้นทำงานโดยอัตโนมัติเมื่อเซิร์ฟเวอร์เปิดเครื่อง ตรวจสอบให้แน่ใจว่าพวกเขาตอบสนองอย่างถูกต้อง ตามคำขอ บางครั้งคอนเทนเนอร์ดูเหมือนจะ "ทำงานอยู่" สำหรับ Docker แต่แอปพลิเคชันภายในกลับไม่ตอบสนอง ทำให้เราต้องมองหาวิธีแก้ไข ตั้งแต่การตั้งค่าพารามิเตอร์พื้นฐานของ daemon ไปจนถึงการสร้างบริการที่ซับซ้อนในระบบปฏิบัติการ
นโยบายการรีบูตแบบเนทีฟของ Docker
วิธีที่ง่ายที่สุดในการรีสตาร์ทคอนเทนเนอร์ Docker โดยอัตโนมัติคือการใช้แฟล็ก --restart เมื่อเริ่มใช้งานคอนเทนเนอร์หรือใช้คำสั่ง docker update หากคอนเทนเนอร์ถูกสร้างขึ้นแล้ว Docker จะมีตัวเลือกหลายอย่างให้เลือกตามความต้องการของคุณ ตัวอย่างเช่น นโยบาย เสมอ วิธีนี้จะทำให้คอนเทนเนอร์เริ่มต้นใหม่เสมอ ไม่ว่ากระบวนการจะสิ้นสุดลงด้วยข้อผิดพลาดหรือจะเป็น Docker daemon เองที่เริ่มต้นใหม่ก็ตาม
หากคุณต้องการวิธีการผ่าตัดมากกว่า เว้นแต่จะหยุด นี่คือตัวเลือกยอดนิยมสำหรับหลายๆ คน การกำหนดค่านี้เหมือนกับแบบก่อนหน้าทุกประการ ยกเว้นว่าหากคุณหยุดคอนเทนเนอร์ด้วยตนเองเพื่อทำการบำรุงรักษา Docker จะไม่พยายามเปิดใช้งานฟังก์ชันนี้ โดยอัตโนมัติหลังจากรีสตาร์ทเซิร์ฟเวอร์ โดยจะเคารพการตัดสินใจด้วยตนเองของคุณ
สำหรับผู้ที่ต้องการดำเนินการเฉพาะเมื่อเกิดความล้มเหลวร้ายแรงเท่านั้น ก็มีตัวเลือกอยู่ เมื่อเกิดความล้มเหลวนโยบายนี้จะเริ่มการรีสตาร์ทก็ต่อเมื่อคอนเทนเนอร์หยุดทำงานโดยมีรหัสการออกที่ไม่ใช่ศูนย์เท่านั้น คุณยังสามารถจำกัดการทำงานนี้ได้โดยการเพิ่มจำนวนครั้งสูงสุดในการลองใหม่ เพื่อป้องกันไม่ให้ระบบเข้าสู่ลูปการรีสตาร์ทที่ไม่สิ้นสุดหากข้อผิดพลาดนั้นเกิดขึ้นอย่างต่อเนื่องและร้ายแรง

ระบบอัตโนมัติสำหรับคอนเทนเนอร์ที่ "ไม่สมบูรณ์"
ตรงนี้แหละที่เรื่องเริ่มน่าสนใจ บางครั้ง คอนเทนเนอร์อาจยังแสดงสถานะ "ใช้งานได้" (เปิดอยู่) แต่สถานะสุขภาพของมันอาจเป็นอย่างอื่น ไม่ดีต่อสุขภาพ เนื่องจากไม่ผ่านการตรวจสอบภายใน นโยบายก่อนหน้านี้จึงไม่มีผลในกรณีนี้ เพราะกระบวนการยังไม่หยุดชะงักโดยสิ้นเชิง เพื่อแก้ไขปัญหานี้ เราสามารถนำคำสั่งดังกล่าวมาใช้ได้ ตรวจสุขภาพ ในไฟล์ Dockerfile หรือในไฟล์ Docker Compose โดยกำหนดคำสั่ง (เช่น a) curl (ไปยังพอร์ตที่ระบุ) เพื่อตรวจสอบว่าแอปตอบสนองหรือไม่
เมื่อเราตั้งค่าการตรวจสอบสุขภาพเสร็จแล้ว เราก็สามารถสร้าง... สคริปต์ Bash ซึ่งทำงานทุกๆ สองสามนาทีโดยใช้ crontab จาก Linux สคริปต์นี้ควรกรองคอนเทนเนอร์ที่อยู่ในสถานะที่ไม่ถูกต้องออกไป unhealthy หรือผู้ที่ออกจากโปรแกรมด้วยรหัสข้อผิดพลาด 128 และเรียกใช้โปรแกรม docker restart เกี่ยวกับพวกเขา
เพื่อให้การทำงานนี้ราบรื่นและสามารถรีสตาร์ทคอนเทนเนอร์ Docker โดยอัตโนมัติ ผู้ใช้ที่เรียกใช้ cron job จำเป็นต้องมีสิทธิ์ที่จำเป็น สิทธิ์ที่จำเป็นในกลุ่ม dockerด้วยวิธีนี้ ระบบจะตรวจสอบสภาพแวดล้อมทุกๆ 5 หรือ 10 นาที และเปิดใช้งานบริการใดๆ ที่กลายเป็น "บริการซอมบี้" ซึ่งรับประกันความพร้อมใช้งานเกือบสมบูรณ์โดยไม่ต้องมีการแทรกแซงจากมนุษย์
การผสานรวมขั้นสูงกับ systemd
เมื่อทำงานในสภาพแวดล้อมที่เป็นมืออาชีพมากขึ้น คุณอาจต้องการให้คอนเทนเนอร์ของคุณทำงานในลักษณะดังต่อไปนี้ บริการ Linux ดั้งเดิมบูรณาการ ด็อกเกอร์ Systemd ช่วยให้คุณจัดการความสัมพันธ์ที่ซับซ้อนได้ เช่น การตรวจสอบให้แน่ใจว่าฐานข้อมูลเริ่มต้นทำงานก่อนเว็บแอปพลิเคชัน ซึ่งทำได้โดยการสร้างไฟล์ .service ในเส้นทาง /etc/systemd/system/.
เราสามารถออกแบบได้ ลำดับการปิดและเปิดเครื่อง ควบคุมได้ โดยใช้สคริปต์แบบกำหนดเองที่เชื่อมโยงกับ systemd สามารถหยุดคอนเทนเนอร์ในลำดับย้อนกลับของลำดับการพึ่งพาเพื่อป้องกันความเสียหายของข้อมูลได้ โดยใช้ประเภท oneshot และการกำหนดค่า targets เหมาะสม (เช่น multi-user.target o shutdown.targetเซิร์ฟเวอร์จะจัดการวงจรชีวิตทั้งหมดของคอนเทนเนอร์
อีกหนึ่งวิธีที่มีประสิทธิภาพในการรีสตาร์ทคอนเทนเนอร์ Docker โดยอัตโนมัติเมื่อหยุดการทำงานคือการใช้แฟล็ก --rm เมื่อใช้งานร่วมกับ systemd จะทำให้สามารถลบคอนเทนเนอร์เมื่อหยุดการทำงาน และสร้างคอนเทนเนอร์ใหม่จากอิมเมจพื้นฐานเมื่อเริ่มต้นการทำงานใหม่ เพื่อให้มั่นใจได้ว่า ภาชนะต้องสะอาดและไม่เปลี่ยนแปลงอยู่เสมอมอบหมายการจัดเก็บข้อมูลถาวรให้กับไดรฟ์ภายนอกเพียงอย่างเดียว

เครื่องมือภายนอกและทางเลือกที่ทันสมัย
หากคุณไม่อยากเสียเวลาเขียนสคริปต์ Bash ก็มีเครื่องมือจากผู้พัฒนาภายนอกให้เลือกใช้ มีแอปพลิเคชันโอเพนซอร์สที่ออกแบบมาโดยเฉพาะเพื่อรีสตาร์ทคอนเทนเนอร์โดยอิงจาก... กำหนดการที่กำหนดไว้สิ่งนี้มีประโยชน์มากสำหรับงานที่ทำซ้ำๆ เช่น การต่ออายุใบรับรอง SSL เช่นเดียวกับเครื่องมือต่างๆ เช่น อัพไทม์ คูม่า แอปพลิเคชันเหล่านี้ช่วยให้คุณตรวจสอบสถานะของบริการต่างๆ ได้จากแดชบอร์ดแบบภาพ และส่งการแจ้งเตือนไปยัง Telegram หรือ Gotify หากมีสิ่งผิดปกติเกิดขึ้น นอกจากนี้ยังเป็นประโยชน์อย่างมากในการรีสตาร์ทคอนเทนเนอร์ Docker โดยอัตโนมัติเมื่อหยุดการทำงาน
สำหรับผู้ที่มองหาทางเลือกที่เบากว่าหรือเป็นวัสดุพื้นเมือง พอดแมน นี่เป็นตัวเลือกที่ยอดเยี่ยม ด้วยสถาปัตยกรรมแบบไร้เดมอนและฟังก์ชันการทำงานที่หลากหลาย ควอดเล็ตมันช่วยให้คุณสร้างไฟล์ประกาศแบบง่ายๆ ที่ systemd จะแปลงเป็นบริการที่ได้รับการปรับให้เหมาะสมโดยอัตโนมัติ ทำให้การผสานรวมเป็นไปอย่างราบรื่นกว่า Docker แบบดั้งเดิมมาก
การควบคุมวงจรชีวิตของบริการของคุณอย่างสมบูรณ์นั้นเกี่ยวข้องกับการผสมผสานการใช้งานของ นโยบายการเริ่มต้นใหม่การเฝ้าระวังอย่างต่อเนื่องผ่านทาง การตรวจสุขภาพ และในกรณีที่ซับซ้อนกว่านั้น การสนับสนุนจาก systemd หรือเครื่องมือตรวจสอบ เพื่อให้โครงสร้างพื้นฐานของคุณมีความแข็งแกร่งและไม่ขึ้นอยู่กับว่าใครจะคอยจำต้องรีสตาร์ทเซิร์ฟเวอร์ด้วยตนเองทุกสัปดาห์
บรรณาธิการเชี่ยวชาญด้านเทคโนโลยีและอินเทอร์เน็ตด้วยประสบการณ์มากกว่าสิบปีในสื่อดิจิทัลต่างๆ ฉันทำงานเป็นบรรณาธิการและผู้สร้างเนื้อหาให้กับบริษัทอีคอมเมิร์ซ การสื่อสาร การตลาดออนไลน์ และการโฆษณา ฉันยังได้เขียนไว้ในเว็บไซต์เศรษฐศาสตร์ การเงิน และภาคส่วนอื่นๆ ด้วย งานของฉันก็คือความหลงใหลของฉันเช่นกัน ตอนนี้ผ่านบทความของฉันใน Tecnobitsฉันพยายามสำรวจข่าวสารและโอกาสใหม่ ๆ ที่โลกแห่งเทคโนโลยีมอบให้เราทุกวันเพื่อปรับปรุงชีวิตของเรา