Чем отличается образ 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, а потом из него запускаются два контейнера.
docker build -t my-java-app:1.0 .— собирает образ из Dockerfile в текущей директории.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— запускает второй контейнер из того же образа, но как отдельный экземпляр.- Оба контейнера используют один и тот же образ, но их runtime-состояние и writable-слой независимы.
- Если внутри контейнера что-то изменить во время работы, это изменение не меняет исходный образ.
Ключевые моменты:
- Образ — неизменяемый шаблон, контейнер — запущенный экземпляр этого шаблона.
- Один образ может породить много контейнеров.
- Образ хранится как артефакт, контейнер — это runtime-сущность.
- Контейнер имеет собственный writable-слой и состояние выполнения.
- Изменения в контейнере обычно не влияют на сам образ.
- Для деплоя и масштабирования работают именно с образами и контейнерами отдельно: образ собирают, контейнер запускают.