Ссылка на видео: https://www.youtube.com/watch?v=ifvrfrimdaa
Узнайте, как работает контейнер, основанные на его состоянии жизненного цикла и команды Docker CLI для эффективного управления их
Вы когда-нибудь чувствовали себя пораженным множеством Докер
CLI-команды?
Вы когда-нибудь были запутаны о том, что на самом деле происходит с вашими контейнерами Docker?
Если у вас есть, не волнуйтесь … ты не одинок. 🤗
Как ведет себя контейнер, зависит от того, в каком состоянии он находится.
К счастью, как только вы поймете, как работает контейнер, основанные на своем состоянии жизненного цикла, вы будете более уверены в докере.
Также будет намного проще перейти на более продвинутые решения для управления контейнерами, такие как Docker Compose, Docker Rash, Kubernetes или OpenShift и т. Д.
Итак, давайте узнаем о жизненном цикле контейнера, раз и для всех!
Вступление
В этом блоге мы будем:
- узнать о различных состояниях контейнер может быть в
- Узнайте, как управлять им, используя
Докер
выступ - четкие смущения относительно различий между
Дочсерская пауза
иДокер Стоп
Докер Стоп
идокер убить
- конец с подробным представлением жизненного цикла контейнера
Мы также кратко обсудим сигналы POSIX.
Если вы еще не читали первые два блога на серии «Docker Make Easy», я настоятельно рекомендую вам сделать это.
Если вы не можете получить доступ к среде, попробуйте эти:
Хорошо, давайте начнем с поиска …
Контейнер жизненный цикл
Следующая диаграмма показывает состояния упрощенного жизненного цикла контейнера, который определяет, как ведет себя контейнер.
Упрощенная диаграмма состояния жизненного цикла контейнера
Текст на стрелках соответствует Докер
Команды, которые позволяют этому переходу.
Как показано выше, контейнер может быть в следующих состояниях:
- Созданный
- Бег
- Пауз
- Остановился
- Удаленный
Перед тем, как мы погрузимся в каждое состояние, нам нужно знать крошечный бит о сигналах POSIX.
Быстрый обзор сигналов POSIX
Проще говоря, сигнализируют как стандартный способ, которым операционная система (ОС) говорит о ребенке, как вести себя.
Есть несколько сигналов, каждый из которых имеет разные цели. Но для нас мы просто сосредоточимся на следующих 2:
SIGTERM
: Этот сигнал отправляется в процесс для запроса его прекращения. Это может быть поймано и интерпретировано или игнорируется процессом. Это позволяет процессу выполнять изящное расторжение, выделяющее ресурсы и сохранение состояния, если это необходимо.SIGKILL
: Этот сигнал отправляется в процесс, чтобы заставить его немедленно прекратить. В отличие отSIGTERM
Этот сигнал не может быть пойман или игнорировать, и процесс получения не может выполнять какую-либо очистку после получения этого сигнала (исключая несколько исключений).
SIGTERM
обычно предпочитает над SIGKILL
Так как он дает шанс для изящного/безопасного прекращения процесса.
Если интересно, узнайте больше о сигналах здесь Отказ
Теперь давайте обсудим каждое состояние жизненного цикла контейнера один за другим …
Создано состояние
Это первое состояние жизненного цикла контейнера, который приходит после приобретения или создания изображения.
Прочитайте последний блог, чтобы узнать больше о том, как работает Docker Images.
Используя Docker Создать
Команда, тонкий нарисованный слой создается над указанным изображением и подготовлен для запуска главной команды процесса ( CMD
и/или enterPoint
).
ЗАМЕТКА: На этом состоянии контейнер создан, но не запускается.
Вот пример создания контейнера с использованием Nginx: Alpine
Изображение и название ИТ App1
Отказ
docker create --name app1 nginx:alpine
Идентификатор нового контейнера печатается, если успешно создан.
Запуск состояния
Как следует из названия, это состояние, в котором контейнер активно работает. Значение, основной процесс начал выполнение.
Для создаваемого контейнера (используя Docker Создать
) или остановился, он может быть запущен запуск докера
.
Итак, чтобы запустить App1, мы можем использовать —
docker start app1
Если вы не хотите явно Создать
а потом Начать
Контейнер, вы можете сделать оба шага сразу, используя Docker Run
Отказ
Например —
docker run -d --name app2 nginx:alpine
Команда выше создает и запускает контейнер с именем App2
на заднем плане (как указано -d
).
Пауза
Запуск контейнера может быть приостановлен, используя Дочсерская пауза
команда. Это имеет эффект приостановки (или замораживания) всех процессов в указанном контейнере.
При паузе состояния контейнера остается неповрежденным — как часть диска (файловой системы), так и в порция памяти (RAM).
ЗАМЕТКА: Контейнер, который приостановлен, не знает, что оно приостановлено.
Итак, если бы мы хотели приостановить App1, мы просто сделаем —
docker pause app1
Точно так же, чтобы вернуть паузу с паузой обратно на работу, мы использовали Упорядочить
—
docker unpause app1
Деталь внедрения (за пределами объема Scope): для реализации пауза
, морозильная камера Cgroup
используется вместо сигналов POSIX.
Остановил состояние
Контейнер, который останавливается, не имеет своих основных процессов активно работает (я знаю, Дух 🤷♀️).
При остановке, дисковая часть состояния сохраняется I.e. Сохранена.
Но в отличие от приостановки, часть памяти состояния очищена, когда контейнер остановлен. Это главное отличие между приостановленными и остановленными состояниями.
Контейнер может быть остановлен в 4 основных способах:
- Используя
Докер Стоп
команда - Используя
Докер убить
команда - Когда основной процесс контейнера вышла/завершено
- Когда встречается «из исключения памяти» (OOE)
Давайте обсудим каждый индивидуально —
1. С помощью Докер Стоп команда
Эта команда так же просто, как —
docker stop app1
При выполнении основной процесс контейнера получает SIGTERM
Сигнал (по умолчанию) и после льготного периода (по умолчанию 10S на запись), он получает SIGKILL
сигнал.
2. С помощью докер убить команда
Когда вы запустите —
docker kill app2
SIGKILL
Сигнал напрямую отправляется в основной процесс контейнера (поведение по умолчанию).
Это означает разницу между Докер Стоп а также докер убить в том, что — останавливаться может разрешить безопасное прекращение (в пределах льгота) в то время как убийство прекращается немедленно.
По этой причине Стоп
является предпочтительным над Убить
Отказ Обзор «Быстрый обзор сигналов POSIX» выше, если вы смущены.
Важно отметить, что Докер убить
Также можно использовать для выдачи любого сигнала в процесс контейнера, используя - сигнал
/ -s
Аргумент, а не только SIGKILL
Отказ
Вот пример выдачи Сигинт
сигнал —
docker kill -s SIGINT app1
3. Когда основной процесс вышла/завершено
Контейнер может автоматически остановиться, если его основной процесс вышла/завершено.
Это может произойти, если
- Основной процесс работает в исключением/прерывании
- или если задача завершается через определенный момент времени (вместо того, чтобы запустить в бесконечной петле, как сервер)
Вот очень простой пример —
docker run alpine echo "hi"
Эта команда запускает эхо "привет"
Команда внутри альпийского контейнера, печатает «Привет» к консоли и выходит сразу после эхо
Команда сделана.
4. Когда встречается «из исключения памяти» (OOE)
Если ваши контейнеры пытаются использовать больше памяти, чем доступна система, вы можете испытывать из исключения памяти (OOE). В результате некоторые контейнеры или даже демон докера могут быть убиты ядром OOM Killer.
Следовательно, вы должны убедиться, что ваше приложение работает на хостах с адекватной памятью в производстве.
Самый простой способ управления памятью является ограничение максимальной суммы памяти, который может использовать контейнер с использованием -М
вариант —
docker run -m 50m redis:alpine
Это запускает контейнер от Redis: Alpine
Изображение с пределом памяти 50 МБ.
Чтобы узнать больше о управлении памятью и смягчающими рисками, связанными с OOME, обратитесь к Официальная документация Отказ
Удаленное состояние
Контейнер, который находится в созданном состоянии или остановлен, можно удалить с помощью Docker RM
. Это приведет к удалению всех данных, связанных с контейнером, такими как процессы, файловая система, объемные и сетевые сопоставления и т. Д.
Если app1 останавливается, например, вы можете удалить его —
docker rm app1
Однако, если контейнер работает или приостановлен, и вы пытаетесь удалить его с помощью Docker RM
, вы получите ответ ошибки от демона, говоря, что контейнер должен быть остановлен.
Если вы уверены, что ваш беговый контейнер не имеет никаких связанных данных, которые нуждается в надлежащей очистке, вы можете выполнить удаление силы, используя -f
—
docker rm -f app1
Но рекомендуется не делать этого, особенно если целостность данных контейнера важна — как случай для баз данных.
Расширенный контейнер жизненный цикл
Вот подробная схема жизненного цикла контейнера, которую мы просто обсуждали, включая события в прямоугольниках, вежливость Докер Сайгон Отказ
Это должно быть проще понять, если вы прочитаете предшествующую дискуссию.
Или вы думаете, что я должен был начать с этого вместо упрощенного? Интересно услышать, что вы думаете.
Заключение
Сегодня мы узнали о различных состояниях, который может быть контейнер — контейнер жизненного цикла, а также как использовать Докер
CLI для маневрирования через эти государства.
Как только мы узнаем основы контейнеров, мы можем сделать действительно мощные вещи с более продвинутыми инструментами, такими как Docker Compose, Docker Swarm, Kubernetes или OpenShift и т. Д.
Контейнеры потрясающие, и мы просто начинаем!
В следующем блоге Docker мы обсудим, как работает объемы на Docker.
До этого будьте смелыми и продолжайте учиться.
Но самое главное…
Технология ухода! 👋
Оригинал: «https://dev.to/alubhorta/the-docker-container-lifecycle-docker-made-easy-3-554o»