Один контейнер выполняет минутный расчёт, другой часами ждёт подключения к базе. Чтобы управлять обоими, нужно различать создание, работу, остановку и удаление. Команда run создаёт новый экземпляр; start возвращает к работе уже созданный.
Разбираем запуск
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.txtps показывает работающие контейнеры. 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 imagesrm удалит оба контейнера вместе с их записываемыми слоями. Образ alpine:3.21 останется в списке. Для удаления образа есть отдельная команда rmi. Так можно завершить опыт, не затрагивая соседние службы и их данные.
Попробуйте в учебном терминале
В окружении уже есть три контейнера: stop-me работает, resume-me остановлен после запуска длительной команды, obsolete завершил короткую работу. Измените состояние каждого по условию задания. Команда docker ps -a поможет сверить исходное состояние.
Здесь команды Docker имитируются: терминал хранит учебное состояние образов, контейнеров и файлов. Реальные службы и внешнюю сеть он не запускает.
- 1. Остановите stop-me, сохранив объект контейнера.
- 2. Запустите существующий resume-me и сохраните его /tmp/state.txt со строкой kept.
- 3. Удалите только завершённый obsolete, оставив образ alpine:3.21.