TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #1863 2.01K
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 ГБ? → разбери слои образа.

👉 Java Portal
  • 👍 15
  • ❤ 2
More from @java_iibrary
  1. Sep 28, 2026💡 Java: не создавайте ресурсоёмкие объекты, пока они действительно не понадобятся. ✅ Иниц…
  2. Sep 28, 2026Проблема в продакшене. Приложение зависло. Вы запускаете: jstack <pid> Через несколько сек…
  3. Sep 27, 2026Java-разработчики, CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом…
  4. Sep 27, 2026Java-разработчики, ConcurrentHashMap потокобезопасен. Но он не блокирует всю коллекцию при…
  5. Sep 26, 2026Во многих приложениях есть такой эндпоинт. Фронтенд удаляет JWT после того, как пользовате…
  6. Sep 26, 2026Java: используйте Deque вместо Stack для работы по принципу LIFO («последним пришёл — перв…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →