Что получится
- Отличить образ от контейнера и процесса.
- Объяснить каждую часть команды запуска.
- Проверить состояние и логи без догадок.
- Связать базовую модель с тестовым контуром AQA.
Сначала из памяти
Не ищите определение. Одним-двумя предложениями ответьте: что происходит после docker run nginx:alpine?
Рабочая модель
Образ — неизменяемый пакет файлов, библиотек и конфигурации. Контейнер — созданный из образа runtime-объект с настройками, сетью и writable layer. Пока основной процесс контейнера работает, контейнер имеет состояние running.
Официальные определения и ограничения модели: What is a container? и What is an image?.
Практика: один контейнер
Убедитесь, что Docker Engine доступен, затем запустите Nginx. Привязка к 127.0.0.1 оставляет тестовый порт доступным только с текущего хоста.
docker version
docker run --name wms-web \
--detach \
--publish 127.0.0.1:8080:80 \
nginx:alpine
| Фрагмент | Что он задаёт |
|---|---|
docker run | При необходимости скачивает image, создаёт container и запускает его основной process. |
--name wms-web | Даёт контейнеру стабильное имя для последующих команд. |
--detach | Запускает в фоне и возвращает управление терминалу. |
127.0.0.1:8080:80 | Направляет host TCP 8080 в container TCP 80 только через loopback хоста. |
nginx:alpine | Выбирает repository nginx и tag alpine. |
Проверьте наблюдаемые факты:
docker ps --filter name=wms-web
docker logs wms-web
curl --fail http://127.0.0.1:8080/
docker inspect --format '{{.State.Status}} {{.Config.Image}}' wms-web
Ожидается: статус running, image nginx:alpine, access log после curl и HTML-ответ Nginx.
docker version не показывает Server
CLI установлен, но daemon недоступен. Проверьте, запущен ли Docker Engine, выбран ли правильный context и имеет ли пользователь доступ к socket. Не маскируйте проблему через произвольный sudo: сначала назовите нарушенную границу доступа.
Диагностика вместо перезапуска
Остановите контейнер и предскажите результат запроса до выполнения команд:
docker stop wms-web
curl --fail http://127.0.0.1:8080/
docker ps --filter name=wms-web
docker ps --all --filter name=wms-web
docker inspect --format '{{.State.Status}} {{.State.ExitCode}}' wms-web
docker ps показывает только running containers, поэтому строка исчезнет. docker ps --all покажет существующий stopped container. Образ при этом не удаляется: один и тот же image может создать много containers.
docker rm wms-web
docker image ls nginx:alpine
Удаление контейнера освобождает его runtime-конфигурацию и writable layer, но не удаляет image.
Зачем это Senior AQA
В тестовом контуре image фиксирует исполняемое окружение, а container создаётся заново для конкретного запуска. Поэтому падение тестов нужно раскладывать по границам:
- Тот ли image/tag запущен?
- Создан ли container и работает ли основной process?
- Опубликован ли нужный порт и на каком host address?
- Что говорят status, exit code и logs?
Этот порядок отделяет дефект приложения от ошибки тестового окружения и уменьшает бессистемные перезапуски flaky-прогонов.
Проверка понимания
Ответ на собеседовании
«Image — неизменяемый слоёный пакет приложения и его runtime-зависимостей. Container — созданный из image изолированный runtime-экземпляр со своей конфигурацией, сетью и writable layer. Его жизненный цикл обычно связан с основным процессом: процесс завершился — container перешёл в stopped. Один image может породить много containers».
Произнесите ответ своими словами без чтения. Затем добавьте пример из AQA: один image Playwright test runner запускается отдельным container для каждого CI job.
Первичные источники
- Docker Docs: What is a container? — основной материал к уроку.
- Docker Docs: What is an image? — неизменяемость и слои.
- Docker Docs: Port publishing and mapping — точная семантика и безопасность
-p.
Задавайте преподавателю вопросы по любому месту урока: особенно если фактический вывод команд отличается от ожидаемого.