deшка
Урок 5.4

Команды Docker: от запуска до удаления

Запускаем программу, читаем журнал и управляем состоянием контейнера.

Один контейнер выполняет минутный расчёт, другой часами ждёт подключения к базе. Чтобы управлять обоими, нужно различать создание, работу, остановку и удаление. Команда run создаёт новый экземпляр; start возвращает к работе уже созданный.

Жизненный цикл: run создаёт, stop останавливает, start запускает прежний экземпляр, rm удаляет.

Разбираем запуск

docker run -d --name demo-clock alpine:3.21 sleep 3600

До имени образа стоят параметры Docker: -d возвращает приглашение терминала, --name даёт экземпляру имя. После alpine:3.21 записана программа контейнера: sleep с аргументом 3600. Она ждёт час, поэтому контейнер продолжает работать.

docker ps
docker inspect demo-clock
docker exec demo-clock sh -c 'printf saved > /tmp/note.txt'
docker exec demo-clock cat /tmp/note.txt

ps показывает работающие контейнеры. inspect выдаёт подробное состояние и настройки. exec запускает дополнительную команду внутри работающего экземпляра. Два последних вызова записали и прочитали saved; главный sleep продолжает ждать.

Остановка и повторный запуск

docker stop demo-clock
docker ps
docker ps -a
docker start demo-clock
docker exec demo-clock cat /tmp/note.txt

После stop контейнер пропадёт из обычного ps, но останется в ps -a со статусом Exited. После start снова запустится прежняя команда, а cat напечатает saved: остановка сохранила записываемый слой экземпляра.

Если в этот момент выполнить ещё один run --name demo-clock, Docker сообщит о занятом имени. Имена уникальны среди всех контейнеров Engine, включая остановленные. Для второго независимого экземпляра выбирают другое имя.

Короткая программа и её журнал

docker run --name demo-message alpine:3.21 echo finished
docker logs demo-message
docker inspect -f '{{.State.ExitCode}}' demo-message

Программа напечатает finished и завершится с кодом 0. logs покажет её стандартный вывод; inspect подтвердит код завершения. У контейнера, который только выполняет sleep, журнал обычно пуст: программа ничего не печатает.

Если результат нужен только в терминале и контейнер сохранять не требуется, добавьте --rm: docker run --rm alpine:3.21 echo finished. После завершения объект удалится. Образ останется и будет использоваться следующими запусками.

Удаляем конкретный экземпляр

docker stop demo-clock
docker rm demo-clock demo-message
docker images

rm удалит оба контейнера вместе с их записываемыми слоями. Образ alpine:3.21 останется в списке. Для удаления образа есть отдельная команда rmi. Так можно завершить опыт, не затрагивая соседние службы и их данные.

Попробуйте в учебном терминале

В окружении уже есть три контейнера: stop-me работает, resume-me остановлен после запуска длительной команды, obsolete завершил короткую работу. Измените состояние каждого по условию задания. Команда docker ps -a поможет сверить исходное состояние.

Здесь команды Docker имитируются: терминал хранит учебное состояние образов, контейнеров и файлов. Реальные службы и внешнюю сеть он не запускает.

учебный терминалзадания 0 / 3
Введите команду. Подсказка: help покажет, что умеет этот терминал.
de@deshka:~$
ЗАДАНИЯ
  1. 1. Остановите stop-me, сохранив объект контейнера.
  2. 2. Запустите существующий resume-me и сохраните его /tmp/state.txt со строкой kept.
  3. 3. Удалите только завершённый obsolete, оставив образ alpine:3.21.
решённые задания сохранятся в прогресс после входа
Войти, чтобы отмечатьдальше →
5.5 →Данные и сеть: тома, каталоги и порты