Чем отличается контейнер от образа?
Образ — это неизменяемый шаблон (набор read-only слоёв), а контейнер — запущенный экземпляр этого образа с добавленным записываемым слоем и собственным состоянием.
Аналогия для Java-разработчиков: образ — это класс, контейнер — это объект (экземпляр класса). Из одного класса можно создать множество объектов, из одного образа — множество контейнеров.
| Характеристика | Образ (Image) | Контейнер (Container) |
|---|---|---|
| Аналогия в Java | Класс | Объект (экземпляр класса) |
| Изменяемость | Неизменяемый (immutable) | Изменяемый (имеет writable layer) |
| Хранение | На диске в реестре или локально | Запущенный или остановленный процесс |
| Создание | docker build / docker pull |
docker run / docker create |
| Количество | Один образ | Множество контейнеров из одного образа |
| Состояние | Нет (шаблон) | Есть (running, stopped, paused) |
Образ — это набор неизменяемых слоёв (read-only layers), представляющих файловую систему, метаданные и инструкции для запуска. Образ не потребляет CPU и не имеет состояния.
Контейнер — это запущенный экземпляр образа. При создании контейнера Docker добавляет тонкий записываемый слой (writable/container layer) поверх слоёв образа. Все изменения в файловой системе (создание, изменение, удаление файлов) записываются в этот слой.
Пример
Контейнер = Образ (read-only) + Writable Layer + Конфигурация (сети, тома, переменные)
Из одного образа можно запустить множество контейнеров, и каждый будет иметь свой независимый writable layer:
Пример
docker run -d --name app1 my-spring-app
docker run -d --name app2 my-spring-app
docker run -d --name app3 my-spring-app
# Три независимых контейнера из одного образа
При удалении контейнера (docker rm) writable layer удаляется. Данные, которые нужно сохранить, следует хранить в томах (volumes).
На собеседовании: используйте аналогию класс/объект — она понятна любому Java-разработчику. Ключевое: образ неизменяемый (read-only слои), контейнер добавляет writable layer. При удалении контейнера writable layer теряется, поэтому для персистентных данных нужны volumes.