นักเทียบท่า daemon ไม่ได้เริ่มการบู๊ตบน CoreOS


23

ฉันมีการติดตั้งวานิลลาของ CoreOS (835.9.0) และมันไม่ได้เริ่มต้น docker daemon เมื่อเริ่มต้น มันเริ่มต้นเมื่อฉัน SSH docker psและทำเช่น

ฉันจะทำให้ docker daemon เริ่มทำงานโดยอัตโนมัติเมื่อบูตระบบได้อย่างไร

เมื่อฉันพูดนักเทียบท่าภูตฉันหมายถึงps -ef | grep dockerไม่แสดงกระบวนการจนกว่าฉันจะทำdocker ps

คำตอบ:


40

sudo systemctl enable docker ทำเคล็ดลับ


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

6
พื้นหลัง: รากของสิ่งนี้เป็นเพราะนักเทียบท่าคือซ็อกเก็ตที่เปิดใช้งานบน CoreOS นั่นคือมันไม่ได้ปิดกั้นห่วงโซ่การบูต นักเทียบท่ารุ่นแรกเริ่มช้าเมื่อคุณมีคอนเทนเนอร์จำนวนมากบนดิสก์ซึ่งบล็อกทุกอย่างที่ขึ้นอยู่กับตัวเทียบท่าเริ่มต้นอย่างรวดเร็วซึ่งทำให้เกิดข้อผิดพลาดที่น่าสนใจ
Rob

4
ความดี มันทำให้ฉันเป็นบ้า ไม่มีอะไรที่ฉันอ่านในเอกสารใด ๆ ที่กล่าวถึงนี้ ฉันเกือบสาบาน CoreOS ในความโปรดปรานของ AWS AMI เพราะมัน (AWS AMI เริ่ม Docker daemon โดยอัตโนมัติตามค่าเริ่มต้น)
Nostalg.io

2
ผิดปกติอย่างมากสำหรับ CoreOS ที่จะทำงานในลักษณะนี้เนื่องจาก CoreOS นั้นเป็น Docker OS โดยเฉพาะและไม่ได้เริ่มทำงานตัวเชื่อมต่อระหว่างการบูต ???
typelogic

3
นี่เป็นข้อมูลที่สำคัญอย่างยิ่ง เอกสาร CoreOS ไม่ได้กล่าวถึงสิ่งใด ๆ เกี่ยวกับการเปิดใช้งาน Docker (หรือคอนเทนเนอร์ runtime อื่น ๆ สำหรับเรื่องนั้น) เนื่องจากเป็นไปได้ที่จะเริ่มนักเทียบท่าคอนเทนเนอร์บน CoreOS เปล่า (และเนื่องจาก CoreOS ถูกสร้างขึ้นเพื่อรันคอนเทนเนอร์) ฉันจึงรู้สึกว่ามันเป็นค่าเริ่มต้น ฉันเพิ่งรู้ถึงความผิดพลาดของฉันเมื่อการรีบูตครั้งที่ทริกเกอร์การอัปเดตครั้งแรกไม่ได้เริ่มต้นคอนเทนเนอร์ของฉัน
Florian von Stosch

6

ตอนนี้ค่อนข้างเก่า แต่ฉันเริ่มใช้ cloud-init เพื่อทำสิ่งนี้กับเซิร์ฟเวอร์ใหม่ทั้งหมด ฉันมีสคริปต์เริ่มต้นระบบคลาวด์ที่บันทึกไว้ที่ฉันใช้สำหรับเซิร์ฟเวอร์ทั้งหมดของฉัน ส่วนหนึ่งของมันประกอบด้วย:

#cloud-config
coreos:
  units:
    - name: "docker.service"
      command: "start"
      enable: true

นี่จะเป็นการเปิดใช้งานบริการนักเทียบท่าและเริ่มต้นในการบู๊ตครั้งแรกและแต่ละครั้ง


2

ตามที่อธิบายไว้แล้วในความคิดเห็นนี้โดยRobนักเทียบท่าจะเปิดใช้งานซ็อกเก็ต นั่นหมายความว่า deamon ไม่เริ่มต้นเว้นแต่จะเรียกว่า คำตอบที่มีอยู่ที่นี่ใช้งานได้ แต่ CoreOS แนะนำวิธีการที่แตกต่าง

วิธีที่แนะนำในการทำเช่นนี้ตามเอกสาร CoreOSคือการสร้างบริการสำหรับแอพของคุณเองซึ่งต้องใช้บริการ Docker:

/etc/systemd/system/myapp.service:

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "trap 'exit 0' INT TERM; while true; do echo Hello World; sleep 1; done"

[Install]
WantedBy=multi-user.target

และให้บริการนั้นเริ่มโดยอัตโนมัติแทน:

$ sudo systemctl enable /etc/systemd/system/myapp.service
$ sudo systemctl start hello.service

ตัวอย่าง use-case คือการอัพเดตคอนเทนเนอร์เป็นเวอร์ชันล่าสุดเมื่อเซอร์วิสเริ่มทำงานและตัวอย่างขั้นสูงยังรีจิสเตอร์เซอร์วิสใน etcd อ่านเอกสาร CoreOSสำหรับข้อมูลพื้นหลังเพิ่มเติม


นั่นคือ "ล่าสุด" จาก CoreOS หรือไม่ นักเทียบท่ามีนโยบายการรีสตาร์ทเป็นเวลาหลายปีและวิธีการนี้ไม่จำเป็นหรือเป็นที่ต้องการอีกต่อไป มันไม่เคยเป็นที่พึงปรารถนาจริงๆ แต่มันเป็นวิธีแก้ปัญหาสำหรับ (รุ่นเก่ามาก) ขาดการสนับสนุนของนักเทียบท่าสำหรับการรีสตาร์ทตู้คอนเทนเนอร์เอง นานมาแล้วที่จะหยุดการใช้ CoreOS ฉันเดาว่า ...
Michael Hampton

@MichaelHampton รีสตาร์ทนโยบายจะมีผลบังคับใช้เมื่อคอนเทนเนอร์ล้มเหลวด้วยเหตุผลอื่นดังนั้นจึงไม่มีการแทนที่สำหรับคอนเทนเนอร์อื่น นอกจากนี้นโยบายการรีสตาร์ทไม่อนุญาตให้คุณอัปเดตคอนเทนเนอร์เมื่อบู๊ต ฯลฯ ฉันไม่รู้ว่ามันจะดีกว่านี้ แต่ฉันคิดว่าวิธีนี้จะช่วยให้คุณควบคุมได้มากขึ้น
Neograph734

1
เมื่อคุณเริ่มต้องการการควบคุมที่มากโดยทั่วไปคุณยังต้องใช้บิตอื่น ๆ อีกมากมายที่ให้บริการโดย orchestration: ณ จุดสิ้นสุดที่เรียบง่ายนักแต่งเพลงเรียบเรียงไปจนถึง Kubernetes
Michael Hampton

1

ฉันกำลังใช้ Docker Swarm ดังนั้นฉันจึงไม่มีแอพเฉพาะสำหรับ systemd ที่จะรับผิดชอบ ... ฉันแค่ต้องการนักเทียบท่าเพื่อเริ่มบูต นี่คือทางออกที่ฉันได้ผล

ใส่สิ่งนี้/etc/systemd/system/poke-docker.service:

[Unit]
After=default.target

[Service]
Type=oneshot
ExecStart=/usr/bin/docker version
RemainAfterExit=yes

[Install]
WantedBy=default.target

จากนั้นเพียงแค่systemctl enable poke-dockerตั้งค่าเพื่อทริกเกอร์ในการบู๊ตแต่ละครั้งใกล้ถึงจุดสิ้นสุดของลำดับการเริ่มต้น docker versionคำสั่งคุยกับภูตนักเทียบท่าที่เรียกซ็อกเก็ตและเริ่มต้นบริการนักเทียบท่าของตัวเอง

ฉันลองใช้systemctl enable dockerเคล็ดลับในคำตอบอื่น ๆ และในขณะที่มันทำงานในตอนแรกดูเหมือนจะทำให้เกิดสถานการณ์ฝูงสัตว์ที่ฟ้าร้องซึ่งนักเทียบท่ากำลังพยายามทำสิ่งต่าง ๆ มากมายและล้มเหลวอย่างน่าสังเวช ฉันสงสัยว่านี่เป็นพฤติกรรม "บล็อกการบูต" ที่กล่าวถึงในความคิดเห็นที่นั่น


มีกรณีการใช้งานเดียวกันที่รัน gitlab-runner บนฝูง นี่เป็นการปลุกภูต คุณสามารถเพิ่ม systemd ดร็อปอินในไฟล์ติดไฟของคุณcoreos.com/os/docs/latest/using-systemd-drop-in-units.html
drgn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.