Какие утилиты и технологии Linux используются под капотом Docker?

Ответ

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

  1. Namespaces (Пространства имен) — изолируют процессы, сеть, файловую систему, IPC (межпроцессное взаимодействие), UTS (имя хоста) и другие ресурсы, позволяя каждому контейнеру иметь собственное изолированное окружение, не влияющее на хост-систему или другие контейнеры.

    • Пример: unshare --pid --fork --mount-proc создает новый PID namespace и монтирует новую /proc.
  2. Cgroups (Control Groups) — ограничивают и управляют использованием системных ресурсов (CPU, память, диски, сетевой ввод/вывод) для групп процессов. Это обеспечивает справедливое распределение ресурсов и предотвращает их исчерпание одним контейнером.

    • Пример: cgcreate -g cpu,memory:/mygroup создает новую группу контроля ресурсов.
  3. Union File Systems (Объединяющие файловые системы) — такие как OverlayFS или AUFS, объединяют слои контейнера (образ и слой записи) в единую файловую систему. Это позволяет эффективно использовать дисковое пространство (слои образа доступны только для чтения и могут быть общими) и быстро создавать новые контейнеры.

    • Пример монтирования OverlayFS:
      mkdir lower upper work merged
      echo "lower content" > lower/file.txt
      mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merged
      # Теперь 'merged' содержит 'file.txt' из 'lower'
  4. Seccomp (Secure Computing Mode) — фильтрует системные вызовы (syscalls), которые может выполнять процесс. Docker использует профиль Seccomp по умолчанию, который ограничивает доступ к опасным системным вызовам, повышая безопасность за счет минимизации поверхности атаки.

  5. Capabilities (Возможности) — разграничивают привилегии процессов. Вместо предоставления полного root-доступа внутри контейнера, Docker может давать только необходимые возможности (например, CAP_NET_BIND_SERVICE для привязки к низким портам), предоставляя гранулярный контроль над действиями процесса.

    • Пример: capsh --drop=cap_net_raw -- -c "ping 8.8.8.8" запретит использование ping (требует CAP_NET_RAW).
  6. iptables/nftables — используются для управления сетевым трафиком, обеспечивая маршрутизацию, NAT (Network Address Translation) и сетевую изоляцию между контейнерами, а также между контейнерами и хостом.

  7. containerd/runc — являются низкоуровневыми рантаймами, которые реализуют спецификацию OCI (Open Container Initiative) для запуска и управления жизненным циклом контейнеров. containerd управляет полным жизненным циклом контейнера на хосте, а runc — это легковесный, переносимый рантайм для запуска контейнеров.

Эти технологии вместе обеспечивают мощную и эффективную платформу для контейнеризации приложений, гарантируя их изоляцию, безопасность и оптимальное использование ресурсов.