Виртуальная машина запускает гостевую операционную систему со своим ядром. Linux-контейнер обычно запускает изолированные процессы, использующие ядро хоста.

Что находится внутри

Образ содержит файловую систему приложения: исполняемые файлы, библиотеки и нужные зависимости. Контейнер — запущенный экземпляр на основе образа, со своим состоянием и настройками.

Изоляция процессов и ограничения ресурсов решают разные задачи. Сам факт запуска в контейнере не означает, что приложение уже ограничено по памяти или CPU: лимиты нужно задавать отдельно.

Где живут данные

Записываемый слой связан с жизненным циклом контейнера. Для постоянных данных используют тома или монтирование каталогов. Базу данных нельзя считать сохранённой только потому, что её контейнер сейчас работает.

Как выбирать

Контейнеры удобны для воспроизводимой упаковки и доставки приложений. Виртуальные машины дают отдельное ядро и другую границу изоляции. Эти подходы часто используют вместе: несколько контейнеров работают внутри одной виртуальной машины.

Вопрос не только в том, «запустится ли образ», но и в том, какие ресурсы, данные и права получит процесс.