Карта / Docker / Образ и контейнер

Образ и контейнер

Docker упаковывает приложение со всем, что ему нужно для работы (Java, библиотеки, настройки), в единый переносимый пакет — “работает у меня на компьютере” перестаёт быть проблемой, потому что окружение едет вместе с кодом.

Образ (image) — “рецепт” приложения, неизменяемый шаблон: какая ОС, какие файлы, что запускать. Контейнер — запущенный экземпляр образа — как объект и класс в Java (см. тему «Классы и объекты»): образ — класс, контейнер — объект.

docker images           # список образов на машине
docker run my-app        # создать и запустить контейнер из образа
docker ps                  # список запущенных контейнеров

docker run my-app          # запустить ещё один контейнер
docker run my-app          # и ещё один — из ОДНОГО образа можно запустить много контейнеров
Копнуть глубже

Контейнер — не виртуальная машина. Виртуальная машина эмулирует целиком отдельную ОС со своим ядром — тяжело, медленно стартует. Контейнер использует ядро хост-системы напрямую, изолируя только процессы, файловую систему и сеть — гораздо легче, стартует за секунды, а не минуты.

Слои (layers). Образ строится из слоёв, каждый — результат одной инструкции в Dockerfile (см. тему «Dockerfile»). Docker кэширует неизменившиеся слои — если поменялся только код приложения, а зависимости остались те же, пересобираются только верхние слои, а не весь образ заново — это сильно ускоряет повторную сборку.

Контейнер по умолчанию эфемерен. Данные внутри контейнера пропадают, если контейнер удалить — для постоянного хранения данных (например, файлов базы данных) используют volumes — отдельные тома, которые живут независимо от жизненного цикла контейнера.

🎤 Закрыл тему, если можешь объяснить:
• разницу образа и контейнера на аналогии класс/объект;
• чем контейнер отличается от виртуальной машины (если дошёл до 2-го слоя).