Материал открыт для чтения

Войдите, чтобы сохранять прогресс и результаты.

Войти
Экспресс-погружение в DevOps

Контейнеры: запуск и управление

чтение ~7 минУрок 15 из 19

Жизненный цикл контейнера

crs express devops Image10
ОБРАЗ  ────────── docker run ──────────►  РАБОТАЕТ (Up)

                                           │       ▲
                               docker stop │       │ docker start
                                           │       │
                                           ▼       │

                                      ОСТАНОВЛЕН (Exited)

                                           │
                                 docker rm │
                                           │
                                           ▼

                                          УДАЛЁН

На схеме слева показан образ, из которого команда docker run создаёт новый контейнер. После запуска контейнер находится в состоянии Up, то есть работает. Команда docker stop останавливает его и переводит в состояние Exited, но сам контейнер и его настройки сохраняются. Из этого состояния его можно снова запустить командой docker start или окончательно удалить командой docker rm.

Контейнер также перейдёт в состояние Exited, если его главный процесс завершится сам. Работающий контейнер можно удалить напрямую через docker rm -f, но это принудительный вариант: обычно его сначала корректно останавливают.


docker run — запустить контейнер

docker run = docker create + docker start.

Команда строится в таком порядке:

docker run [параметры Docker] ОБРАЗ [команда внутри контейнера]

Сначала идут параметры самого Docker, затем имя образа, а после него можно указать программу, которую нужно выполнить внутри контейнера.

docker run nginx

Это создаст контейнер из образа nginx и запустит программу, заранее указанную внутри образа. Nginx продолжает работать и выводит сообщения в текущий терминал. Пока эта команда занимает терминал, другой командой в нём воспользоваться нельзя.

Чтобы запустить контейнер в фоне и сразу вернуть управление терминалом, используют флаг -d:

docker run -d nginx

-d означает detached mode, то есть фоновый режим. Этот флаг не заставляет программу работать бесконечно. Он только отделяет её вывод от текущего терминала.

Почему контейнер может сразу остановиться

Контейнер - это не маленькая виртуальная машина, которая обязана постоянно оставаться включённой. Внутри контейнера запускается главный процесс. Пока он работает, контейнер имеет статус Up. Когда этот процесс завершается, контейнер получает статус Exited.

Например, эта команда печатает строку и сразу завершается:

docker run --rm alpine echo "hello"

Процесс echo выполнил работу, поэтому контейнеру больше нечего делать. Флаг --rm дополнительно удаляет его после завершения.

Образ nginx ведёт себя иначе: его главная команда запускает веб-сервер, который постоянно ждёт новые HTTP-запросы. Поэтому контейнер nginx остаётся запущенным.

У образа python:3.12-alpine без дополнительной программы процесс может быстро завершиться. Если в учебной задаче нужен пустой работающий контейнер, ему можно передать простую долгоживущую команду:

docker run -d --name worker python:3.12-alpine tail -f /dev/null

Здесь tail -f /dev/null не выполняет полезную работу, а просто остаётся запущенным. Это учебный способ посмотреть жизненный цикл контейнера. В реальном контейнере главным процессом будет приложение, веб-сервер, обработчик очереди или другая программа, ради которой создавался контейнер.

Основные флаги

Флаг Описание
-d Запустить в фоне, вернуть ID
--name myapp Дать контейнеру имя
-p 8080:80 Пробросить порт хоста:контейнера
--rm Удалить контейнер после завершения
-e KEY=VALUE Переменная окружения

Имя контейнера и имя образа

Образ определяет, что находится внутри контейнера. Параметр --name задаёт удобное имя уже созданному контейнеру:

docker run -d --name backend nginx:alpine

В этом примере:

  • nginx:alpine - образ;
  • backend - имя контейнера;
  • -d - запуск в фоне.

Имя можно выбрать самостоятельно. Оно не обязано совпадать с образом. В выводе docker ps эти значения находятся в разных столбцах: IMAGE и NAMES.

Примеры

# nginx в фоне, порт 8080 → 80
docker run -d -p 8080:80 --name webserver nginx

# alpine и сразу удалить после выхода
docker run --rm alpine echo "hello"

Как открыть порт контейнера

У контейнера собственная сеть. Даже если nginx слушает порт 80 внутри контейнера, с виртуальной машины этот порт не будет доступен автоматически. Параметр -p публикует его:

docker run -d --name web -p 8080:80 nginx:alpine

Запись читается как ПОРТ_ВМ:ПОРТ_КОНТЕЙНЕРА. Теперь запрос к http://localhost:8080 на виртуальной машине попадёт на порт 80 nginx внутри контейнера.

В лабораторной используется -p 80:80, поэтому сайт можно открыть кнопкой Web Preview: порт 80 виртуальной машины связан с портом 80 контейнера.

Как передать контейнеру файл с виртуальной машины

По умолчанию контейнер видит только файлы из своего образа. Для учебной страницы nginx мы подключим уже подготовленный каталог с виртуальной машины:

docker run -d --name backend \
  -p 80:80 \
  -v /opt/devops/express-docker-site:/usr/share/nginx/html:ro \
  nginx:alpine

Параметр -v связывает два пути:

ПУТЬ_НА_ВМ:ПУТЬ_В_КОНТЕЙНЕРЕ:ro

Nginx читает сайт из /usr/share/nginx/html внутри контейнера, но настоящие файлы лежат в /opt/devops/express-docker-site на виртуальной машине. ro означает read only: контейнер может читать эти файлы, но не может изменять их.

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


docker ps — список контейнеров

docker ps                              # только запущенные
docker ps -a                           # все, включая остановленные
docker ps -q                           # только ID
docker ps --filter "name=webserver"    # фильтрация
docker ps --format "{{.Names}}"        # кастомный формат

В обычном выводе особенно полезны столбцы:

IMAGE          STATUS        PORTS                NAMES
nginx:alpine   Up 2 minutes  0.0.0.0:8080->80/tcp web
  • IMAGE показывает образ, из которого создан контейнер;
  • STATUS показывает, работает контейнер или уже завершился;
  • PORTS показывает опубликованные порты;
  • NAMES показывает имя контейнера.

docker ps выводит только работающие контейнеры. После остановки контейнер не исчезает, но увидеть его можно только через docker ps -a.


Остановка и удаление

docker stop webserver    # SIGTERM — ждёт graceful shutdown
docker kill webserver    # SIGKILL — убивает мгновенно

stop даёт приложению возможность корректно завершить работу — сохранить данные, закрыть соединения. kill — экстренный вариант.

docker start webserver          # запустить остановленный
docker restart webserver        # stop + start

docker rm webserver             # удалить остановленный
docker rm -f webserver          # удалить принудительно
docker container prune          # удалить все остановленные

docker rm удаляет контейнер, но не его образ. Для удаления ненужного образа используется другая команда:

docker rmi nginx:1.24

Если от образа ещё существует контейнер, Docker сначала попросит остановить и удалить этот контейнер.


Логи и информация

docker logs webserver              # все логи
docker logs -f webserver           # в реальном времени
docker logs --tail 20 webserver    # последние 20 строк

docker inspect webserver           # полные метаданные в JSON
docker stats                       # живой мониторинг
docker stats --no-stream           # snapshot

Полный цикл

# 1. Запустить
docker run -d -p 8080:80 --name web nginx

# 2. Проверить
curl http://localhost:8080

# 3. Посмотреть логи
docker logs web

# 4. Остановить
docker stop web

# 5. Удалить
docker rm web

Материал изучен?

Войдите, чтобы сохранить прогресс и перейти к практической лаборатории.

Войти и продолжить