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