Ответ
Docker — это платформа, которая использует возможности ядра Linux для создания изолированных пользовательских пространств, называемых контейнерами. Вот как это работает на практике:
1. Основа: namespaces и cgroups.
- Namespaces изолируют ресурсы: PID (процессы), NET (сеть), MNT (файловые системы), IPC, UTS (hostname).
- Control Groups (cgroups) ограничивают и отслеживают использование ресурсов: CPU, память, I/O.
2. Сборка образа (Image).
Образ — это неизменяемый шаблон, собираемый из слоев по инструкциям в Dockerfile.
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Каждая инструкция (FROM, RUN, COPY) создает новый слой. Это позволяет кэшировать слои и быстро пересобирать образы.
3. Запуск контейнера.
При команде docker run Docker Engine:
- Скачивает или берет локальный образ.
- Создает новый набор namespaces и cgroups.
- Внутри этого изолированного пространства монтирует слои образа в единую файловую систему (через UnionFS, например,
overlay2). - Запускает процесс, указанный в
CMDилиENTRYPOINT.
4. Ключевое отличие от виртуальных машин: Контейнеры не эмулируют железо и не запускают полноценную гостевую ОС. Все контейнеры на хосте используют одно общее ядро Linux, что делает их легковесными и быстрыми в запуске.