Как работает перезапуск контейнера docker? - PullRequest
1 голос
/ 19 июня 2020

Когда в контейнере docker запущено, например, 100 процессов, и мы перезапускаем контейнер, используя docker restart container-name, как docker может перезапустить все эти 100 процессов?

Будет ли он хранить данные обо всех процессах и запустить их снова?

Изменить:

Следующее можно рассматривать как конкретный c вопрос, на который я хочу получить ответ:

После запуская контейнер, я вхожу в него, используя docker exec -it container-name bash, и запускаю фоновые процессы. Затем я выхожу из контейнера и делаю docker restart или stop, за которым следует start. Смогу ли я снова запустить автоматически запущенные вручную процессы?

Ответы [ 3 ]

4 голосов
/ 19 июня 2020

Контейнер Docker имеет один основной процесс. docker restart выполняет две функции:

  1. Он выполняет эквивалент docker stop. Он отправляет SIGTERM своему основному процессу (только); если это не завершится в течение 10 секунд, он отправит SIGKILL. Если у первичного процесса все еще есть дочерние элементы, , они также принудительно завершаются .
  2. Это эквивалент docker start. В уже существующем контейнере он запускает команду контейнера, созданную путем объединения его точек входа и списков команд.

Обратите внимание, что оба они сосредоточены на одном процессе. Если этот процесс является выделенным менеджером процессов, таким как супервизор, последовательность docker stop, надеюсь, заставит супервизор корректно останавливать каждый процесс, которым он управляет, и все будет в порядке. Если это сценарий оболочки, который запускает кучу фоновых процессов и игнорирует их, они просто погибнут без предупреждения. Точно так же, если основной процесс-контейнер знает, как запускать своих потомков, то docker start вызовет это снова, но если это была интерактивная оболочка и вы вручную запустили фоновые процессы, они будут потеряны.

Docker не имеет механизма «моментальных снимков». Общая модель состоит в том, что контейнеры всегда начинаются с чистого и известного состояния и могут восстанавливать все, что им нужно, оттуда. Эта модель лучше подходит для docker rm остановленного контейнера и docker run нового, чем пытаться docker start его снова.

2 голосов
/ 19 июня 2020

Прежде всего, наличие 100 процессов, запущенных в контейнере, звучит не очень хорошо, в соответствии с рекомендациями в лучших методах работы с Dockerfile . Просто нужно иметь в виду; Если это сработает для вас, тогда ничего.

Если эти 100 процессов станут частью процесса запуска контейнера, то после перезапуска они будут запущены снова. Это полностью зависит от того, что должен делать ваш контейнер и как, т.е. что делает ваш ENTRYPOINT.

restart - это stop, а затем start. Так что я предполагаю, что с вашим компьютером можно провести очень слабую параллель. После перезапуска он запустит те программы запуска, которые у вас есть, например управление сетью, что угодно. Но он не перезапустит ваш браузер, если вы явно не подключите для этого свою ОС.

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

0 голосов
/ 19 июня 2020

Docker хранит весь контекст, переменные и c во внутреннем формате. Чтобы узнать, что Docker знает о вашем контейнере, вы можете запустить docker inspect и узнать о внутреннем устройстве контейнера.

Попробуйте запустить : docker inspect --format='{{.GraphDriver.Data.LowerDir}}' Container_Id

Это даст вам путь, где хранятся данные вашего контейнера. Но вам понадобится root доступ, чтобы открыть эту папку.

С точки зрения непрофессионала Docker перезапуск: Docker стоп, за которым следует Docker начало.

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