Sobes.tech
Назад к вопросам
Junior — Middle
65

Чем отличается образ Docker от запущенного контейнера Docker?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Образ Docker — это неизменяемый шаблон с приложением и его зависимостями, из которого запускают контейнеры. Контейнер — это уже работающий экземпляр образа с собственным состоянием во время выполнения. Образ хранится как артефакт, а контейнер живёт в памяти и файловой системе поверх этого образа.

Определение:

Docker image — это слоёный, read-only шаблон, который содержит всё необходимое для запуска приложения: код, библиотеки, настройки, точку входа.
Docker container — это запущенный процесс на основе образа, к которому Docker добавляет writable-слой для изменений во время работы.

Проще говоря: образ — это «чертёж», контейнер — «экземпляр по чертежу».

Пример использования:

Например, для Java-приложения сначала собирают образ с JDK, JAR-файлом и командой запуска. Затем из этого образа поднимают один или несколько контейнеров: каждый контейнер имеет свои переменные окружения, порты и временные изменения, но использует один и тот же образ.

docker build -t my-java-app:1.0 .
docker run -d --name app1 -p 8080:8080 my-java-app:1.0
docker run -d --name app2 -p 8081:8080 my-java-app:1.0

Пояснение кода:

Код показывает, что сначала создаётся образ my-java-app:1.0, а потом из него запускаются два контейнера.

  1. docker build -t my-java-app:1.0 . — собирает образ из Dockerfile в текущей директории.
  2. docker run -d --name app1 -p 8080:8080 my-java-app:1.0 — запускает первый контейнер в фоне и пробрасывает порт.
  3. docker run -d --name app2 -p 8081:8080 my-java-app:1.0 — запускает второй контейнер из того же образа, но как отдельный экземпляр.
  4. Оба контейнера используют один и тот же образ, но их runtime-состояние и writable-слой независимы.
  5. Если внутри контейнера что-то изменить во время работы, это изменение не меняет исходный образ.

Ключевые моменты:

  • Образ — неизменяемый шаблон, контейнер — запущенный экземпляр этого шаблона.
  • Один образ может породить много контейнеров.
  • Образ хранится как артефакт, контейнер — это runtime-сущность.
  • Контейнер имеет собственный writable-слой и состояние выполнения.
  • Изменения в контейнере обычно не влияют на сам образ.
  • Для деплоя и масштабирования работают именно с образами и контейнерами отдельно: образ собирают, контейнер запускают.