Автозапуск docker в ubuntu

Обновлено: 01.07.2024

Docker provides restart policies to control whether your containers start automatically when they exit, or when Docker restarts. Restart policies ensure that linked containers are started in the correct order. Docker recommends that you use restart policies, and avoid using process managers to start containers.

Restart policies are different from the --live-restore flag of the dockerd command. Using --live-restore allows you to keep your containers running during a Docker upgrade, though networking and user input are interrupted.

Use a restart policy

To configure the restart policy for a container, use the --restart flag when using the docker run command. The value of the --restart flag can be any of the following:

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.

The following example starts a Redis container and configures it to always restart unless it is explicitly stopped or Docker is restarted.

This command changes the restart policy for an already running container named redis .

And this command will ensure all currently running containers will be restarted unless stopped.

Restart policy details

Keep the following in mind when using restart policies:

A restart policy only takes effect after a container starts successfully. In this case, starting successfully means that the container is up for at least 10 seconds and Docker has started monitoring it. This prevents a container which does not start at all from going into a restart loop.

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.

Restart policies only apply to containers. Restart policies for swarm services are configured differently. See the flags related to service restart.

Use a process manager

If restart policies don’t suit your needs, such as when processes outside Docker depend on Docker containers, you can use a process manager such as upstart, systemd, or supervisor instead.

Warning

Do not try to combine Docker restart policies with host-level process managers, because this creates conflicts.

To use a process manager, configure it to start your container or service using the same docker start or docker service command you would normally use to start the container manually. Consult the documentation for the specific process manager for more details.

Using a process manager inside containers

Process managers can also run within the container to check whether a process is running and starts/restart it if not.

Warning

These are not Docker-aware and just monitor operating system processes within the container. Docker does not recommend this approach, because it is platform-dependent and even differs within different versions of a given Linux distribution.

Docker в значительной мере изменил подход к настройке серверов, поддержке и доставке приложений. Разработчики начинают задумываться о том, можно ли архитектуру их приложений разделить на более мелкие компоненты, которые будут запускаться в изолированных контейнерах, что позволит достичь большего ускорения, параллелизации исполнения и надежности. Также Docker решает важную проблему снятия облачного vendor–lock и позволяет легко мигрировать настроенные приложения между собственными серверами и облаками. Все что требуется от сервера, чтобы запустить Docker – более-менее современная ОС Linux с ядром не ниже 3.8.

В этой статье мы расскажем о том, как просто использовать Docker и какие преимущества он даст сисадмину и разработчику. Забудьте про проблемы с зависимостями, запускайте на одном сервере софт, требующий разные дистрибутивы Linux, не бойтесь «загрязнить» систему неправильными действиями. И делитесь наработками с сообществом. Docker решает множество актуальных проблем и помогает сделать IaaS гораздо более похожими на PaaS, без vendor-lock.

InfoboxCloud Docker

На облачных VPS от Infobox мы сделали готовый образ Ubuntu 14.04 с Docker. Получите бесплатную пробную версию (кнопка «Тестировать 10 дней») и начните использовать Docker прямо сейчас! Не забудьте поставить галочку «Разрешить управление ядром ОС» при создании сервера, это требуется для работы Docker. В самое ближайшее время у нас появятся и другие ОС с Docker внутри.

Под катом вы узнаете, что же в Docker настолько воодушевило автора статьи, что за пару дней он перевел свои облачные сервера, автоматизирующие части процесса разработки, в контейнеры Docker.

Что же такое Docker

Docker – open–source движок, автоматизирующий развертывание приложений в легковесные, переносимые, самодостаточные контейнеры, которые могут без изменений переноситься между серверами.

Тот же самый контейнер, который разработчик создает и тестирует на ноутбуке, может быть легко перенесен на продакшн-сервера в облако и так же легко смигрирован в другой регион при необходимости.

  • Автоматизация упаковки и развертывания приложений
  • Создание собственных легковесных PaaS окружений
  • Автоматизация тестирования и непрерывной интеграции/развертывания
  • Развертывание и масштабирование веб-приложений, баз данных и сервисов бекенда

Можно провести неплохую аналогию из области грузоперевозок. До 1960х большинство грузов перевозились вперемешку. Перевозчикам нужно было заботиться о воздействии одного типа груза на другой (например, если наковальни внезапно положили на мешки с бананами). Смена транспорта, например с поезда на корабль, для груза тоже было испытанием. До половины времени поездки занимала погрузка, разгрузка и перегрузка. Были большие потери в процессе поездки из-за повреждения груза.

Решением проблемы стал стандартный контейнер для перевозки. Теперь любые типы грузов (от помидоров до автомобилей) могли быть упакованы в контейнеры. Контейнеры не открывались до окончания поездки. Легко было эффективно расположить контейнеры на транспорте и перегружать автоматическими кранами при необходимости, без разгрузки самого контейнера. Контейнеры изменили мир грузоперевозок. Сегодня 18 миллионов перевозимых стандартных контейнеров составляют 90% мировой торговли.



Контейнеры для морских грузовых перевозок в порту Циндао, Китай.

Docker можно представить именно как такие контейнеры в коде компьютера. Практически любое приложение может быть упаковано в легковесный контейнер, позволяющий автоматизацию. Такие контейнеры спроектированы, чтобы запускаться виртуально на любом Linux–сервере (с ядром 3.8 и выше).

Другими словами, разработчики могут упаковать свои приложения один раз и будут уверены, что приложение запускается именно в их протестированной конфигурации. Работа сисадминов также значительно упрощается — о поддержке софта нужно заботиться все меньше.

Компоненты Docker

Клиент и сервер

Docker – клиент-серверное приложение. Клиенты разговаривают с сервером (демоном), который непосредственно делает всю работу. Для управления Docker можно использовать утилиту командной строки docker и RESTful API. Можно запускать клиент и сервер на одном хосте или удаленно подключаться к Docker-серверу.

Образы Docker

Свои контейнеры пользователь запускает из образов, которые являются частью процесса построения контейнера. Образ использует AuFS для прозрачного монтирования файловых систем. С помощью bootfs загружается контейнер в память. Затем bootfs отмонтируется, освобождая память. Далее работает rootfs (от Debian, Ubuntu и т.д.). В Docker rootfs монтируется в режиме «только для чтения». Когда контейнер запущен из образа, монтируется файловая система на запись поверх необходимого слоя ниже.


Реестры

Docker хранит созданные вами образы в реестрах. Существует два типа реестров: публичные и приватные. Официальный реестр называется Docker Hub. Создав в нем аккаунт, можно сохранять свои образы в нем и делиться ими с другими пользователями.

В Docker Hub уже более 10 000 образов с различными ОС и программным обеспечением. Также можно сохранять приватные образы в Docker Hub и использовать их в рамках вашей организации. Использование Docker Hub необязательно. Возможно создание собственных репозиториев вне инфраструктуры Docker (например на ваших корпоративных облачных серверах).

Контейнеры

Docker помогает вам создавать и развертывать контейнеры, внутри которых вы можете запускать ваши приложения и сервисы. Контейнеры запускаются из образов.

Когда Docker запускает контейнер, слой для записи пуст. При изменениях они записываются в этот слой. Например при изменении файла он копируется в слой, доступный для записи (copy on write). Копия «только для чтения» по-прежнему существует, но скрывается. После создания контейнера Docker выстраивает набор read–only образов и подключает слой для записи.

Создаем интерактивный контейнер

После создания виртуальной машины с Docker можно приступать к созданию контейнеров. Получить базовую информацию об инсталляции можно командой docker info.



Полный список доступных команд можно получить командой docker help.

Давайте построим контейнер с Ubuntu.

Флаг -i оставляет STDIN открытым, даже, когда вы не присоединены к контейнеру. Флаг -t назначает псевдо-tty контейнеру. Таким образом создается интерактивный интерфейс к контейнеру. Так же мы указываем название образа (ubuntu — базовый образ) и шелл /bin/bash.

Давайте установим nano в контейнер.

Выйти из контейнера можно командой exit.

Команда docker ps показывает список всех запущенных контейнеров, а docker ps -a – список всех, включая остановленные.



В списке запущенных контейнеров нет. Когда вы вышли из контейнера, он остановился. На скриншоте выше (docker ps -a) видно имя контейнера. Когда вы создаете контейнер, имя генерируется автоматически. Вы можете указать другое имя при создании контейнера:

Обращаться к контейнеру можно не только по ID, но и по имени.
Давайте запустим контейнер:

Для подключения к контейнеру необходимо использовать команду attach:

(может понадобиться нажатие Enter до появления приглашения).

Создаем контейнер-демон

Конечно, можно создавать и долгоживущие контейнеры, подходящие для запусков приложений и сервисов. Такие контейнеры не имеют интерактивной сессии.
, где city – имя контейнера.
Посмотреть, что происходит внутри контейнера можно командой docker logs <имя контейнера>.
Остановить контейнер можно командой docker stop <имя контейнера>. Если после этого запустить контейнер снова docker start <имя контейнера>, выполнение цикла while продолжится в контейнере.

Увидеть детали контейнера можно командой docker inspect <имя контейнера>.
Чтобы удалить контейнер, используйте docker rm <имя контейнера>.

Как достать и положить данные?

Для того, чтобы скопировать данные в контейнер или вынуть из него, необходимо воспользоваться командой

Можно подмонтировать папку хоста в контейнер при создании:
,
где /tmp – путь к папке на хосте, а /root – путь к папке на сервере. Таким образом можно работать из контейнера с данными на хосте и исключить необходимость копирования данных в обе стороны.

Работаем с образами

Давайте посмотрим список всех наших образов docker images


Изменения в существующем контейнере можно закоммитить в образ для дальнейшего использования.
.

Перенос образа на другой хост

Наконец-то о главном. Допустим, вы настроили свое приложение в Docker и закоммитили в образ. Теперь можно сохранить образ в файл

Копируем этот образ на другой хост например с помощью scp и импортируем его в Docker.

Вот и все, можно легко переносить свои приложения между хостами, облаками и собственными серверами. Никакого vendor–lock. Только ради этого стоит использовать Docker! (если вы сохраняли данные на примонтированную файловую систему, не забудьте перенести и их).

Устанавливаем nginx в Docker

Давайте для примера установим nginx в Docker и настроим его автозапуск. Конечно можно просто скачать образ с nginx для Docker, но мы посмотрим, как это делается с самого начала.

Создайте чистый контейнер с Ubuntu 14.04 с открытыми 80 и 443 портами:

Добавьте в /etc/apt/sources.list официальный репозиторий стабильной версии nginx:


Можно проверить, что nginx запускается, выполнив:


Мы увидим страницу приветствия, зайдя на ip сервера на порт 80:

Здесь мы впервые встретились с Docker Hub. Время создать аккаунт в этом сервисе и залогиниться с помощью команды docker login.

Отправим наш образ trukhinyuri/nginx на docker hub для повторного использования на других серверах в будущем. (здесь trukhinyuri – имя репозитория автора):

Для того, чтобы nginx стартовал при запуске хоста, добавим скрипт инициализации upstart по адресу /etc/init/nginx.conf:

Заключение

В этой статье вы смогли попробовать Docker и оценить, как просто упаковывать приложение и мигрировать между различными хостами. Это только вершина айсберга, очень многое осталось за кадром и будет рассмотрено в будущем. Для дополнительного чтения рекомендуем книгу The Docker Book.

Попробовать образ с Docker в на облачных VPS от Infobox в Амстердаме можно, получив пробную версию бесплатно (кнопка «Тестировать 10 дней»).

UPD: Доступ в пробную версию облачных VPS временно ограничен. Заказ по-прежнему доступен. Мы тестируем новую технологию, позволяющую сделать сервис еще быстрее. Следите за новостями.

Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней.
В случае, если вы не можете оставлять комментарии на Хабре — напишите комментарий к статье в Сообществе InfoboxCloud.

Docker в значительной мере изменил подход к настройке серверов, поддержке и доставке приложений. Разработчики начинают задумываться о том, можно ли архитектуру их приложений разделить на более мелкие компоненты, которые будут запускаться в изолированных контейнерах, что позволит достичь большего ускорения, параллелизации исполнения и надежности. Также Docker решает важную проблему снятия облачного vendor–lock и позволяет легко мигрировать настроенные приложения между собственными серверами и облаками. Все что требуется от сервера, чтобы запустить Docker – более-менее современная ОС Linux с ядром не ниже 3.8.

В этой статье мы расскажем о том, как просто использовать Docker и какие преимущества он даст сисадмину и разработчику. Забудьте про проблемы с зависимостями, запускайте на одном сервере софт, требующий разные дистрибутивы Linux, не бойтесь «загрязнить» систему неправильными действиями. И делитесь наработками с сообществом. Docker решает множество актуальных проблем и помогает сделать IaaS гораздо более похожими на PaaS, без vendor-lock.

InfoboxCloud Docker

На облачных VPS от Infobox мы сделали готовый образ Ubuntu 14.04 с Docker. Получите бесплатную пробную версию (кнопка «Тестировать 10 дней») и начните использовать Docker прямо сейчас! Не забудьте поставить галочку «Разрешить управление ядром ОС» при создании сервера, это требуется для работы Docker. В самое ближайшее время у нас появятся и другие ОС с Docker внутри.

Под катом вы узнаете, что же в Docker настолько воодушевило автора статьи, что за пару дней он перевел свои облачные сервера, автоматизирующие части процесса разработки, в контейнеры Docker.

Что же такое Docker

Docker – open–source движок, автоматизирующий развертывание приложений в легковесные, переносимые, самодостаточные контейнеры, которые могут без изменений переноситься между серверами.

Тот же самый контейнер, который разработчик создает и тестирует на ноутбуке, может быть легко перенесен на продакшн-сервера в облако и так же легко смигрирован в другой регион при необходимости.

  • Автоматизация упаковки и развертывания приложений
  • Создание собственных легковесных PaaS окружений
  • Автоматизация тестирования и непрерывной интеграции/развертывания
  • Развертывание и масштабирование веб-приложений, баз данных и сервисов бекенда

Можно провести неплохую аналогию из области грузоперевозок. До 1960х большинство грузов перевозились вперемешку. Перевозчикам нужно было заботиться о воздействии одного типа груза на другой (например, если наковальни внезапно положили на мешки с бананами). Смена транспорта, например с поезда на корабль, для груза тоже было испытанием. До половины времени поездки занимала погрузка, разгрузка и перегрузка. Были большие потери в процессе поездки из-за повреждения груза.

Решением проблемы стал стандартный контейнер для перевозки. Теперь любые типы грузов (от помидоров до автомобилей) могли быть упакованы в контейнеры. Контейнеры не открывались до окончания поездки. Легко было эффективно расположить контейнеры на транспорте и перегружать автоматическими кранами при необходимости, без разгрузки самого контейнера. Контейнеры изменили мир грузоперевозок. Сегодня 18 миллионов перевозимых стандартных контейнеров составляют 90% мировой торговли.



Контейнеры для морских грузовых перевозок в порту Циндао, Китай.

Docker можно представить именно как такие контейнеры в коде компьютера. Практически любое приложение может быть упаковано в легковесный контейнер, позволяющий автоматизацию. Такие контейнеры спроектированы, чтобы запускаться виртуально на любом Linux–сервере (с ядром 3.8 и выше).

Другими словами, разработчики могут упаковать свои приложения один раз и будут уверены, что приложение запускается именно в их протестированной конфигурации. Работа сисадминов также значительно упрощается — о поддержке софта нужно заботиться все меньше.

Компоненты Docker

Клиент и сервер

Docker – клиент-серверное приложение. Клиенты разговаривают с сервером (демоном), который непосредственно делает всю работу. Для управления Docker можно использовать утилиту командной строки docker и RESTful API. Можно запускать клиент и сервер на одном хосте или удаленно подключаться к Docker-серверу.

Образы Docker

Свои контейнеры пользователь запускает из образов, которые являются частью процесса построения контейнера. Образ использует AuFS для прозрачного монтирования файловых систем. С помощью bootfs загружается контейнер в память. Затем bootfs отмонтируется, освобождая память. Далее работает rootfs (от Debian, Ubuntu и т.д.). В Docker rootfs монтируется в режиме «только для чтения». Когда контейнер запущен из образа, монтируется файловая система на запись поверх необходимого слоя ниже.


Реестры

Docker хранит созданные вами образы в реестрах. Существует два типа реестров: публичные и приватные. Официальный реестр называется Docker Hub. Создав в нем аккаунт, можно сохранять свои образы в нем и делиться ими с другими пользователями.

В Docker Hub уже более 10 000 образов с различными ОС и программным обеспечением. Также можно сохранять приватные образы в Docker Hub и использовать их в рамках вашей организации. Использование Docker Hub необязательно. Возможно создание собственных репозиториев вне инфраструктуры Docker (например на ваших корпоративных облачных серверах).

Контейнеры

Docker помогает вам создавать и развертывать контейнеры, внутри которых вы можете запускать ваши приложения и сервисы. Контейнеры запускаются из образов.

Когда Docker запускает контейнер, слой для записи пуст. При изменениях они записываются в этот слой. Например при изменении файла он копируется в слой, доступный для записи (copy on write). Копия «только для чтения» по-прежнему существует, но скрывается. После создания контейнера Docker выстраивает набор read–only образов и подключает слой для записи.

Создаем интерактивный контейнер

После создания виртуальной машины с Docker можно приступать к созданию контейнеров. Получить базовую информацию об инсталляции можно командой docker info.



Полный список доступных команд можно получить командой docker help.

Давайте построим контейнер с Ubuntu.

Флаг -i оставляет STDIN открытым, даже, когда вы не присоединены к контейнеру. Флаг -t назначает псевдо-tty контейнеру. Таким образом создается интерактивный интерфейс к контейнеру. Так же мы указываем название образа (ubuntu — базовый образ) и шелл /bin/bash.

Давайте установим nano в контейнер.

Выйти из контейнера можно командой exit.

Команда docker ps показывает список всех запущенных контейнеров, а docker ps -a – список всех, включая остановленные.



В списке запущенных контейнеров нет. Когда вы вышли из контейнера, он остановился. На скриншоте выше (docker ps -a) видно имя контейнера. Когда вы создаете контейнер, имя генерируется автоматически. Вы можете указать другое имя при создании контейнера:

Обращаться к контейнеру можно не только по ID, но и по имени.
Давайте запустим контейнер:

Для подключения к контейнеру необходимо использовать команду attach:

(может понадобиться нажатие Enter до появления приглашения).

Создаем контейнер-демон

Конечно, можно создавать и долгоживущие контейнеры, подходящие для запусков приложений и сервисов. Такие контейнеры не имеют интерактивной сессии.
, где city – имя контейнера.
Посмотреть, что происходит внутри контейнера можно командой docker logs <имя контейнера>.
Остановить контейнер можно командой docker stop <имя контейнера>. Если после этого запустить контейнер снова docker start <имя контейнера>, выполнение цикла while продолжится в контейнере.

Увидеть детали контейнера можно командой docker inspect <имя контейнера>.
Чтобы удалить контейнер, используйте docker rm <имя контейнера>.

Как достать и положить данные?

Для того, чтобы скопировать данные в контейнер или вынуть из него, необходимо воспользоваться командой

Можно подмонтировать папку хоста в контейнер при создании:
,
где /tmp – путь к папке на хосте, а /root – путь к папке на сервере. Таким образом можно работать из контейнера с данными на хосте и исключить необходимость копирования данных в обе стороны.

Работаем с образами

Давайте посмотрим список всех наших образов docker images


Изменения в существующем контейнере можно закоммитить в образ для дальнейшего использования.
.

Перенос образа на другой хост

Наконец-то о главном. Допустим, вы настроили свое приложение в Docker и закоммитили в образ. Теперь можно сохранить образ в файл

Копируем этот образ на другой хост например с помощью scp и импортируем его в Docker.

Вот и все, можно легко переносить свои приложения между хостами, облаками и собственными серверами. Никакого vendor–lock. Только ради этого стоит использовать Docker! (если вы сохраняли данные на примонтированную файловую систему, не забудьте перенести и их).

Устанавливаем nginx в Docker

Давайте для примера установим nginx в Docker и настроим его автозапуск. Конечно можно просто скачать образ с nginx для Docker, но мы посмотрим, как это делается с самого начала.

Создайте чистый контейнер с Ubuntu 14.04 с открытыми 80 и 443 портами:

Добавьте в /etc/apt/sources.list официальный репозиторий стабильной версии nginx:


Можно проверить, что nginx запускается, выполнив:


Мы увидим страницу приветствия, зайдя на ip сервера на порт 80:

Здесь мы впервые встретились с Docker Hub. Время создать аккаунт в этом сервисе и залогиниться с помощью команды docker login.

Отправим наш образ trukhinyuri/nginx на docker hub для повторного использования на других серверах в будущем. (здесь trukhinyuri – имя репозитория автора):

Для того, чтобы nginx стартовал при запуске хоста, добавим скрипт инициализации upstart по адресу /etc/init/nginx.conf:

Заключение

В этой статье вы смогли попробовать Docker и оценить, как просто упаковывать приложение и мигрировать между различными хостами. Это только вершина айсберга, очень многое осталось за кадром и будет рассмотрено в будущем. Для дополнительного чтения рекомендуем книгу The Docker Book.

Попробовать образ с Docker в на облачных VPS от Infobox в Амстердаме можно, получив пробную версию бесплатно (кнопка «Тестировать 10 дней»).

UPD: Доступ в пробную версию облачных VPS временно ограничен. Заказ по-прежнему доступен. Мы тестируем новую технологию, позволяющую сделать сервис еще быстрее. Следите за новостями.

Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней.
В случае, если вы не можете оставлять комментарии на Хабре — напишите комментарий к статье в Сообществе InfoboxCloud.

У меня есть Dockerfile для установки сервера MySQL в контейнере, который я затем запускаю так:

Но служба MySQL не запускается автоматически, я должен запускаться вручную (из контейнера):

Как автоматически запустить службу MySQL при запуске контейнера Docker?

нет, для одной простой услуги супервизор не нужен, он усложняет стартовый пользователь Возможно, вы захотите скопировать файл Docker здесь вместо ссылки на файл, который больше не существует Докерская статья о supervisord теперь здесь: docs.docker.com/config/containers/multi-service_container Я использовал команду && tail, чтобы заставить мой сервис работать - но мне нужно было добавить "--cap-add SYS_PTRACE" в докер Команда выполнения.

Во- первых, есть проблема в вашем Dockerfile :

Образы Docker не сохраняют запущенные процессы. Следовательно, ваша RUN команда выполняется только во время docker build фазы и останавливается после завершения сборки. Вместо этого вам нужно указать команду при запуске контейнера с помощью команд CMD или, ENTRYPOINT как показано ниже:

Во-вторых, контейнеру Docker необходим процесс (последняя команда) для продолжения работы, иначе контейнер выйдет / остановится. Следовательно, обычную service mysql start команду нельзя использовать непосредственно в Dockerfile.

Решение

Существует три типичных способа поддержания процесса в рабочем состоянии:

Использование service команды и добавить не конец команды после этого, как tail -F

Это часто предпочтительнее, когда у вас запущена одна служба, поскольку она делает выводимый журнал доступным для докера.

Или используйте команду переднего плана, чтобы сделать это

Это работает, только если есть сценарий, как mysqld_safe .

Или оберните ваши сценарии start.sh и положите в конец

Это лучше всего, если команда должна выполнить серию шагов, опять же, /start.sh должна продолжаться.

Заметка

Для начинающих использовать supervisord не рекомендуется. Честно говоря, это излишне. Гораздо лучше использовать одну команду service / single для контейнера.

and everything is fine. Is there a built-in way to run a container in a way that it will be restarted automatically, if the system crashes and reboots?

If so, is this also available in Docker Compose?

120k 82 82 gold badges 273 273 silver badges 387 387 bronze badges

12 Answers 12

Yes, docker has restart policies such as docker run --restart=always that will handle this. This is also available in the compose.yml config file as restart: always .


135k 29 29 gold badges 267 267 silver badges 268 268 bronze badges Your error is unrelated. You may want to post a separate question but it looks like you are confusing docker image names and docker container names. The docker run command expects the name of an image which you can list via docker images . The only problem with this is that "always" will also infinitely restart the container when it was stopped due to an error (see docs). There should be a policy which only starts on daemon-start

If you want the container to be started even if no user has performed a login (like the VirtualBox VM that I only start and don't want to login each time). Here are the steps I performed to for Ubuntu 16.04 LTS. As an example, I installed a oracle db container:

and add the following content:

and enable the service at startup

2,886 3 3 gold badges 24 24 silver badges 32 32 bronze badges

For the created containers use docker update to update restart policy.

0576df221c0b is the container id.


1,500 1 1 gold badge 9 9 silver badges 8 8 bronze badges @Marc: no. See the documentation: 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.

You can use docker update --restart=on-failure <container ID or name> .

On top of what the name suggests, on-failure will not only restart the container on failure, but also at system boot.

Per the documentation, there are multiple restart options:


14.4k 15 15 gold badges 72 72 silver badges 88 88 bronze badges This helped me, too, confirmed with sudo systemctl restart docker . Well spotted!

1) First of all, you must enable docker service on boot

2) Then if you have docker-compose .yml file add restart: always or if you have docker container add restart=always like this:

docker run --restart=always and run docker container

If you manually stop a container, its restart policy is ignored until the Docker daemon restarts or the container is manually restarted.

see this restart policy on Docker official page

3) If you want start docker-compose, all of the services run when you reboot your system So you run below command only once

More "gentle" mode from the documentation:


1,900 1 1 gold badge 11 11 silver badges 13 13 bronze badges

This is what crontab is for:

Access your user crontab by crontab -e or show it with crontab -l or edit your system crontab at /etc/crontab


What is cron service start before docker service. this would fail in this case.

To start a container and set it to restart automatically on system reboot use

Where ecstatic_ritchie is an example name specifying the container in interest. Use docker ps -a to list all container names.

To make particular running containers start automatically on system reboot

To make all running containers start automatically on system reboot

See more on Docker homepage

882 1 1 gold badge 12 12 silver badges 34 34 bronze badges

I wanted to achieve on-boot container startup on Windows.

Therefore, I just created a scheduled Task which launches on system boot. That task simply starts "Docker for Windows.exe" (or whatever is the name of your docker executable).

Then, all containers with a restart policy of "always" will start up.

You can run a container that restart always by:

If you want to change a running container's configs, you should update it by:

And if you want to see current policy of the container, run the following command before above at the first place:

After all, Not to forget to make installed docker daemon enable at system boot by:

To see a full list of restart policies, see: Restart Policies


I have a similar issue running Linux systems. After the system was booted, a container with a restart policy of "unless-stopped" would not restart automatically unless I typed a command that used docker in some way such as "docker ps". I was surprised as I expected that command to just report some status information. Next I tried the command "systemctl status docker". On a system where no docker commands had been run, this command reported the following:

On a system where "docker ps" had been run with no other Docker commands, I got the following:

Читайте также: