อะไรคือความแตกต่างระหว่าง `นักเทียบท่าหยุด 'และ' นักเทียบท่าฆ่า '?


116

ความแตกต่างระหว่างdocker stopและdocker killคืออะไร

ตอนนี้ทั้งสองจะหยุดคอนเทนเนอร์ที่ทำงานอยู่ มันเป็นdocker stopความพยายามที่จะหยุดกระบวนการทำงานภายในคอนเทนเนอร์ในวิธีที่ถูกต้องในขณะที่docker killจะส่งสัญญาณฆ่าหรือไม่? ถ้าเป็นเช่นนั้นจะdocker stopรู้วิธีหยุดกระบวนการทำงานอย่างถูกต้องได้อย่างไร (เนื่องจากสิ่งนี้แตกต่างจากกระบวนการไปยังกระบวนการ)

คำตอบ:


112

เป็นที่นักเทียบท่าหยุดพยายามที่จะหยุดกระบวนการทำงานภายในภาชนะในทางที่ถูกต้องในขณะที่นักฆ่านักฆ่าจะส่งสัญญาณฆ่า?

โดยพื้นฐานแล้วใช่ความแตกต่างนั้นบอบบาง แต่ถูกร่างไว้ในการอ้างอิงบรรทัดคำสั่ง :

  • นักเทียบท่าหยุด : หยุดคอนเทนเนอร์ที่ใช้งานอยู่ ( ส่ง SIGTERM แล้ว SIGKILL หลังจากระยะเวลาผ่อนผัน ) [... ] กระบวนการหลักภายในคอนเทนเนอร์จะได้รับ SIGTERM และหลังจากช่วงเวลาผ่อนผัน SIGKILL [เน้นเหมือง]
  • นักฆ่านักฆ่า : ฆ่าภาชนะที่ใช้งานอยู่ ( ส่ง SIGKILL หรือสัญญาณที่ระบุ ) [... ] กระบวนการหลักภายในภาชนะจะถูกส่ง SIGKILL หรือสัญญาณใด ๆ ที่ระบุด้วยตัวเลือก - สัญญาณ [เน้นเหมือง]

ดังนั้นstopพยายามที่จะทริกเกอร์การปิดอย่างนุ่มนวลโดยการส่งสัญญาณ POSIX มาตรฐานSIGTERMในขณะที่killเพียงแค่ฆ่ากระบวนการโดยค่าเริ่มต้น (แต่ยังช่วยให้การส่งสัญญาณอื่น ๆ ):

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

ในขณะที่ไม่ได้บังคับใช้ในกระบวนการโดยทั่วไปคาดว่าจะจัดการSIGTERMอย่างสง่างามและทำสิ่งที่ถูกต้องขึ้นอยู่กับความรับผิดชอบของพวกเขา - นี้สามารถล้มเหลวได้อย่างง่ายดายเนื่องจากความพยายามปิดที่สง่างามใช้เวลานานกว่าระยะเวลาผ่อนผัน ยิ่ง (เช่นสำหรับฐานข้อมูล); ดูตัวอย่างSIGTERM vs. Major Hayden ของSIGKILLสำหรับคำอธิบายโดยละเอียดเพิ่มเติม:

แอปพลิเคชันสามารถกำหนดสิ่งที่ต้องการทำเมื่อได้รับ SIGTERM ในขณะที่แอปพลิเคชันส่วนใหญ่จะล้างทรัพยากรและหยุดบางส่วนอาจไม่ แอปพลิเคชันอาจถูกกำหนดค่าให้ทำสิ่งที่แตกต่างอย่างสิ้นเชิงเมื่อได้รับ SIGTERM นอกจากนี้หากแอปพลิเคชันอยู่ในสถานะไม่ดีเช่นการรอดิสก์ I / O มันอาจไม่สามารถทำงานกับสัญญาณที่ถูกส่ง


1
ดังนั้นหากฉันต้องการมีขั้นตอนการปิดเครื่องทั่วไปสำหรับคอนเทนเนอร์ฉันจะต้องตรวจจับ SIGTERM ในกระบวนการ supervisor / runit หรือไม่
CMCDragonkai

การปฏิบัติที่ดีที่สุดที่นี่คืออะไร ฉันเข้าใจว่าทำไมเราถึงใช้docker killมือเพื่อประหยัดเวลาในการปิดเครื่อง แต่ในสคริปต์มันจะดีกว่าไหมถ้าจะลองปิดระบบที่สง่างามด้วยdocker stop? ฉันยังคงเห็นdocker killสคริปต์จำนวนมากอยู่
Dennis

10

docker kill จะหยุดกระบวนการจุดเริ่มต้นหลัก / โปรแกรมทันที

docker stop จะพยายามหยุดมันอย่างสง่างาม (จะถามอย่างสุภาพ: P)

ในทั้งสองกรณีการเปลี่ยนแปลงระบบไฟล์จะยังคงอยู่ (ในเวลาที่หยุดหรือฆ่า) ดังนั้นหากคุณdocker start <container>แล้วมันจะดำเนินการต่อจากที่นั่น


1
... แต่ในกรณีที่docker killระบบไฟล์ค้างอยู่มีการเปลี่ยนแปลงกระบวนการหลักที่ยังคงมีอยู่ในหน่วยความจำจะหายไปดังนั้นระบบไฟล์อาจเสียหายได้หรือไม่
Arjan

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

2
คอนเทนเนอร์ Docker ไม่ใช่ VMs และเคอร์เนลยังมีชีวิตอยู่ผ่านการฆ่า ดังนั้นการเปลี่ยนแปลงระบบไฟล์ใด ๆ ที่มาถึงเคอร์เนลจะถูกกำหนดโดยสมบูรณ์ มันเป็นไปไม่ได้ที่จะทำให้ระบบไฟล์เกิดความเสียหาย (ในความหมาย fsck แอปพลิเคชันอาจไม่ชอบการสูญเสียการเขียน) docker killคล้ายกับการฆ่ากระบวนการไม่ใช่ปิดคอมพิวเตอร์
Ian Howson

3

และนอกเหนือจากคำตอบที่เพิ่มไว้ก่อนหน้านี้

ทำงานdocker eventsหลังจากdocker stopแสดงกิจกรรม

  • kill (สัญญาณ 15): โดยที่สัญญาณ 15 = SIGTERM
  • ตาย
  • หยุด

ทำงานdocker eventsหลังจากdocker killแสดงกิจกรรม

  • kill (สัญญาณ 9): โดยที่สัญญาณ 9 = SIGKILL
  • ตาย (รหัสทางออก 137)

docker stopมีการหมดเวลาก่อนที่จะฆ่ากระบวนการ ค่าเริ่มต้นคือ 10 วินาที

ตารางนี้มีรายละเอียดเพิ่มเติม


1

คล้ายกับการดึงปลั๊กออกจากเดสก์ท็อปและปิดเครื่องคอมพิวเตอร์

เช่นเดียวกับการดึงปลั๊กออกหมายถึงการปิดฮาร์ดไดรฟ์docker killหมายถึงวิธีการโดยตรงในการฆ่า my_container ซึ่งไม่ได้พยายามปิดกระบวนการอย่างเรียบร้อยก่อน

การปิดคอมพิวเตอร์หมายถึงการส่งสัญญาณไปยัง OS เพื่อปิดกระบวนการทั้งหมดซึ่งdocker stopหมายถึงการส่งSIGTERMสัญญาณไปยังคอนเทนเนอร์ที่กำลังทำงานเพื่อหยุดกระบวนการอย่างนุ่มนวล

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