Làm cách nào để tạo vùng chứa Docker tự động khởi động khi khởi động hệ thống?


103

Giả sử tôi có vùng chứa Docker muốn chạy, sau đó tôi có thể gọi

$ docker run ...

và mọi thứ đều ổn. Có cách nào được tích hợp sẵn để chạy vùng chứa theo cách nó sẽ tự động khởi động lại, nếu hệ thống gặp sự cố và khởi động lại không?

Nếu vậy, điều này cũng có sẵn trong Docker Compose?

Câu trả lời:


126

Vâng, Docker có chính sách khởi động lại như docker run --restart=alwaysrằng sẽ xử lý việc này. Điều này cũng có sẵn trong tệp cấu hình compile.yml dưới dạng restart: always.


24
Đây là câu trả lời đầu tiên và được chấp nhận, tuy nhiên có lẽ hầu hết mọi người đang tìm kiếm tính năng đó thực sự muốn chạy vùng chứa của họ như một dịch vụ. Các câu trả lời @kon 's sử dụng Systemdnhư quản lý dịch vụ là một trong những giải pháp tốt nhất cho mục đích đó và cần thêm upvotes.
Rémi Becheras

1
Điều này không hiệu quả với tôi. Tôi có một container gọi là "crmpicco-mysql" và tôi chạy docker run --restart=always crmpicco-mysqlvà tôi đã nhận lỗi: Unable to find image 'crmpicco-mysql:latest' locally.
crmpicco

2
Lỗi của bạn là không liên quan. Bạn có thể muốn đăng một câu hỏi riêng biệt nhưng có vẻ như bạn đang nhầm lẫn giữa tên hình ảnh docker và tên vùng chứa docker. Các docker runlệnh hy vọng tên của một hình ảnh mà bạn có thể liệt kê qua docker images.
Peter Lyons

11
Vấn đề duy nhất với điều này là "luôn luôn" cũng sẽ khởi động lại vô hạn vùng chứa khi nó bị dừng do lỗi (xem tài liệu). Nên có một chính sách mà chỉ bắt đầu từ ngày daemon-start
lostiniceland

4
Tôi nghĩ rằng một trong những điểm bán hàng chính của container / docker là tôi không cần cài đặt và quản lý từng dịch vụ của mình trong systemd (điều này có thể gây khó khăn).
Marc

135

Nếu bạn muốn vùng chứa được khởi động ngay cả khi không có người dùng nào thực hiện đăng nhập (như máy ảo VirtualBox mà tôi chỉ khởi động và không muốn đăng nhập mỗi lần). Đây là các bước tôi đã thực hiện đối với Ubuntu 16.04 LTS. Ví dụ, tôi đã cài đặt một vùng chứa oracle db:

$ docker pull alexeiled/docker-oracle-xe-11g
$ docker run -d --name=MYPROJECT_oracle_db --shm-size=2g -p 1521:1521 -p 8080:8080 alexeiled/docker-oracle-xe-11g
$ vim /etc/systemd/system/docker-MYPROJECT-oracle_db.service

và thêm nội dung sau:

[Unit]
Description=Redis container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a MYPROJECT_oracle_db
ExecStop=/usr/bin/docker stop -t 2 MYPROJECT_oracle_db

[Install]
WantedBy=default.target

và kích hoạt dịch vụ khi khởi động

sudo systemctl enable docker-MYPROJECT-oracle_db.service

Để biết thêm thông tin, https://docs.docker.com/engine/admin/host_integration/


8
Đối với những ai muốn làm điều này với Docker-soạn, bạn có thể thay thế các dockerlệnh trên với các docker-composelệnh, bằng cách sử dụng -flá cờ để xác định vị trí của tập tin Docker-soạn:/usr/bin/docker-compose -f /path/to/docker-compose.yml up
charlesreid1

1
Để thêm vào những gì @ charlesreid1 đã nói, nếu bạn docker-compose.ymlchỉ định một .envtệp, hãy sử dụng --project-directory /path/to ngoài việc chỉ định rõ ràng tệp soạn docker của bạn.
whlteXbread

1
Docker có hệ thống nhật ký và trình quản lý quy trình. Thật không may là nó không có chính sách khởi động lại phù hợp.
Franklin Yu

Bất kỳ ý tưởng nào về cách thực hiện việc này trên Windows Server 2012? Tôi không thể chạy Docker trừ khi tôi đăng nhập ...
Alex Chúa Mordor

Cũng có thể thú vị với một số người rằng có một [Unit]chỉ thị hữu ích được gọi là Before=. Đặc biệt là khi bắt đầu những thứ như hệ thống quản lý cơ sở dữ liệu, có thể hữu ích nếu đảm bảo nó được khởi động trước các dịch vụ cụ thể khác.
Micha

89

Các chính sách khởi động lại mặc địnhno.

Đối với các vùng chứa đã tạo, hãy sử dụng docker updateđể cập nhật chính sách khởi động lại.

docker update --restart=always 0576df221c0b

0576df221c0b là id vùng chứa.


Không alwayscó nghĩa là vùng chứa sẽ khởi động lại ngay cả khi tôi dừng nó? Chắc chắn có một cách để khởi động lại một container trên khởi động lại mà không cần loại này bắt đầu dai dẳng ...
Marc

4
@Marc: không. Xem tài liệu :If you manually stop a container, its restart policy is ignored until the Docker daemon restarts or the container is manually restarted. This is another attempt to prevent a restart loop.
SaeX

12

Bạn có thể sử dụng docker update --restart=on-failure <container ID or name>.

Trên hết những gì tên gợi ý, on-failuresẽ không chỉ khởi động lại vùng chứa khi bị lỗi mà còn khi khởi động hệ thống.

Theo tài liệu , có nhiều tùy chọn khởi động lại:

Flag            Description
no              Do not automatically restart the container. (the default)
on-failure      Restart the container if it exits due to an error, which manifests as a non-zero exit code.
always          Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details)
unless-stopped  Similar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.

2
Chà, làm tốt lắm khi phát hiện ra điều này, vì nó không được đề cập trong tài liệu. Giải pháp hoàn hảo cho tôi.
Cameron Hudson

Một điều cần lưu ý về việc sử dụng on-fail, nếu bạn có một vùng chứa phụ thuộc vào một vùng chứa khác đang chạy, dường như không có "lệnh bắt đầu", vì vậy một vùng chứa có thể bắt đầu và ngay lập tức bị lỗi và không bao giờ khởi động khi khởi động hệ điều hành
ferr

8

Chế độ "nhẹ nhàng" hơn từ tài liệu:

docker run -dit --restart unless-stopped <image_name>

2
Thật không may, khi trình nền docker bị dừng khởi động lại, daemon sẽ "dừng" các vùng chứa, đánh dấu chúng là đã dừng. Sau đó, khi hệ thống khởi động, nó không thực sự khởi động những điều này. Thật ngu ngốc. Đây là lỗi: github.com/docker/for-linux/issues/652
mlissner

7

1) Trước hết, bạn phải bật dịch vụ docker khi khởi động

$ sudo systemctl enable docker

2) Sau đó, nếu bạn có thêm tệp docker-soạn .yml restart: alwayshoặc nếu bạn có bộ chứa docker , hãy thêm khởi động lại = luôn như thế này:

docker run --restart=always và chạy bộ chứa docker

Bảo đảm

Nếu bạn dừng vùng chứa theo cách thủ công, chính sách khởi động lại của nó sẽ bị bỏ qua cho đến khi daemon Docker khởi động lại hoặc vùng chứa được khởi động lại theo cách thủ công.

xem chính sách khởi động lại này trên trang chính thức của Docker

3) Nếu bạn muốn khởi động docker-soạn, tất cả các dịch vụ sẽ chạy khi bạn khởi động lại hệ thống của mình Vì vậy, bạn chỉ chạy lệnh dưới đây một lần

$ docker-compose up -d

2

Đây là những gì crontab dành cho:

@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'

Truy cập crontab người dùng của bạn bằng crontab -ehoặc hiển thị nó bằng crontab -lhoặc chỉnh sửa crontab hệ thống của bạn tại/etc/crontab


Dịch vụ cron bắt đầu trước khi dịch vụ Docker là gì ... điều này sẽ thất bại trong trường hợp này ...
Akhil Jalagam

1
@AkhilJalagam Tôi không chắc mình hiểu vấn đề của bạn. "Sleep 10" cung cấp cho crond nhiều thời gian để khởi động, sau đó khởi động vùng chứa sau khi khởi động / khởi động lại hệ thống. Phương pháp này không cần bất kỳ ai đăng nhập trước khi bắt đầu và tránh các đơn vị dịch vụ systemd lộn xộn, phức tạp. Phương pháp đơn vị dịch vụ systemd thậm chí còn khó hơn ví dụ của tôi.
Travis Runyard

2

Bạn có thể chạy một vùng chứa luôn khởi động lại bằng cách:

$ docker run -dit --restart unless-stopped <image name OR image hash>

Nếu bạn muốn thay đổi cấu hình của một vùng chứa đang chạy, bạn nên cập nhật nó bằng cách:

$ docker update --restart=<options> <container ID OR name>

Và nếu bạn muốn xem chính sách hiện tại của vùng chứa, hãy chạy lệnh sau ở trên ở vị trí đầu tiên:

docker inspect gateway | grep RestartPolicy -A 3

Sau cùng, đừng quên kích hoạt daemon docker đã cài đặt khi khởi động hệ thống bằng cách:

$ systemctl enable docker

Để xem danh sách đầy đủ các chính sách khởi động lại, hãy xem: Chính sách khởi động lại


1

Tôi muốn khởi động vùng chứa khi khởi động trên Windows.

Do đó, tôi vừa tạo một Tác vụ đã lên lịch khởi chạy khi khởi động hệ thống. Tác vụ đó chỉ cần bắt đầu "Docker cho Windows.exe" (hoặc bất cứ điều gì là tên của tệp thực thi docker của bạn).

Sau đó, tất cả các vùng chứa có chính sách khởi động lại là "luôn luôn" sẽ khởi động.

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.