Як зробити так, щоб контейнер Docker запускався автоматично під час завантаження системи?


103

Припустимо, у мене є контейнер Docker, який я хочу запустити, тоді я можу зателефонувати

$ docker run ...

і все добре. Чи існує вбудований спосіб запуску контейнера таким чином, що він буде перезапущений автоматично, якщо система вийде з ладу та перезавантажиться?

Якщо так, чи це також доступно в Docker Compose?

Відповіді:


126

Так, Docker має такі політики перезапуску , як-от, docker run --restart=alwaysщо це вирішить. Це також доступно у файлі конфігурації compose.yml як restart: always.


24
Це перша і прийнята відповідь, проте, ймовірно, більшість людей, які шукають цю функцію, справді хочуть запустити свій контейнер як послугу. Відповідь @kon, яка використовується Systemdяк менеджер послуг, є одним з найкращих рішень для цієї мети і потребує більшої кількості голосів.
Ремі Бехерас,

1
Це не спрацювало у мене. У мене є контейнер під назвою «crmpicco-MySQL» , і я побіг , docker run --restart=always crmpicco-mysqlі я отримав помилку: Unable to find image 'crmpicco-mysql:latest' locally.
crmpicco

2
Ваша помилка не пов’язана. Можливо, ви захочете опублікувати окреме запитання, але схоже, ви плутаєте імена зображень докерів та імена контейнерів докерів. docker runКоманда очікує , що ім'я зображення , яке ви можете перерахувати через docker images.
Пітер Лайонс,

11
Єдина проблема в тому, що "завжди" також нескінченно перезапустить контейнер, коли його було зупинено через помилку (див. Документи). Повинна існувати політика, яка починається лише з демона-запуску
lostiniceland

4
Я вважав, що однією з основних точок продажу контейнерів / докерів є те, що мені не потрібно встановлювати та керувати кожною своєю службою в systemd (що може бути болем).
Марк

134

Якщо ви хочете, щоб контейнер запускався, навіть якщо жоден користувач не виконував вхід (наприклад, віртуальна машина VirtualBox, яку я лише запускаю і не хочу входити щоразу). Ось кроки, які я виконував для Ubuntu 16.04 LTS. Як приклад, я встановив контейнер 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

та додайте такий вміст:

[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

і ввімкнути послугу під час запуску

sudo systemctl enable docker-MYPROJECT-oracle_db.service

Для отримання додаткової інформації https://docs.docker.com/engine/admin/host_integration/


8
Для тих, хто хоче зробити це за допомогою docker-compose, ви можете замінити docker наведену вище docker-composeкоманду командою, використовуючи -fпрапорець, щоб вказати розташування файлу /usr/bin/docker-compose -f /path/to/docker-compose.yml up
docker

1
Щоб додати до того, що сказав @ charlesreid1, якщо ваш файл docker-compose.ymlвказує .env, використовуйте, --project-directory /path/to окрім явного вказівки, свій файл складання докера.
whlteXbread

1
Docker має свою систему журналів та менеджер процесів. На жаль, він не має правильної політики перезапуску.
Франклін Ю.

Будь-яка ідея, як це зробити на Windows Server 2012? Я не можу запустити докер, якщо не
Алекс Лорд Мордор

Декому також може бути цікаво, що [Unit]називається корисна директива Before=. Особливо при запуску таких речей, як системи управління базами даних, може бути корисним переконатися, що це було запущено до певних інших служб.
Міха

89

Політика перезавантаження по замовчуванням є no.

Для створених контейнерів використовуйте docker updateдля оновлення політики перезапуску.

docker update --restart=always 0576df221c0b

0576df221c0b - ідентифікатор контейнера.


Це не alwaysозначає, що контейнер перезапуститься, навіть якщо я його зупиню? Звичайно, є спосіб перезапустити контейнер при перезавантаженні без такого постійного запуску ...
Марк,

4
@Marc: ні. Дивіться документацію :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

Можна використовувати docker update --restart=on-failure <container ID or name>.

На додаток до того, що випливає з назви, on-failureбуде не тільки перезапущений контейнер при відмові, але і при завантаженні системи.

Відповідно до документації існує кілька варіантів перезапуску:

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
Вау хороша робота, виявивши це, враховуючи, що це не згадується в документації. Для мене ідеальне рішення.
Кемерон Хадсон,

Зауважимо одне про використання при відмові, якщо у вас є контейнер, який залежить від іншого, який вже запущений, здається, немає "порядку запуску", тому можна запустити і негайно вийти з ладу і ніколи не запускатись при завантаженні ОС
ferr

8

Більш "щадний" режим з документації:

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

2
На жаль, коли демон докера зупиняється перезавантаженням, демон «зупиняє» контейнери, позначаючи їх як зупинені. Потім, коли система завантажується, вона насправді їх не запускає. Це німо. Ось помилка: github.com/docker/for-linux/issues/652
mlissner

7

1) Перш за все, ви повинні включити службу докера при завантаженні

$ sudo systemctl enable docker

2) Тоді, якщо у вас є файл docker-compose .yml, додайте файл restart: alwaysабо якщо у вас є контейнер docker, додайте restart = завжди так:

docker run --restart=always і запустіть контейнер докера

Переконайтесь

Якщо вручну зупинити контейнер, його політика перезапуску ігнорується, доки демон Docker не перезапуститься або контейнер не буде перезапущений вручну.

див. цю політику перезапуску на офіційній сторінці Docker

3) Якщо ви хочете запустити docker-compose, усі служби запускаються під час перезавантаження системи. Отже, ви запускаєте команду нижче один раз

$ docker-compose up -d

2

Для цього призначений crontab:

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

Отримайте доступ до вашого користувацького crontab, crontab -eабо покажіть його, crontab -lабо відредагуйте ваш системний crontab за адресою/etc/crontab


Що таке cron service start before docker service ... у цьому випадку це не вдасться ...
Akhil Jalagam

1
@AkhilJalagam Я не впевнений, що розумію вашу проблему. "Сон 10" дає Crond достатньо часу для запуску, а потім запускає контейнер після завантаження / перезавантаження системи. Цей метод не потребує, щоб хтось входив в систему перед запуском, і дозволяє уникнути брудних, складних системних підрозділів обслуговування. Метод одиниці обслуговування systemd відчуває себе навіть більш хакі, ніж мій приклад.
Тревіс Ран'ярд

2

Ви можете запустити контейнер, який завжди перезапускається:

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

Якщо ви хочете змінити конфігурації запущеного контейнера, вам слід оновити його за допомогою:

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

І якщо ви хочете побачити поточну політику контейнера, спочатку виконайте наступну команду:

docker inspect gateway | grep RestartPolicy -A 3

Зрештою, щоб не забути ввімкнути встановлений демон Docker під час завантаження системи :

$ systemctl enable docker

Щоб переглянути повний список політик перезапуску, див .: Політики перезапуску


1

Я хотів досягти запуску контейнера під час завантаження в Windows.

Тому я щойно створив заплановане завдання, яке запускається під час завантаження системи. Це завдання просто запускає "Docker для Windows.exe" (або як інакше називається ваш виконуваний файл docker).

Потім запускаються всі контейнери з політикою перезапуску "завжди".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.