‫คำสั่ง Docker Health Check มันเป็นคุณสมบัติใหม่ที่เพิ่มเข้ามาใน 1 12 ซึ่งออกมากลางปี 2559 ในเวลาเดียวกันกับที่
‫Swarm Kit และ Swarm Mode นั้นมีอยู่ใน Docker มันถูกเพิ่มเข้ามาจริง ๆ เป็นส่วนหนึ่งของชุดเครื่องมือนั้น
‫แต่ก็ยังคงทำงานได้ในทุกไฟล์ที่แตกต่างกันเช่น Dockerfile, ไฟล์ Compose, คำสั่ง docker run
‫ใช้มัน, ไฟล์ Stack สนับสนุน, การปรับปรุงบริการ .
‫มันมีอยู่ทุกที่
‫ฉันขอแนะนำว่าเมื่อคุณกำลังผลิตคุณมีส่วนร่วมในการทดสอบตัวเลือกสำหรับคำสั่งตรวจสุขภาพนี้
‫มันจะทำงานได้ทันทีจากกล่องด้วย exec
‫มันจะรันคำสั่งนั้นภายในคอนเทนเนอร์เหมือนว่าคุณกำลังรันคำสั่ง exec ของคุณเอง
‫ดังนั้นจึงไม่เรียกใช้จากนอกคอนเทนเนอร์ มันแค่เรียกใช้ภายในซึ่งหมายความว่าแม้แต่คนงานธรรมดาที่ไม่มีพอร์ตเปิดเผยคุณสามารถเรียกใช้คำสั่งง่ายๆเพื่อตรวจสอบว่าพวกเขาส่งคืนข้อมูลที่ดีหรืออะไรก็ตาม
‫เป็นการดำเนินการคำสั่งอย่างง่ายซึ่งหมายความว่าจะได้รับผลตอบแทนที่เรียบง่าย คาดว่าจะเป็น 0 หรือ 1
‫ใน Linux และ Windows คุณมีรหัสออกจากคำสั่งและ 0 เป็นสิ่งที่ดี
‫มันหมายความว่าทุกอย่างเรียบร้อยดี
‫สิ่งอื่นที่ไม่ใช่ 0 จะเป็นข้อผิดพลาดในแอปพลิเคชันส่วนใหญ่
‫แต่ใน Docker เราต้องการแอปพลิเคชั่นนั้นเพื่อออกจาก 1 โดยเฉพาะ เราจะแสดงให้คุณเห็นในเวลาไม่กี่นาที
‫มีเพียงสามสถานะในการตรวจสุขภาพใน Docker มันเริ่มต้นจากการเริ่มต้น การเริ่มต้นคือ
‫30 วินาทีแรกโดยค่าเริ่มต้นซึ่งยังไม่ได้เรียกใช้คำสั่ง healthcheck
‫จากนั้นมันก็จะวิ่งไปหนึ่งอัน
‫ถ้าสิ่งนั้นคืนค่า 0 มันจะเริ่มต้นด้วยการมีสุขภาพดี มันจะเปลี่ยนเป็นตัวเลือกที่ดีต่อสุขภาพ
‫มันจะใช้คำสั่งนั้นและมันจะรันทุก 30 วินาทีโดยค่าเริ่มต้นอีกครั้ง หากเคยได้รับผลตอบแทนที่ไม่ดีต่อสุขภาพเช่นเดียวกับทางออก
‫1 แสดงว่าเป็นภาชนะที่ไม่แข็งแรง
‫เรามีตัวเลือกสำหรับควบคุมทั้งหมดนี้รวมถึงการลองใหม่
‫เราจะเห็นว่าภายในหนึ่งนาที
‫นี่เป็นตัวเลือกที่ดีกว่าที่เราเคยมีในอดีตเพราะ Docker จนถึงตอนนี้ก็แค่ทำให้แน่ใจว่าแอปพลิเคชันยังคงทำงาน
‫มันไม่ได้มีความเข้าใจว่าแอปพลิเคชันนั้นทำในสิ่งที่ควรจะเป็นหรือไม่
‫ตอนนี้เราสามารถทำสิ่งนั้นได้ภายในคอนเทนเนอร์ Docker เอง
‫แต่นี่ไม่ใช่สิ่งทดแทนโซลูชันการตรวจสอบบุคคลที่สามของคุณ
‫สิ่งนี้จะไม่ให้กราฟหรือสถานะเมื่อเวลาผ่านไปหรือการจัดทำเครื่องมือของบุคคลที่สามใด ๆ ที่คุณคาดหวังจากโซลูชันการตรวจสอบ
‫นี่คือความเข้าใจเกี่ยวกับนักเทียบท่าถ้าตัวคอนเทนเนอร์มีระดับพื้นฐานที่ดีต่อสุขภาพ
‫ดังนั้นใน Nginx มันอาจส่งคืน localhost ของไฟล์ดัชนีรูท ผลตอบแทน 200 หรือ 300 นั้นใช้ได้และให้รหัสการออกเป็น
‫0 และถือว่าดี
‫นั่นไม่ใช่เครื่องมือตรวจสอบขั้นสูงขั้นสูงสุด
‫แต่ถ้ามันกลับมามีข้อผิดพลาด 404 หรือ 500 ก็จะพิจารณาว่ามันไม่แข็งแรงและเราสามารถทำอะไรกับมันได้
‫เราจะไปดู Healthcheck Docker นี้ใน GUI ได้ที่ไหน
‫สถานที่แรกที่อยู่ในคอนเทนเนอร์ ls
‫มันจะเห็นเป็นตัวเลือกใหม่นี้
‫มันอยู่ตรงกลาง
‫เราจะเห็นในวินาทีที่มันจะแสดงให้เราเป็นหนึ่งในสามของรัฐหากการตรวจสุขภาพทำงานและนั่นคือวิธีที่เรารู้จริงว่ามีการตรวจสุขภาพ
‫นั่นเป็นวิธีที่ง่ายที่สุดที่จะรู้
‫เราจะดูประวัติสุขภาพห้ารายการสุดท้ายที่ปรากฏในการตรวจสอบภาชนะบรรจุนั้น และเราสามารถเห็นแนวโน้มพื้นฐานบางช่วงเวลาที่นั่น
‫แต่คำสั่งเรียกใช้นักเทียบท่าไม่ได้ดำเนินการกับคอนเทนเนอร์ที่ไม่แข็งแรง
‫เมื่อ healthcheck พิจารณาว่าคอนเทนเนอร์ไม่ปลอดภัยการรันตัวเทียบท่าก็จะบ่งบอกว่าในคำสั่ง ls และในการตรวจสอบ
‫แต่มันจะไม่ดำเนินการใด ๆ
‫นั่นคือสิ่งที่เราคาดหวังว่า Swarm Services จะดำเนินการ
‫ดังนั้นสแต็กและบริการจะแทนที่คอนเทนเนอร์นั้นด้วยงานใหม่บนโฮสต์ใหม่ที่เป็นไปได้ขึ้นอยู่กับตัวกำหนดตารางเวลา
‫แม้ในคำสั่ง update เราจะเห็นโบนัสพิเศษเล็กน้อยโดยใช้
‫Healthchecks เนื่องจากการอัปเดตจะพิจารณาว่า Healthcheck เป็นส่วนหนึ่งของความพร้อมสำหรับคอนเทนเนอร์นั้นก่อนที่มันจะไปและเปลี่ยนอันถัดไป
‫หากคอนเทนเนอร์ปรากฏขึ้น แต่ไม่ผ่านการตรวจสอบสุขภาพแสดงว่าการอัปเดตบริการจะไม่ไปที่เพจถัดไป
‫หรือจะดำเนินการตามการเปลี่ยนแปลงที่คุณให้ไว้
‫ลองดูตัวอย่างเล็ก ๆ น้อย ๆ ก่อนที่เราจะไปที่บรรทัดคำสั่ง
‫นี่คือสิ่งที่เรากำลังใช้ในการทำงานนักเทียบท่า
‫สิ่งนี้ช่วยให้เราสามารถใช้ภาพที่มีอยู่ซึ่งไม่ได้มีการตรวจสอบสุขภาพและเรากำลังเพิ่มการตรวจสอบสุขภาพที่รันไทม์
‫ในกรณีนี้เราใช้ภาพ Elasticsearch คุณสามารถเห็นคำสั่งเป็น cURL localhost
‫9200 ซึ่งเป็นพอร์ตที่ Elasticsearch ทำงานอยู่ภายในคอนเทนเนอร์ไม่ใช่พอร์ตที่เผยแพร่ แต่อยู่ในคอนเทนเนอร์
‫สำหรับ Elasticsearch มี URL สุขภาพจริง
‫ดังนั้นเราสามารถใช้สิ่งนี้ได้ที่นี่
‫คุณจะสังเกตได้ว่าไพพ์ทั้งสองนั้นมีเท็จในตอนท้ายของคำสั่งนั้น
‫และนั่นจะเป็นเรื่องธรรมดาถ้าใช้บางอย่างเช่น cURL หรือเครื่องมืออื่นที่จะส่งรหัสข้อผิดพลาดที่ไม่ใช่ 1
‫จำได้ไหมเมื่อฉันพูดถึงเมื่อก่อนว่า เราต้องการให้มันออกโดยมี 1 หากมีปัญหา
‫เพราะนั่นคือรหัสข้อผิดพลาดเดียวที่นักเทียบท่ากำลังจะทำบางสิ่งเกี่ยวกับ
‫เราจำเป็นต้องตรวจสอบให้แน่ใจว่าในกรณีนี้เชลล์จะส่งคืนรหัสทางออก 1 เท็จเสมอหากมีสิ่งใดที่ออกมาจากคำสั่งนั้นนอกเหนือจาก
‫0
‫เป็นวิธีที่ดีในการแก้ไขปัญหานั้น
‫มันเกิดขึ้นกับ cURL เท่านั้น cURL จะให้รหัสข้อผิดพลาดที่เป็นไปได้อื่น ๆ และเราไม่ต้องการให้ทำเช่นนั้น
‫ในไฟล์นักเทียบท่าจริงเราสามารถเพิ่มคำสั่งเดียวกันได้ รูปแบบต่างกันเล็กน้อย
‫แต่คุณเห็นว่าเรามีตัวเลือกเหล่านี้ที่นี่ เรามีช่วงเวลาหมดเวลาช่วงเวลาเริ่มต้น (ซึ่งใหม่) และลองใหม่
‫ช่วงเวลาคือสิ่งที่คุณคิดว่าเป็น โดยค่าเริ่มต้นทุก ๆ 30 วินาที
‫ความถี่ในการเรียกใช้การตรวจสุขภาพนี้บ่อยแค่ไหน
‫การหมดเวลาคือระยะเวลาที่รอก่อนที่จะเกิดข้อผิดพลาดและส่งคืนรหัสที่ไม่ถูกต้องหากแอปช้า ช่วงเวลาเริ่มต้นเป็นคุณลักษณะใหม่ที่ช่วยให้เราตอนนี้ใน 17
‫09 และใหม่กว่าเพื่อให้ระยะเวลารอนานกว่า 30 วินาทีแรกของช่วงเวลา
‫ก่อนหน้านี้มันจะรอนานเสมอ ... ช่วงเวลาก่อนที่จะเริ่มตรวจสุขภาพ
‫แต่บางทีคุณอาจมีแอพพลิเคชั่น Java หรือฐานข้อมูลหรือบางอย่างที่ใช้เวลาในการเริ่มต้นนานกว่านั้น
‫อาจใช้เวลาห้านาที
‫คุณสามารถเพิ่มช่วงเวลาเริ่มต้นนั้นได้ มันจะยังคงตรวจสุขภาพ
‫แต่สิ่งที่ต้องทำคือมันจะไม่ส่งสัญญาณเตือนเมื่อมีการตรวจสอบที่ไม่แข็งแรงจนกระทั่งเวลาผ่านไป
‫ดังนั้นหากคุณตั้งค่าสองนาทีในที่นั่นแม้ว่าจะมีการตรวจสอบสุขภาพทุก ๆ 30
‫วินาทีก็จะพิจารณาเพียงว่ามันไม่แข็งแรงเมื่อผ่านเครื่องหมายสองนาทีนั้น อันสุดท้ายลองใหม่หมายความว่าเราจะลองตรวจสุขภาพ
‫x จำนวนครั้งก่อนที่เราจะพิจารณาว่ามันไม่แข็งแรง
‫นั่นเป็นโอกาสที่แอพที่อาจไม่เสถียรอาจกลับมาพร้อมกับสุขภาพที่ดีและฟื้นตัวได้ด้วยตัวเองก่อนที่เราจะพิจารณาว่านี่เป็นภาชนะที่ไม่แข็งแรงอย่างแท้จริง
‫คำสั่ง healthcheck พื้นฐานที่คุณจะใช้ใน Dockerfile
‫เรียกว่า HEALTHCHECK ซึ่งเป็นตัวพิมพ์ใหญ่ทั้งหมด รูปแบบเดียวกันนั้นมีอยู่ถ้าเราเพิ่งทำ cURL ง่ายๆของ localhost เพราะอาจเป็นแอพ
‫PHP หรืออะไรทำนองนั้น เราสามารถทำเช่นนั้นได้.
‫นี่คือวิธีที่คุณจะเพิ่มตัวเลือกเหล่านั้นทั้งหมดลงใน Dockerfile
‫ดังนั้นคุณจะเห็นว่าฉันเพิ่มช่วงเวลาการหมดเวลาและการลองใหม่ก่อนหน้าคำสั่งของตัวเองได้อย่างไร
‫อันแรกที่นั่นสำหรับคำสั่งพื้นฐานสังเกตว่าฉันไม่จำเป็นต้องใส่ CMD ถ้าฉันแค่ให้มันสั่งให้มันทำงาน
‫แต่ถ้าฉันต้องการที่จะแสดงตัวเลือกถ้าฉันต้องการที่จะให้มันตัวเลือกที่กำหนดเองออกจากกล่องที่มีการหมดเวลาและอื่น ๆ แล้วฉันจะต้องระบุว่าเป็นคำสั่งใด
‫ทีนี้นี่ไม่ใช่เส้นตรงสองเส้น
‫สังเกตว่าแบ็กสแลชที่ส่วนท้ายของบรรทัดแรกนั้น
‫ดังนั้นอย่าสับสน
‫ที่นี่เรามีตัวอย่างง่ายๆของสิ่งที่มันอาจจะเป็นถ้าคุณมีแอปพลิเคชันคงที่ทำงานอยู่ภายในเซิร์ฟเวอร์ Nginx
‫คุณสามารถกำหนดช่วงเวลาและการหมดเวลาจาก Dockerfile ของคุณและคุณเพียงแค่ให้มันทำคำสั่ง cURL
‫บน localhost
‫ถ้ามันคืนค่า 200 หรือ 300 จะถือว่าดี ถ้ามันคืนค่า 4 หรือ 5 หรืออย่างอื่นจะถือว่าข้อผิดพลาดนั้น
‫คุณสังเกตเห็นที่นี่ว่าฉันมีทางออก 1 ซึ่งเป็นสิ่งเดียวกับเท็จ
‫ฉันทำแบบนั้นเพื่อแสดงให้คุณเห็นว่าตัวอย่างบางอย่างบนอินเทอร์เน็ตจะเป็นเท็จ ตัวอย่างบางส่วนจะมีทางออก 1
‫พวกเขาทั้งสองทำสิ่งเดียวกัน
‫นี่คือตัวอย่างขั้นสูงเพิ่มเติมเล็กน้อย
‫ในกรณีนี้เรากำลังใช้แอป PHP ที่รวมกับ Nginx
‫สิ่งที่ฉันทำคือในแหล่งข้อมูลคุณจะพบลิงค์ไปยังตัวอย่าง PHP นี้ ฉันได้เพิ่มในไฟล์ปรับแต่ง Nginx ที่กำหนดเองที่ใช้
‫URL สถานะ Nginx และ PHP-FPM
‫แอปพลิเคชั่นทั้งสองนั้นมีหน้าสถานะของตัวเองและเรียงลำดับ URL ปิงตรวจสุขภาพ
‫คุณสามารถใช้สิ่งเหล่านี้ในแอพของคุณหากคุณใช้ PHP หรือ Nginx มี URL
‫ที่แตกต่างกันสองแบบ แต่คุณสามารถใช้ทั้งสองอย่างภายใน Healthcheck เดียวกัน
‫ในกรณีนี้เรากำลังใช้เพียงหนึ่งในนั้นและเรากำลังโยนใน localhost / ping ซึ่งจริงๆแล้วเป็นคำสั่งสถานะ PHP-FPM
‫แต่คุณต้องเปิดใช้งานภายใน PHP-FPM ของคุณ อีกครั้งในแหล่งข้อมูลของการบรรยายนี้มีลิงก์ไปยังค่าเริ่มต้นที่ดีของ PHP
‫Docker
‫คุณสามารถไปดูที่ GitHub ที่ฉันได้แสดงในตัวอย่างนี้ในรายละเอียดเพิ่มเติมเล็กน้อย
‫ต่อไปเรามีตัวอย่างของ Postgres ดังนั้นใน Dockerfile ฉันสามารถใช้ URL อื่น
‫ที่นี่เรามีแอปพลิเคชั่น Postgres ซึ่งในคำสั่ง healthcheck ฉันใช้คำสั่ง pg isready
‫ขณะนี้มีแอพต่าง ๆ มีเครื่องมือต่างกัน ด้วย Postgres
‫มันมาพร้อมกับเครื่องมือในตัวนั่นคือการทดสอบการเชื่อมต่อกับเซิร์ฟเวอร์ Postgres อย่างง่าย ๆ
‫ไม่ตรวจสอบว่าคุณมีข้อมูลที่ดีหรือฐานข้อมูลของคุณเชื่อมต่ออย่างถูกต้อง เป็นเพียงการพูดว่า 'เซิร์ฟเวอร์ฐานข้อมูลนี้อนุญาตการเชื่อมต่อหรือไม่
‫ใช่หรือไม่?
‫'นั่นเป็นสิ่งที่เรียบร้อยที่คุณสามารถทำได้นอกกรอบ
‫นี่คือสิ่งที่ดูเหมือนในไฟล์ผู้แต่ง / สแต็ก
‫คล้ายกันมาก
‫คุณจะสังเกตเห็นว่าช่วงเวลาเริ่มต้นที่นั่นต้องใช้รุ่นอื่น
‫เนื่องจากคำสั่ง healthcheck ออกมาใน 1 12 ได้รับการสนับสนุนจริงใน 2 1 ในไฟล์เขียนนี้
‫แต่ถ้าคุณจะใช้ช่วงเวลาเริ่มต้นนั่นหมายความว่าคุณต้องอัปเดตไฟล์เขียนเป็นเวอร์ชัน 3
‫4 เพื่อที่จะสนับสนุนว่า
‫เพราะช่วงเวลาเริ่มต้นออกมาในอีกหนึ่งปีต่อมาหลังจากคำสั่ง healthcheck ทำ
‫เริ่มกันเลยกับคำสั่งเรียกใช้ง่ายๆ
‫สิ่งที่เราจะทำที่นี่คือเรากำลังจะเริ่มเซิร์ฟเวอร์ฐานข้อมูล Postgres ที่ไม่มี Healthcheck
‫เพราะโดยปกติแล้วมันไม่ได้มาพร้อมกับเซิร์ฟเวอร์ตัวเดียว
‫จากนั้นเราจะเรียกใช้อีกครั้งด้วยคำสั่ง
‫healthcheck ที่จะเพิ่มที่บรรทัดคำสั่งและเราจะเห็นความแตกต่าง
‫ที่นี่เราแค่เรียกอันแรกว่า p1 เราจะเรียกใช้มันแยกออกจากรูปภาพอย่างเป็นทางการของ Postgres
‫ถ้าฉันทำท่าเทียบท่าตู้คอนเทนเนอร์คุณจะเห็นว่าไม่มีอะไรบ่งชี้สุขภาพที่นี่
‫ถ้าเราทำคำสั่งเดียวกันนั้นอีกครั้งและเรียกมันว่า p2 ในครั้งนี้เราจะเพิ่มคำสั่ง health
‫คราวนี้เราจะใช้ pg isready ที่เราพูดถึงก่อนหน้านี้เพื่อทดสอบว่าการเชื่อมต่อนั้นมีอยู่ในเซิร์ฟเวอร์
‫Postgres นี้ เรากำลังจะบอกว่าผู้ใช้ที่เราต้องการคือผู้ใช้ postgres
‫เราไม่จำเป็นต้องให้รหัสผ่าน
‫จะไม่พยายามเข้าสู่ระบบ มันจะพยายามตรวจสอบ เราจะใช้ภาพ Postgres
‫ทีนี้ถ้าเราทำตู้เทียบท่าเทียบเรือแล้วผมซูมออกนิดหน่อยคุณจะเห็นว่ามันบอกว่า 'สุขภาพกำลังเพิ่มขึ้น 4 วินาที
‫'ตอนนี้เราได้รับคุณสมบัติเพิ่มเติมนี้ในสถานะของคำสั่ง ls ของเรา มันจะยังคงอยู่ในสถานะเริ่มต้นเป็นเวลา
‫30 วินาทีเริ่มต้นจนกว่าจะรันคำสั่ง healthcheck เป็นครั้งแรก
‫ตอนนี้เรารอนานกว่า 30 วินาทีแล้วคุณจะเห็นว่ามันเปลี่ยนเป็นสถานะปกติ
‫ถ้าเราทำตู้เทียบท่าตรวจสอบ p2 นั้นเราจะเห็นที่ด้านบนสุดของที่เรามีตัวเลือกสถานะสุขภาพใหม่นี้
‫ในกรณีนี้ฉันสามารถรันได้สองครั้งเท่านั้น
‫คุณสามารถเห็นผลลัพธ์ที่นั่นแสดงว่ากำลังรับการเชื่อมต่อ
‫เอาล่ะ ให้บริการสร้างคำสั่งไปยังฐานข้อมูลเดียวกันในการทดสอบสุขภาพเดียวกัน
‫สิ่งที่เราจะเห็นที่นี่เมื่อเราทำเช่นนี้คือมีสามสถานะที่แตกต่างกันที่บริการเริ่มต้น
‫มันกำลังเตรียมซึ่งมักจะหมายถึงการดาวน์โหลดภาพ มันกำลังเริ่มต้นซึ่งหมายความว่ากำลังดำเนินการคอนเทนเนอร์และนำขึ้นมา
‫จากนั้นมันก็วิ่ง
‫หากไม่มีคำสั่ง healthcheck การเริ่มต้นและการเรียกใช้จะรวดเร็วมาก พวกมันเกือบจะทันที
‫เราจะเห็นว่าที่นี่พร้อมบริการนักเทียบท่าสร้างชื่อ p1 postgres
‫เมื่อเสร็จสิ้นการเตรียมโดยการดาวน์โหลดภาพคุณจะเห็นว่ามันเริ่มต้นทันทีจากการเริ่มทำงานเนื่องจากไม่มีการตรวจสุขภาพ
‫มันไม่มีอะไรอื่นที่จะทำนอกจากเริ่มภาชนะแล้วพูดว่า 'ใช่ ไบนารีกำลังทำงาน
‫'แต่ถ้าเราทำคำสั่งเดียวกันนั้นบริการตัวสร้างจะสร้างและเรียกมันว่า p2 เหมือน แต่ก่อนและให้คำสั่งด้านสุขภาพแบบเดียวกัน
‫เราเริ่มบริการนี้ด้วยคำสั่ง healthcheck ในตัว
‫สิ่งที่เราจะเห็นก็คือว่ามันจะเริ่มจากการเตรียมการเพื่อเริ่มต้นและมันจะนั่งที่สถานะเริ่มต้นสำหรับ 30
‫วินาทีเริ่มต้นจนกว่าการตรวจสุขภาพครั้งแรก
‫นี่คือบริการ Docker ที่ต้องการสถานะที่สมบูรณ์ก่อนที่จะพิจารณาว่าบริการนี้ทำงานอย่างเต็มที่
‫หลังจากผ่านไป 30 วินาทีมันจะเปลี่ยนเป็นสถานะกำลังทำงาน
‫จากนั้นเราได้รับการยืนยันครั้งสุดท้ายเพียงเล็กน้อยเพื่อให้แน่ใจว่ามันมีความเสถียรแล้วเราก็เสร็จ
‫คุณสามารถเห็นได้ทันทีว่าด้วยบริการและการอัปเดตบริการเราจะได้รับโบนัสพิเศษของแนวคิดด้านสุขภาพหากเราใช้คำสั่งเหล่านี้ทุกครั้งที่ทำได้