В чем разница между контейнером и образом в Docker?
Что проверяют
Понимаете ли вы, что происходит на диске и в ядре после docker run, а не только формулу «контейнер это запущенный образ». Следом часто спрашивают, куда деваются данные после удаления контейнера и как собрать компактный образ для Java-сервиса.
Как отвечать
- образ: неизменяемый набор слоёв файловой системы плюс конфигурация (
ENTRYPOINT, переменные окружения, порты) в формате OCI. Инструкции Dockerfile вродеRUNиCOPYдают слои, слои кешируются и переиспользуются. Надёжный идентификатор образа это digestsha256:..., а тег вродеmyapp:1.4просто подвижная ссылка на него; - контейнер: экземпляр образа. Поверх read-only слоёв добавляется тонкий записываемый слой (copy-on-write, драйвер
overlay2), а процесс запускается в изолированных namespaces с лимитами cgroups; - жизненный цикл: контейнер бывает
created,running,paused,exited. Остановленный контейнер вместе со своим слоем лежит на диске, пока его не удалят черезdocker rm; - соотношение: из одного образа запускается сколько угодно контейнеров, они делят общие слои и не мешают друг другу.
Для Java добавьте практику. Multi-stage сборка: на первом этапе Maven или Gradle с JDK, в итоговом образе только JRE и jar. Spring Boot умеет раскладывать приложение на слои, чтобы зависимости лежали отдельно от вашего кода и не пересобирались при каждой правке, а без Dockerfile образ можно собрать через Jib. И помните, что современная JVM видит лимиты контейнера, поэтому кучу разумнее задавать через -XX:MaxRAMPercentage, а не жёстким -Xmx под размер машины.
Где спотыкаются
Говорят, что контейнер хранится в оперативной памяти. Записываемый слой лежит на диске хоста, и поэтому забытые остановленные контейнеры съедают место.
Считают, что правка внутри запущенного контейнера меняет образ. Образ неизменяем, изменения живут только в слое контейнера и пропадут вместе с ним. Данные, которые должны пережить пересоздание, выносят в volume.
Деплоят по тегу latest. Он ничего не гарантирует: сегодня и завтра под ним могут оказаться разные образы, для воспроизводимости берут конкретную версию или digest.