ฉันจะเริ่มต้นอัตโนมัตินักเทียบท่าคอนเทนเนอร์ที่บูตระบบได้อย่างไร


113

เป็นวิธีที่ดีในการเริ่มต้นนักเทียบท่าคอนเทนเนอร์โดยอัตโนมัติเมื่อระบบบูทขึ้นคืออะไร?

มีวิธีที่ต้องการทำเช่นนี้ใน Ubuntu 14.04?

ก่อนหน้านี้ฉันเคยใช้supervisordเพื่อเริ่มต้นเว็บแอป แต่นั่นไม่รู้สึกเหมือนสิ่งที่ถูกต้องสำหรับนักเทียบท่า

คำตอบ:


136

เห็นได้ชัดว่าวิธีการในปัจจุบันให้อัตโนมัติเริ่มต้นภาชนะหาง ( จากหาง 1.2 ) คือการใช้นโยบายการเริ่มต้นใหม่ สิ่งนี้จะควบคุมวิธีที่นักเทียบท่าควรจัดการกับการเริ่มต้นของคอนเทนเนอร์เมื่อเริ่มต้นและเริ่มใหม่ของคอนเทนเนอร์เมื่อออกจาก ฉันใช้ตัวเลือก 'always' จนถึงตอนนี้และสามารถยืนยันได้ว่าทำให้ Docker เริ่มต้นคอนเทนเนอร์อัตโนมัติเมื่อบูตระบบ:

sudo docker run --restart=always -d myimage

เอกสารที่ตัดตอนมา

นโยบายการเริ่มต้นใหม่โดยใช้การตั้งค่าสถานะ --restart บน Docker คุณสามารถระบุนโยบายการเริ่มต้นใหม่สำหรับวิธีที่คอนเทนเนอร์ควรหรือไม่ควรรีสตาร์ทเมื่อออก

ไม่ - ห้ามรีสตาร์ทคอนเทนเนอร์เมื่อออก

on-failure - รีสตาร์ทคอนเทนเนอร์ถ้าออกจากสถานะไม่เป็นศูนย์เท่านั้น

always - รีสตาร์ทคอนเทนเนอร์เสมอโดยไม่คำนึงถึงสถานะการออก

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

$ sudo docker run --restart=always redis

สิ่งนี้จะเรียกใช้คอนเทนเนอร์ redis โดยมีนโยบายการเริ่มต้นใหม่เสมอเพื่อให้ถ้าออกจากคอนเทนเนอร์ Docker จะเริ่มต้นใหม่

$ sudo docker run --restart=on-failure:10 redis

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


12
"เสมอ - รีสตาร์ทคอนเทนเนอร์ทุกครั้งโดยไม่คำนึงถึงสถานะออก" ทำให้เกิดความสับสนเล็กน้อย มันจะไม่รีสตาร์ทคอนเทนเนอร์หากคุณออกจาก / หยุดคอนเทนเนอร์ด้วยตนเองซึ่งเป็นพฤติกรรมที่ฉันกำลังมองหา
w00t

12
หมายเหตุ: unless-stoppedมีการเพิ่มนโยบายอื่นที่เรียกว่า มันทำหน้าที่เหมือนalwaysแต่ถ้าคอนเทนเนอร์หยุดและระบบรีบูทใหม่หรือ docker daemon รีสตาร์ทคอนเทนเนอร์จะไม่รีสตาร์ท ดูที่นี่เพื่อเขียนบทความทั้งหมด 4 ตัวเลือกblog.codeship.com/…
David Morales

4
แน่นอนdockerภูตต้องเริ่มต้นอัตโนมัติเพื่อสนับสนุนสิ่งนี้
sherrellbc

ฉันคิดว่าคำถามจะถาม "ในการบูตระบบ" ซึ่งหมายถึงหลังจากรีบูตเซิร์ฟเวอร์จริงหรือเซิร์ฟเวอร์เสมือนวิธีรีสตาร์ทคอนเทนเนอร์อัตโนมัติสมมติว่าเครื่องมือนักเทียบท่าทำงานอย่างเต็มที่หลังจากรีบูตเซิร์ฟเวอร์หรือไม่
รูทลูป

8

นักเทียบท่ามีหน้านี้ที่อธิบายถึงวิธีการทำด้วยการพุ่งพรวดและ systemd ฉันยอมรับว่ามันดูเหมือนจะไม่ใช่สิ่งที่ถูกต้องสำหรับนักเทียบท่า ทางออกของพวกเขาคือการทำงานdocker startซึ่งถือว่าคุณได้สร้างคอนเทนเนอร์ของคุณแล้ว ฉันคิดว่าคุณจะทำdocker run --rmในสคริปต์ upstart (ปฏิบัติต่อมันเหมือนกระบวนการใหม่และคอนเทนเนอร์จากรูปภาพ) หรือปล่อยให้ docker daemon รีสตาร์ทคอนเทนเนอร์เองเมื่อบู๊ต (ตามค่าเริ่มต้นหากคุณไม่ทำอะไรเลย ) พุ่งพรวดมีข้อได้เปรียบของการอนุญาตให้เริ่ม / หยุดกระบวนการได้ง่าย แต่คุณจะได้รับเมื่อเริ่ม / หยุดของนักเทียบท่า!

ฉันคิดว่ามันแปลกที่จะบังคับให้ผู้ใช้สร้างคอนเทนเนอร์ (ด้วยการผูกพอร์ต / โวลุ่มที่ถูกต้องทั้งหมด) ก่อนที่สคริปต์ upstart จะทำงาน


ลิงก์ใช้งานไม่ได้ ... นี่ดูเหมือนเป็นการทดแทนที่เป็นไปได้ แต่แน่นอนว่าไม่ได้แสดงว่า "เป็นอย่างไร"
Gert van den Berg

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

6

แต่นั่นไม่รู้สึกเหมือนสิ่งที่ถูกต้องสำหรับนักเทียบท่า

ทำไมจะไม่ล่ะ?

ฉันใช้ supervisord สำหรับเรื่องนี้ด้วยความสำเร็จ

ใช้สิ่งที่คุณรู้ใช้งานได้ใช้สิ่งที่คุณสามารถบำรุงรักษาและเข้าใจได้ง่าย


ขอบคุณ @EEAA .. หมายความว่าคุณเปิดใช้งานในโหมดที่ไม่ใช่ daemon หรือไม่? นั่นไม่ได้หมายความว่าคุณต้องใช้มันด้วย--rmเหรอ?
Stefan Arentz

ฉันเรียกใช้คอนเทนเนอร์ในโหมดเบื้องหน้าและให้ supervisord จับ stdout / stderr ฉันไม่แน่ใจว่าทำไม--rmมีความเกี่ยวข้องที่นี่
EEAA

@EEAA: เกี่ยวกับคำถามของคุณ: สำหรับบางคนdockerเป็นผู้แทนlxcหรือopenvzที่มีและlxc.start.auto = 1 vzctl set --onboot yesนอกจากนี้ยังมี ESXi และโซลูชั่นเวอร์ชวลไลเซชันอื่น ๆ ที่มีคุณสมบัติดังกล่าวรวมอยู่ด้วย เช่นเดียวกับลอเรนซ์ฉันไม่คิดว่าคุณลักษณะการเริ่มอัตโนมัติควรดำเนินการในลักษณะเฉพาะของการกระจายเนื่องจากผู้ใช้นักเทียบท่าควรสามารถแก้ไขปัญหาเดียวกันได้โดยมีความรู้เดียวกันในทุกแพลตฟอร์ม
Daniel Alder

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