Docker перезапустить контейнер при ошибке

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

daveskylark's user avatar

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 Idan's user avatar

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

Daniel's user avatar

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's user avatar

rafaelc

57.4k15 gold badges55 silver badges81 bronze badges

asked May 4, 2015 at 22:17

user824624's user avatar

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's user avatar

Kyle Morgan

6601 gold badge11 silver badges21 bronze badges

answered May 5, 2015 at 0:09

Andy's user avatar

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

Fabien Balageas's user avatar

1


1

2

Добрый день,
Разбираюсь с докером. Есть задача — если сервис в контейнере (бинарник со строкой запуска) «упал», то перезапустить контейнер. Каким образом выполняется, и выполняется ли такая проверка, это возможно настроить автоматически или по набору критериев?
Спасибо.

  • Ссылка
перезапуск контейнеров docker

Если вы уже освоились в 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

Только замените имя пользователя и путь на ваши. На этом у меня все. Удачи!

  • Docker ошибка при установке
  • Docker ошибка при запуске windows
  • Docker ошибка hyper v
  • Docker pull mysql ошибка
  • Docash golf ошибка е02