Làm cách nào để tự động khởi động các container docker khi khởi động hệ thống?


113

Một cách tốt để tự động khởi động container docker khi hệ thống khởi động là gì?

Có cách nào ưa thích để làm điều này trên Ubuntu 14.04 không?

Trước đây tôi đã sử dụng supervisordđể tự động khởi động ứng dụng web. Nhưng điều đó không cảm thấy đúng với Docker.

Câu trả lời:


136

Rõ ràng, phương pháp hiện tại để tự động khởi động các container Docker ( từ Docker 1.2 ) là sử dụng các chính sách khởi động lại . Điều này sẽ kiểm soát cách Docker xử lý việc khởi động container khi khởi động và khởi động lại container khi thoát. Cho đến nay tôi đã sử dụng tùy chọn 'luôn luôn' và có thể xác nhận rằng nó giúp Docker tự động khởi động container khi khởi động hệ thống:

sudo docker run --restart=always -d myimage

Trích dẫn tài liệu

Khởi động lại chính sách Sử dụng cờ - bắt đầu trên Docker chạy, bạn có thể chỉ định chính sách khởi động lại cho cách một container nên hoặc không nên khởi động lại khi thoát.

không - Không khởi động lại container khi thoát.

on-fail - Chỉ khởi động lại container nếu nó thoát với trạng thái thoát không.

luôn luôn - Luôn khởi động lại container bất kể trạng thái thoát.

Bạn cũng có thể chỉ định số lần tối đa Docker sẽ cố gắng khởi động lại vùng chứa khi sử dụng chính sách lỗi. Mặc định là Docker sẽ cố gắng khởi động lại container.

$ sudo docker run --restart=always redis

Điều này sẽ chạy container redis với chính sách khởi động lại luôn để nếu container thoát, Docker sẽ khởi động lại nó.

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

Điều này sẽ chạy bộ chứa redis với chính sách khởi động lại không thành công và số lần khởi động lại tối đa là 10. Nếu bộ chứa redis thoát với trạng thái thoát không bằng 0 hơn một lần, Docker sẽ hủy bỏ việc cố gắng khởi động lại bộ chứa. Cung cấp giới hạn khởi động lại tối đa chỉ có hiệu lực đối với chính sách lỗi.


12
"Luôn luôn - Luôn khởi động lại container bất kể trạng thái thoát" là một chút khó hiểu. Nó sẽ không khởi động lại container nếu bạn thoát / dừng container theo cách thủ công, đó là hành vi tôi đang tìm kiếm.
w00t

12
Lưu ý: một chính sách khác được gọi unless-stoppedđã được thêm vào. Nó hoạt động như thế alwaysnhưng nếu container bị dừng và hệ thống được khởi động lại hoặc daemon docker được khởi động lại, container sẽ không khởi động lại. Xem ở đây để có một bài viết hay về tất cả 4 tùy chọn blog.codeship.com / Từ
David Morales

4
Tất nhiên, dockerdaemon phải tự động khởi động để hỗ trợ điều này.
sherrellbc

Tôi nghĩ rằng câu hỏi là "khởi động hệ thống", nghĩa là sau khi máy chủ vật lý hoặc ảo được khởi động lại, làm thế nào các container tự động khởi động lại, giả sử công cụ docker chạy hoàn toàn sau khi máy chủ khởi động lại?
Root Loop

8

Docker có trang này giải thích cách thực hiện với upstart và systemd. Tôi đồng ý rằng nó dường như không phải là điều phù hợp với Docker. Giải pháp của họ là chạy docker start, giả định rằng bạn đã tạo container của mình. Tôi sẽ nghĩ rằng bạn sẽ làm docker run --rmtrong kịch bản mới nhất (coi nó như một quy trình hoàn toàn mới và bộ chứa từ một hình ảnh) hoặc chỉ để cho trình nền của docker tự khởi động lại các thùng chứa khi khởi động (vì nó sẽ mặc định nếu bạn không làm gì khác ). Upstart có lợi thế là cho phép dễ dàng bắt đầu / dừng quá trình, nhưng bạn cũng có được điều đó với việc bắt đầu / dừng của docker!

Tôi nghĩ thật kỳ lạ khi buộc người dùng tự tạo một thùng chứa (với tất cả các ràng buộc cổng / âm lượng chính xác) trước khi tập lệnh khởi động sẽ hoạt động.


Liên kết bị hỏng ... Đây có vẻ như là một sự thay thế có thể, nhưng chắc chắn nó không hiển thị "làm thế nào"
Gert van den Berg

Cảm ơn, tôi đã sửa liên kết đến một trang tương tự, nhưng tôi không thể chắc chắn rằng nó nói điều tương tự như bản gốc đã làm.
Lawrence Kesteloot

6

Nhưng điều đó không cảm thấy đúng với Docker.

Tại sao không?

Tôi sử dụng giám sát cho việc này rất thành công.

Sử dụng những gì bạn biết, sử dụng những gì hoạt động, sử dụng những gì bạn có thể dễ dàng duy trì và hiểu.


Cảm ơn @EEAA .. điều đó có nghĩa là bạn chạy chúng ở chế độ không phải daemon? Điều đó cũng không có nghĩa là bạn cần chạy chúng --rmsao?
Stefan Arentz

Tôi chạy các container ở chế độ tiền cảnh và để giám sát bắt stdout / stderr. Tôi không chắc tại sao --rmcó liên quan ở đây.
EEAA

@EEAA: về câu hỏi của bạn: Đối với một số người, dockerlà sự thay thế cho lxchoặc openvzlxc.start.auto = 1vzctl set --onboot yes. Ngoài ra ESXi và các giải pháp ảo hóa khác có tính năng như vậy đi kèm. Giống như Lawrence, tôi cũng không nghĩ rằng tính năng tự khởi động như vậy nên được triển khai theo cách dành riêng cho phân phối vì người dùng docker có thể giải quyết cùng một vấn đề với cùng một kiến ​​thức trên mọi nền tảng.
Daniel Alder

1
Đúng vậy, Docker là một cách tuyệt vời để tách rời máy chủ khỏi chạy container, vì vậy sử dụng cấu hình dành riêng cho máy chủ là một bước lùi.
nijave
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.