Как понять состояние контейнера - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь понять жизненный цикл контейнера. Загруженное альпийское изображение, построенные контейнеры с помощью команды «docker container run», все эти контейнеры были запущены и находились в состоянии «Exited». При использовании команды «запуск контейнера docker» некоторые из контейнеров остаются в рабочем состоянии (запущены), а некоторые или сразу же закрыты. Любые мысли о том, почему разница в таком поведении вокруг статусов? Одно из различий, которое я заметил, заключается в том, что контейнеры, находящиеся в рабочем состоянии, модифицируются относительно структуры файла из базового образа.

Надеюсь, я смог поставить сценарий в правильном контексте. Помогите мне понять концепцию.

1 Ответ

1 голос
/ 12 апреля 2019

Длинная последовательность выглядит следующим образом:

  1. Вы docker create контейнер с различными настройками.Некоторые настройки могут быть унаследованы от базового изображения.Он находится в «созданном» состоянии;его файловая система существует, но ничего не запущено.
  2. Вы docker start контейнер.Если у контейнера есть точка входа (директива Dockerfile ENTRYPOINT, опция docker create --entrypoint), то эта точка входа запускается, принимая команду в качестве аргументов;в противном случае команда (директива Dockerfile CMD, любые параметры после docker create name image) запускается напрямую.Этот процесс получает идентификатор процесса 1 в контейнере и права и обязанности, которые сопровождают это.Контейнер находится в состоянии «выполняется».
  3. Основной процесс завершается, или администратор явно docker stop s.Контейнер находится в состоянии «завершен».
  4. При желании вы можете перезапустить остановленный контейнер (хотя IME это необычно);перейдите к шагу 2.
  5. Вы docker rm остановленный контейнер.Все, что находится в файловой системе контейнера, навсегда потеряно и больше не отображается в docker ps -a или где-либо еще.

Обычно вы используете docker run для объединения этих шаговвсе вместе.docker run самостоятельно делает первые два шага вместе (создает контейнер и затем запускает его).Если вы docker run --rm, он делает все перечисленное выше.

(Все эти команды идентичны командам docker container ..., но я привык к несколько более короткой форме.)

Ключевым моментом здесь является то, что существует некоторый основной процесс, который запускает контейнер.Обычно это какой-то демон или серверный процесс, который обычно указывается в Dockerfile образа.Если вы, например, docker run ... nginx, то его Dockerfile заканчивается на

CMD ["nginx", "-g", "daemon off;"]

, и это становится основным контейнерным процессом.

В раннем исследовании это довольно частопросто запустить некоторый базовый дистрибутивный образ (docker run --rm -it alpine), но это не очень интересно: конец последовательности жизненных циклов - удаление контейнера, и как только вы это сделаете, все в контейнере будет потеряно.При стандартном использовании вы захотите использовать Dockerfile для создания собственного изображения, и есть довольно хорошее руководство по Docker на эту тему.

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