← Назад к вопросам

В чем разница между Docker образом и контейнером?

2.0 Middle🔥 161 комментариев
#Инструменты тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Docker образом и контейнером

Это фундаментальное различие, которое часто вызывает путаницу у новичков. Проще всего представить аналогию с объектно-ориентированным программированием: образ (Image) — это класс, а контейнер (Container) — это экземпляр (объект) этого класса, запущенный в памяти.

Docker Образ (Image)

Образ — это неизменяемый (immutable) шаблон, "слепок" или "рецепт", содержащий всё необходимое для запуска приложения.

  • Состав образа: Это многослойная структура (layered filesystem), обычно включающая:
    *   Базовый образ ОС (Alpine, Ubuntu)
    *   Зависимости приложения (библиотеки, среды выполнения, например, JDK, Node.js)
    *   Код приложения
    *   Файлы конфигурации
    *   Переменные окружения по умолчанию
    *   Команда по умолчанию для запуска

  • Ключевые характеристики:
    *   **Неизменяемость (Immutable):** После создания образ нельзя изменить. Любое изменение создаёт новый слой и, в итоге, новый образ.
    *   **Многослойность:** Каждая инструкция в `Dockerfile` создаёт новый слой. Это позволяет эффективно кэшировать слои и экономить дисковое пространство, так как одинаковые слои могут использоваться разными образами.
    *   **Образ хранится в реестре (Registry):** Например, Docker Hub, GitLab Container Registry, AWS ECR. Оттуда его можно "скачать" (`docker pull`) на любую машину с Docker.

Пример создания образа:

# Dockerfile - это "рецепт" для сборки образа
FROM alpine:latest
RUN apk add --no-cache python3 py3-pip
COPY ./app /app
WORKDIR /app
RUN pip install -r requirements.txt
ENV APP_PORT=8080
CMD ["python3", "app.py"]

Сборка выполняется командой:

docker build -t my-python-app:1.0 .
# Создаётся ОБРАЗ с именем `my-python-app` и тегом `1.0`

Docker Контейнер (Container)

Контейнер — это запущенный экземпляр образа. Это изолированный, исполняемый процесс в пользовательском пространстве хостовой ОС.

  • Состав контейнера: К основным слоям образа добавляется тонкий слой для записи (writable container layer), который существует только на время жизни контейнера.
  • Ключевые характеристики:
    *   **Изменяемость:** Все изменения в файловой системе во время выполнения (запись логов, создание временных файлов, модификация данных) происходят в этом временном верхнем слое.
    *   **Изоляция:** Контейнер имеет свою собственную изолированную файловую систему, сетевой стек, пространство процессов и ресурсы CPU/RAM (ограниченные через cgroups).
    *   **Эфемерность (Ephemeral):** По умолчанию, при остановке контейнера его слой для записи удаляется. Данные сохраняются только при использовании **томов (Volumes)** или **bind mounts**.
    *   **Запуск и управление:** Контейнеры можно создавать, запускать, останавливать, перемещать и удалять.

Пример работы с контейнером:

# Создание и запуск КОНТЕЙНЕРА из образа
docker run -d --name my-running-app -p 8080:8080 my-python-app:1.0
# Создаётся и стартует КОНТЕЙНЕР с именем `my-running-app`

# Просмотр запущенных контейнеров
docker ps

# Остановка контейнера
docker stop my-running-app

# При повторном запуске этой же командой `docker run...` будет создан НОВЫЙ контейнер из того же образа.

Сравнительная таблица

КритерийDocker ОбразDocker Контейнер
СущностьШаблон, рецепт, "упакованное приложение"Экземпляр, запущенный процесс
СостояниеНеизменяемый (Read-only)Изменяемый (имеет слой для записи)
ХранениеРепозиторий/Реестр, кэш DockerСуществует только во время выполнения
КоличествоОдин образ можно использовать для создания множества контейнеровМного контейнеров от одного образа
Жизненный циклСобирается (build), хранится, передаётся (push/pull)Создаётся (run), запускается, останавливается, удаляется
Аналог в ООПКлассОбъект (экземпляр класса)
Аналог в ОСИсполняемый файл (.exe, бинарник)Запущенный процесс

Почему это важно для QA-инженера?

  1. Понимание окружения: Тесты запускаются в контейнерах, которые развернуты из определенных образов. Необходимо знать, какой образ (с какими версиями ПО) используется для тестового стенда.
  2. Воспроизводимость багов: Если баг воспроизводится в контейнере, но не воспроизводится после его пересоздания, проблема может быть в данных из временного слоя контейнера, а не в коде из образа.
  3. Тестирование версий: Легко протестировать приложение на разных версиях, просто запуская контейнеры из разных образов (my-app:v1.8, my-app:v1.9).
  4. Изоляция тестов: Каждый набор автотестов можно запускать в отдельном, чистом контейнере, что гарантирует отсутствие side-эффектов между прогонами.
  5. Работа с данными: Понимание, что данные, записанные в файловую систему контейнера, будут утеряны после его удаления, подводит к необходимости настройки томов (volumes) для хранения логов, конфигураций или БД.

Таким образом, образ — это статичное определение, а контейнер — это его динамическая реализация. Один образ — множество параллельно работающих, изолированных контейнеров, что является краеугольным камнем современных CI/CD пайплайнов и микросервисной архитектуры, которые QA-инженеру приходится тестировать ежедневно.