tgoop.com/Java_Iibrary/1863
Last Update:
Docker это не мини-виртуальные машины
Многие пользуются Docker каждый день, но не особо понимают, что происходит под капотом. Это становится очевидно, когда начинаются проблемы с производительностью, правами доступа или сетью.
1. Docker — это не виртуалка
Когда ты запускаешь docker run ubuntu, ты не создаешь «мини-компьютер».
Никакого нового ядра нет.
Контейнер использует то же ядро, что и хост — просто в изоляции.
Поэтому он стартует за миллисекунды и ест меньше оперативки, чем виртуальная машина.
2. Изоляция достигается через namespaces
Namespace говорит системе:
«Этот процесс видит только вот этот кусочек мира».
Примеры:
PID namespace — контейнер думает, что его процесс 1 — единственный.
NET namespace — у контейнера своя сеть и интерфейсы.
MNT namespace — своя файловая система с примонтированными ресурсами.
Так несколько контейнеров могут спокойно жить рядом, не мешая друг другу.
3. Cgroups ограничивают ресурсы
Контейнер может считать, что владеет всей машиной…
но control groups (cgroups) ставят реальные лимиты:
- максимум CPU (--cpus=2)
- максимум памяти (--memory=1g)
- лимиты на I/O или количество процессов
Если контейнер пытается выйти за рамки, ядро его просто отрубает
4. Файловая система и слои (UnionFS)
Образ это не один файл, а набор слоев.
Каждая инструкция RUN, COPY или ADD в Dockerfile создает новый слой.
Когда контейнер запускается, поверх монтируется временный слой для записи.
Вот почему все изменения исчезают после удаления контейнера —
временный слой просто выкидывается.
5. Как контейнеры общаются между собой
Docker создает виртуальные сети внутри хоста.
Каждый контейнер получает свой внутренний IP.
Когда ты используешь --link или docker-compose,
ты просто задаешь внутренние DNS-имена.
Во внешний мир трафик не выходит,
пока ты сам не пробросишь порт через -p 8080:80.
6. Безопасность -изоляция не идеальна
Поскольку ядро общее, защита не такая жесткая, как у виртуалки.
Для этого и придуманы штуки вроде:
gVisor — песочница для системных вызовов
SELinux или AppArmor
rootless Docker
Если запускаешь сторонние контейнеры — лучше использовать их.
Так что же такое Docker на самом деле?
Это оркестратор изоляции:
- прячет ресурсы через namespaces
- ограничивает их через cgroups
- управляет файловой системой через UnionFS
- эмулирует сеть через network namespaces
Он ничего не эмулирует по-настоящему,
он просто создает очень правдоподобную иллюзию
Понимание этого полностью меняет подход к дебагу и оптимизации.
Контейнер жрет всю оперативку? → смотри cgroups.
Не может подключиться к сети? → проверь network namespace.
Билды весят по 5 ГБ? → разбери слои образа.