I want to restart a container if it crashes automatically. I am not sure how to go about doing this. I have a script docker-compose-deps.yml that has elasticsearch, redis, nats, and mongo. I run this in the terminal to set this up: docker-compose -f docker-compose-deps.yml up -d
. After this I set up my containers by running: docker-compose up -d
. Is there a way to make these containers restart if they crash? I noticed that docker has a built in restart, but I don’t know how to implement this.
After some feedback I added restart: always
to my docker-compose
file and my docker-compose-deps.yml
file. Does this look correct? Or is this how you would implement the restart always?
docker-compose sample
myproject-server:
build: "../myproject-server"
dockerfile: Dockerfile-dev
restart: always
ports:
- 5880:5880
- 6971:6971
volumes:
- "../myproject-server/src:/src"
working_dir: "/src"
external_links:
- nats
- mongo
- elasticsearch
- redis
myproject-associate:
build: "../myproject-associate"
dockerfile: Dockerfile-dev
restart: always
ports:
- 5870:5870
volumes:
- "../myproject-associate/src:/src"
working_dir: "/src"
external_links:
- nats
- mongo
- elasticsearch
- redis
docker-compose-deps.yml sample
nats:
image: nats
container_name: nats
restart: always
ports:
- 4222:4222
mongo:
image: mongo
container_name: mongo
restart: always
volumes:
- "./data:/data"
ports:
- 27017:27017
asked Oct 18, 2016 at 13:10
daveskylarkdaveskylark
2,7144 gold badges15 silver badges30 bronze badges
2
If you’re using compose, it has a restart flag which is analogous to the one existing in the docker run command, so you can use that. Here is a link to the documentation about this part —
https://docs.docker.com/compose/compose-file/
When you deploy out, it depends where you deploy to. Most container clusters like kubernetes, mesos or ECS would have some configuration you can use to auto-restart your containers. If you don’t use any of these tools you are probably starting your containers manually and can then just use the restart flag just as you would locally.
answered Oct 18, 2016 at 13:21
Yaron IdanYaron Idan
6,1375 gold badges43 silver badges66 bronze badges
1
Looks good to me. What you want to understand when working on Docker policies is what each one means. always
policy means that if it crashes for any reason automatically restart.
So if it stops for any reason, go ahead and restart it.
So why would you ever want to use always
as opposed to say on-failure
?
In some cases, you might have a container that you always want to ensure is running such as a web server. If you are running a public web application chances are you want that server to be available 100% of the time.
So for web application I expect you want to use always
. On the other hand if you are running a worker process on a file and then naturally exit, that would be a good use case for the on-failure
policy, because the worker container might be finished processing the file and you probably want to let it close out and not have it restart.
Thats where I would expect to use the on-failure
policy. So not just knowing the syntax, but when to apply which policy and what each one means.
answered Dec 22, 2018 at 0:27
DanielDaniel
13.8k16 gold badges94 silver badges153 bronze badges
Настройка политики перезапуска Docker контейнеров
Для начала стоит добавить параметр --restart=always
к команде запуска Docker:
docker run --restart=always -d {{ name }}
Политика перезапуска Docker-контейнера устанавливается параметром --restart
– именно он указывает как поступать с контейнером, который завершил свою работу / упал с ошибкой / при старте системы. Возможные варианты:
- no – не перезапускать docker-контейнер;
- on-failure – рестартануть контейнер, в случае если entry point процесс завершился с ненулевым кодом;
- always – перезапускать всегда, вне зависимости от того, что случилось с docker-контейнером.
Также можно установить максимальное количество попыток перезапустить контейнер при использовании политики перезапуска on-failure. По умолчанию Docker будет постоянно пытаться перезапустить.
docker run --restart=always {{ name }}
А здесь Docker попытается только 10 раз:
docker run --restart=on-failure:10 {{ name }}
Если контейнер поднимется хотя бы и завершится с нулевым кодом возврата, то счётчик начнётся с начала. Работает это только с политикой on-failure.
I am currently running two virtual servers with offical ghost image and nginx-proxy
image, here is my build-up.
docker run -d -p 86:2368 --name home -e "VIRTUAL_HOST=hostname.com" ghost
docker run -d -p 85:2368 --name home-blog -e "VIRTUAL_HOST=blog.hostname.com" ghost
They are all working well, but after a while (sometimes hours or a day), one of the vitual server will break down, and I have to restart the container to make it work.
I wonder is there any solution to automatically monitor the docker container and restart it when it goes down?
rafaelc
57.4k15 gold badges55 silver badges81 bronze badges
asked May 4, 2015 at 22:17
user824624user824624
6,97726 gold badges102 silver badges181 bronze badges
You should use --restart
(docs):
docker run -d -p 86:2368 --restart always --name home -e "VIRTUAL_HOST=hostname.com" ghost
Kyle Morgan
6601 gold badge11 silver badges21 bronze badges
answered May 5, 2015 at 0:09
1
In fact, it is more likely your container’s main application crashed and not your container.
When the process with ID #0 stops or crashes in a container, then the container automatically stops.
About your concern, the restart option (from the docker run command) is one possibility, as stated by Andy.
Another possibility is to use supervisord as container’s main process. Your application will be launched and monitored by supervisord.
Supervisord will provide you with lots of options in order to handle your application crash. You have many useful options about logging, signal handling…
See https://docs.docker.com/articles/using_supervisord/ and http://supervisord.org/ for more details.
answered May 5, 2015 at 12:22
1
1
2
Добрый день,
Разбираюсь с докером. Есть задача — если сервис в контейнере (бинарник со строкой запуска) «упал», то перезапустить контейнер. Каким образом выполняется, и выполняется ли такая проверка, это возможно настроить автоматически или по набору критериев?
Спасибо.
- Ссылка
Если вы уже освоились в Docker и начали пользоваться различными существующими образами и создавать контейнеры для своих нужд, то наверняка заметили, что контейнеры не перезапускаются сами по себе после перезагрузки системы и пришли к такому же вопросу, которым не так давно задавался и я: “Как сделать так, чтобы контейнер работал постоянно?“. В этой статье мы рассмотрим автоматический перезапуск контейнеров средствами Docker, а также дополнительный способ контроля их работы с помощью простенького скрипта и планировщика Cron.
Перезапуск контейнеров средствами Docker
Docker предоставляет политики перезапуска контейнеров, но по умолчанию контейнеры не перезапускаются даже при перезагрузке системы (перезапуске демона Docker). Политику перезапуска можно указать с помощью флага --restart
и он может принимать одно из следующих значений:
no
– не перезапускать контейнер автоматически (значение по умолчанию)on-failure[:макс-попыток]
– перезапускать контейнер автоматически, если он завершается с кодом, отличным от нуля (то есть с ошибкой). По желанию, здесь можно также указать максимальное кол-во попыток перезапуска контейнера демоном, указывается через двоеточие.always
– всегда перезапускать контейнер. Однако контейнер, остановленный вручную (черезdocker stop
), будет перезапущен автоматически только после перезагрузки системы (перезапуска демона Docker)unless-stopped
– то же самое что иalways
, за исключением того, что контейнер, остановленный вручную, не будет перезапущен даже после перезапуска демона Docker.
Приведу несколько примеров запуска контейнера с использованием этого флага.
Предположим, что у вас уже есть загруженные образы, которые вы хотите использовать и вам известен ID или имя образа, для примера пусть это будет httpd
. О том, как загружать образы и запускать контейнеры, я рассказал в этой статье.
Первый запуск контейнера с помощью docker run:
docker run --restart on-failure:5 httpd
С помощью этой команды будет создан и запущен контейнер из образа httpd, который будет автоматически перезапускаться, если завершится с ошибкой. Попыток перезапуска будет 5.
docker run --restart unless-stopped httpd
С помощью этой команды будет создан и запущен контейнер из образа httpd, который будет перезапускаться автоматически, но не будет перезапускаться, если был остановлен вручную с помощью docker stop
. Как по мне – это наиболее подходящий вариант.
Обновление существующих контейнеров:
Если контейнер из образа у вас уже создан и допустим вы указали ему имя httpd, то вы можете добавить к нему политику перезапуска с помощью команды docker update
:
docker update --restart unless-stopped httpd
Иногда в интернете пишут, что --restart
перезапускает контейнеры только после перезагрузки системы. Но это не правда. В помощью этой политики контейнеры перезапускаются автоматически сразу после падения и конечно после перезагрузки системы тоже.
Контроль и перезапуск контейнера с помощью скрипта
Если у вас возникнут проблемы с использованием политик перезапуска контейнеров, которые предоставляет Docker или вы хотите сделать дополнительную проверку помимо этих политик, вы можете воспользоваться следующим способом:
Создайте скрипт, например httpd_check.sh
со следующим содержимым:
#!/bin/bash
if(( $(docker ps --filter name=httpd --filter status=running --filter status=restarting | wc -l) == 1))
then
docker start httpd
exit 0
fi
Этот скрипт будет искать контейнер httpd, который не находится в статусе running (up) или restarting и выполнять для него обычный запуск с помощью docker start
.
Добавляем права на запуск:
sudo chmod +x check.sh
Вам останется только добавить в cron примерно следующее:
* * * * * alex cd /home/alex && ./httpd_check.sh
Только замените имя пользователя и путь на ваши. На этом у меня все. Удачи!