В чем разница между контейнером и образом в Docker?
Что проверяют
Понимаете ли вы, что образ неизменяем, а контейнер это его запущенный экземпляр с записываемым слоем. Отсюда растут все практические вопросы: почему пропали данные, почему образ такой большой.
Как отвечать
Образ это неизменяемый шаблон: слои файловой системы плюс метаданные (команда запуска, переменные среды, порты). Он собирается один раз по Dockerfile и хранится в реестре.
Контейнер это процесс, запущенный из образа, к слоям которого добавлен тонкий записываемый слой. Из одного образа можно запустить сколько угодно контейнеров, и каждый будет со своим состоянием.
Аналогия, которую обычно приводят: образ это класс, контейнер это его экземпляр.
Что из этого следует на практике:
- данные внутри контейнера временные: удалили контейнер, записываемый слой исчез. Всё, что должно пережить перезапуск, кладут в том или монтируют с хоста;
- образ слоистый и кешируемый: каждая инструкция
Dockerfileэто слой. Поэтому зависимости ставят до копирования исходников: правка кода тогда не сбрасывает кеш установки пакетов; - размер имеет значение: многоступенчатая сборка оставляет в финальном образе только результат, без компилятора и промежуточных файлов;
- теги это не версии:
latestможет указывать на разные образы в разное время, для воспроизводимости берут точный тег или дайджест.
Полезно назвать соседние понятия: реестр (хранилище образов), том (данные вне жизненного цикла контейнера), docker compose для описания набора сервисов.
Где спотыкаются
Правят файлы внутри работающего контейнера и удивляются, что после пересоздания правки исчезли.
Держат состояние приложения в контейнере вместо тома.
Кладут COPY . . первой строкой и лишают себя кеша слоёв: любая правка кода запускает переустановку всех зависимостей.