- How do I autostart docker container at system reboot?
- 4 Answers 4
- Start containers automatically
- Use a restart policy
- Restart policy details
- Use a process manager
- Using a process manager inside containers
- Автозапуск всех контейнеров в docker
- 2 ответа 2
- 🐳 Автоматический запуск Docker контейнера
- Как установить политику перезапуска
- Включение службы Docker
- Избегайте служб Systemd
How do I autostart docker container at system reboot?
As I hosted a WordPress site in docker containers and i want these containers to be started at boot time always, so need to done it manually.
4 Answers 4
It is a very common use case to add the restart policy on an existing container.
This could be done with the following command: docker update —restart container_name
This solved my problem perfectly! I had a container with my database, and wanted it to start when my Mac started. By specifying that its image was always restarted (unless stopped), this did the trick!
They don’t mention update anywhere on that page, great trick! I went w/ systemd files, because I thought the only way was to delete and re- run with restart flag~!
A downside to using systemd is that if I use docker stop then systemd restarts it~! You have to use systemd stop to stop the container~!
Till now I don’t think there is a way to do that normally. A tricky solution is to use restart policy
sudo docker run --restart=always -d your_image
This means whenever you shut down this will exit your container so as you start your host then this lead to restart the docker.
As ubuntu 15 now supports systemd, sample for this manager:
[Unit] Description=Some service Requires=docker.service After=docker.service [Service] Restart=always ExecStart=/usr/bin/docker start -a container_name ExecStop=/usr/bin/docker stop -t 2 container_name [Install] WantedBy=multi-user.target
A downside to using systemd is that if I use docker stop then systemd restarts it~! You have to use systemd stop to stop the container~!
@FreeSoftwareServers well, if you put something to be managed by something, then you should not manage it manually and let it be managed by that tool. Alternatively, you can edit the service file to instruct systemd to start the service only at booting sequence, i showed here the generic approach — details can be tuned further by any your needs.
You might as well use supervisor if going this route. You want all control in Docker and not anywhere else, that’s why you’d have used Docker in the first place.
What I did is to use Upstart files.
You can find some examples and other solutions in the Docker website.
Create a file such like that in /etc/init :
Description "My container" start on filesystem and started docker stop on runlevel [!2345] respawn script /usr/bin/docker start -a mycontainer end script pre-stop script /usr/bin/docker stop mycontainer end script
Note, as from Docker 1.2, there are restart policies which may also help to automatically restart containers when the docker service is run (after boot for example).
Personnaly, I use puppet to provision my workstation and use this Docker module to automatically create the startup scripts which are more complete (start, stop, restart, clean options. )
Start containers automatically
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[:max-retries] | Restart the container if it exits due to an error, which manifests as a non-zero exit code. Optionally, limit the number of times the Docker daemon attempts to restart the container using the :max-retries option. |
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.
$ docker run -d --restart unless-stopped redis
This command changes the restart policy for an already running container named redis .
$ docker update --restart unless-stopped redis
And this command will ensure all currently running containers will be restarted unless stopped.
$ docker update --restart unless-stopped $(docker ps -q)
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
Имеется докер с несколькими контейнерами. После ребута (или отключение электричества) хоста докер не стартует контейнеры.
2 ответа 2
Согласно официальной документации, контейнеру можно при создании задать политику перезапуска параметром —restart , и демон Docker будет при определённых условиях перезапускать контейнеры сам.
- no не перезапускает, по умолчанию
- on-failure и on-failure:N перезапускает контейнер, если его процесс завершается с ошибкой (код возврата не 0), максимум N раз (или постоянно)
- unless-stopped запускает контейнер при старте демона Docker, если контейнер был активен (не был stop нут ранее)
- always перезапускает всегда, был ли он ранее остановлен или упал
Но это не особо поможет, если контейнер должен быть запущен только когда некая служба будет запущена на хост-системе. В этом случае за порядком должен следить процесс, который об этой службе знает.
Согласно официальной документации — это не баг, а фича. Запустить руками можно коммандой docker start -a . Если надо, чтобы оно само — создать правило в системе инициализации хостовой ОС.
description "Redis container" author "Me" start on filesystem and started docker stop on runlevel [!2345] respawn script /usr/bin/docker start -a redis_server end script
[Unit] Description=Redis container Requires=docker.service After=docker.service [Service] Restart=always ExecStart=/usr/bin/docker start -a redis_server ExecStop=/usr/bin/docker stop -t 2 redis_server [Install] WantedBy=local.target
Ну или можно docker start -a прописать в /etc/rc.local — но это за гранью добра и зла.
🐳 Автоматический запуск Docker контейнера
Политика перезапуска Docker – это лучший способ автоматического запуска контейнеров при загрузке сервера или компьютера.
На этом следует закончить эту статью, но я приведу более подробную информацию, примеры и причины, по которым вам следует избегать других методов.
Политика перезапуска в Docker – это флаг, который вы устанавливаете при первом создании контейнера из образа.
Политика перезапуска определяет, должен ли контейнер перезапускаться при выходе из него.
Поведение определяется тем, какую политику вы выберете.
Контейнер может автоматически запускаться снова при ошибочных выходах или при всех кодах выхода.
Флаг также влияет на то, что произойдет, если вы вручную остановите контейнер.
Как установить политику перезапуска
Вы можете установить политику перезапуска Docker при создании контейнера или обновить существующий контейнер с новой политикой перезапуска.
Флаг политики перезапуска – –restart и имеет четыре различные опции.
Более подробную информацию можно найти на официальной странице Docker Restart Policy.
ОПЦИЯ | ДЕТАЛИ |
---|---|
no | Не перезапускать контейнер автоматически. (по умолчанию) |
on-failure | Перезапускать контейнер, если он завершает работу из-за ошибки, которая проявляется в виде ненулевого кода выхода. |
always | Всегда перезапускать контейнер, если он остановлен. Если он остановлен вручную, он перезапускается только при перезапуске демона Docker или перезапуске самого контейнера вручную. |
unless-stopped | Аналогично always, за исключением того, что когда контейнер остановлен (вручную или иным образом), он не перезапускается даже после перезапуска демона Docker. |
Следующая команда создаст контейнер, который будет всегда перезапускаться.
Большинство моих контейнеров используют “always” или “unless-stopped”.
# docker run -d --restart always
Чтобы обновить политику перезапуска существующего контейнера, используйте команду docker update с нужной политикой.
Команда update может изменять несколько контейнеров одновременно.
# docker update --restart unless-stopped [ . ]
Включение службы Docker
После запуска контейнеров с помощью политики перезапуска необходимо включить службу Docker.
Если демон Docker не запустится автоматически, ни один из ваших контейнеров не запустится.
В зависимости от вашей системы, процесс включения демона Docker будет отличаться.
Включите службу в systemd с помощью команды systemctl.
Для других систем init вам придется искать, как включить службы.
Скорее всего, вам придется выполнить одну команду или создать символическую ссылку.
Вы можете убедиться, что служба была включена, проверив статус включения с помощью systemctl.
# systemctl is-enabled docker
Вы можете получить более подробную информацию о состоянии службы docker, выполнив следующую команду systemctl.
Вывод будет включать лог, который поможет решить любые возникающие проблемы.
Избегайте служб Systemd
Во многих статьях в Интернете описывается создание файла службы systemd для запуска контейнеров Docker.
Я рекомендую избегать этого, если у вас нет веских причин.
Встроенная политика перезапуска Docker лучше контролирует, когда контейнер должен перезапуститься.
Политика перезапуска также снижает сложность несколькими различными способами.
Во-первых, она не требует создания уникального служебного файла для каждого контейнера.
Во-вторых, все ваши службы Docker будут находиться внутри демона docker, а не разбросаны по всей системе.
Я уже писал служебные файлы для контейнеров, когда мне требовались предварительные и последующие задачи до и после создания и уничтожения контейнера.
В идеале ваш контейнер не должен нуждаться в каких-либо внешних задачах.
В реальном мире бывают случаи, когда вам нужно заставить что-то работать, пока вы не придумаете правильное решение.