Docker daemon không bắt đầu khởi động trên CoreOS


23

Tôi có bản cài đặt CoreOS của CoreOS (835.9.0) và nó không khởi động trình nền docker khi khởi động. Nó chỉ bắt đầu khi tôi SSH và làm ví dụ docker ps.

Làm thế nào tôi có thể làm cho daemon docker tự động khởi động khi khởi động hệ thống?

Khi tôi nói daemon docker, ý tôi là ps -ef | grep dockerkhông hiển thị quá trình nào cho đến khi tôi làmdocker ps

Câu trả lời:


40

sudo systemctl enable docker đã lừa


2
Cảm ơn, và tôi đã đọc các tài liệu Docker và không thể tìm thấy bất cứ điều gì để giúp đỡ - tôi đã tìm thấy rất nhiều về các chính sách khởi động lại, nhưng tất nhiên chúng chỉ áp dụng khi trình nền của docker bắt đầu.
Chris

6
Bối cảnh: Nguyên nhân của việc này là do docker được kích hoạt socket trên CoreOS, tức là nó không chặn chuỗi khởi động. Các phiên bản đầu tiên của docker khởi động chậm khi bạn có nhiều container trên đĩa đã chặn mọi thứ phụ thuộc vào docker bắt đầu nhanh chóng, điều này gây ra một số thất bại thú vị.
Cướp

4
Lòng tốt. Điều này làm tôi phát điên. Không có gì mà tôi đọc trong bất kỳ tài liệu nào đề cập đến điều này. Tôi gần như đã thề với CoreOS ủng hộ AWS AMI vì nó. (AWS AMI tự động khởi động trình nền Docker theo mặc định).
Nỗi nhớ.io

2
Rất bất thường khi CoreOS hành xử theo cách này, vì CoreOS là HĐH Docker chuyên dụng và nó không khởi động docker trong khi khởi động ???
typelogic

3
Đây là thông tin nghiêm trọng. Các tài liệu CoreOS không đề cập bất cứ điều gì về việc phải kích hoạt Docker (hoặc bất kỳ thời gian chạy container nào khác cho vấn đề đó). Vì có thể bắt đầu các container docker trên CoreOS trần (và vì CoreOS được tạo để chạy container), tôi đã có ấn tượng là mặc định. Tôi chỉ nhận ra sai lầm của mình khi khởi động lại kích hoạt cập nhật đầu tiên không khởi động các thùng chứa của tôi.
Florian von Stosch

6

Điều này bây giờ hơi cũ, nhưng tôi đã bắt đầu sử dụng cloud-init để làm điều này trên tất cả các máy chủ mới. Tôi có một tập lệnh khởi tạo đám mây đã lưu mà tôi sử dụng cho tất cả các máy chủ của mình. Một phần của nó chứa:

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

Điều này sẽ kích hoạt dịch vụ docker và khởi động nó trước và mỗi lần khởi động.


2

Như đã giải thích trong nhận xét này của Rob , docker được kích hoạt ổ cắm. Điều đó có nghĩa là deamon không bắt đầu trừ khi nó được gọi. Các câu trả lời hiện có ở đây hoạt động, nhưng CoreOS đề xuất một cách tiếp cận khác.

Cách được đề xuất để thực hiện việc này, theo tài liệu CoreOS là tạo một dịch vụ cho ứng dụng của riêng bạn, từ đó yêu cầu dịch vụ 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

Và có dịch vụ đó bắt đầu tự động thay thế:

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

Trường hợp sử dụng ví dụ là cập nhật container lên phiên bản mới nhất sau khi dịch vụ bắt đầu và ví dụ nâng cao cũng đăng ký dịch vụ trong vvd. Đọc tài liệu CoreOS để biết thêm thông tin cơ bản.


Đó là "mới nhất" từ CoreOS? Docker đã có chính sách khởi động lại trong nhiều năm và phương pháp này không còn cần thiết hay mong muốn nữa. Nó không bao giờ thực sự là mong muốn, nhưng đó là một cách giải quyết cho (các phiên bản rất cũ) của Docker thiếu sự hỗ trợ để tự khởi động lại các container. Thời gian dài để ngừng sử dụng CoreOS, tôi đoán ...
Michael Hampton

@MichaelHampton Chính sách khởi động lại cũng được áp dụng khi container gặp sự cố vì một lý do khác, vì vậy một chính sách không phải là sự thay thế cho một chính sách khác. Bên cạnh đó, các chính sách khởi động lại không cho phép bạn cập nhật các thùng chứa khi khởi động, v.v. Tôi không biết cái nào tốt hơn, nhưng tôi cho rằng phương pháp này giúp bạn kiểm soát nhiều hơn một chút.
Neograph734

1
Khi bạn bắt đầu cần nhiều sự kiểm soát đó, bạn cũng thường cần rất nhiều bit khác được cung cấp bởi các dịch vụ điều phối: ở phần cuối docker-compose đơn giản, tất cả đều theo cách của Kubernetes.
Michael Hampton

1

Tôi đang sử dụng Docker Swarm, vì vậy tôi không có một ứng dụng cụ thể nào để systemd chịu trách nhiệm ... Tôi chỉ cần docker để bắt đầu khởi động. Đây là giải pháp tôi đã làm việc ra.

Đặt cái này /etc/systemd/system/poke-docker.service:

[Unit]
After=default.target

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

[Install]
WantedBy=default.target

Và sau đó chỉ cần systemctl enable poke-dockerthiết lập nó để kích hoạt trên mỗi lần khởi động, gần cuối chuỗi khởi động. Các docker versionlệnh nói chuyện với daemon Docker, gây ra các ổ cắm và khởi động dịch vụ Docker riêng của mình.

Tôi đã thử systemctl enable dockermẹo trong câu trả lời khác, và trong khi nó hoạt động lúc đầu, nó dường như đã gây ra một tình huống bầy đàn sấm sét ở một nơi nào đó mà docker rõ ràng đang cố gắng làm rất nhiều và thất bại thảm hại. Tôi nghi ngờ đây là hành vi "chặn chuỗi khởi động" được đề cập trong các bình luận ở đó.


Có trường hợp sử dụng tương tự chạy gitlab-runner trên một bầy. Điều này chắc chắn đánh thức daemon. Bạn có thể thêm trình đơn thả xuống systemd trong tệp đánh lửa coreos.com/os/docs/latest/USE-systemd-drop-in-units.html
drgn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.