Как ответить
Docker — это инструмент для упаковки приложения и всех его зависимостей в изолированный образ, который одинаково запускается на любой Linux-машине. В отличие от виртуальных машин, Docker не эмулирует «железо» и не запускает отдельную ОС. Он использует ядро хостовой системы, изолируя процессы на уровне софта с помощью механизмов ядра Linux.
В основе работы лежат три технологии ядра: namespaces (изолируют то, что процесс «видит»: сеть, файловую систему, пользователей), cgroups (ограничивают ресурсы: сколько памяти или CPU может забрать контейнер) и Union File System (позволяет наслаивать изменения файловой системы друг на друга).
Процесс работы выглядит так:
- Dockerfile: текстовый файл с инструкциями по сборке. Каждая команда (RUN, COPY) создает новый слой.
- Image (Образ): неизменяемый шаблон, состоящий из этих слоев. Он хранится в реестре (например, Docker Hub).
- Container (Контейнер): запущенный экземпляр образа. К слоям образа сверху добавляется тонкий «слой записи» (writable layer), куда приложение пишет логи или временные файлы.
Пример простого Dockerfile для Node.js приложения:
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]Здесь важно использовать -slim версии образов, чтобы уменьшить размер с 1 ГБ до 150-200 МБ, и разделять COPY для package.json, чтобы Docker кешировал установку зависимостей и не пересобирал их при каждом изменении кода.
Главный плюс для разработчика — решение проблемы «у меня на компьютере работает, а на сервере нет». Контейнер несет в себе нужную версию системных библиотек, python-пакетов или бинарных файлов, поэтому окружение везде идентично.