🐧 Почему Docker-контейнеры не видят файловую систему друг друга? Многие думают, что за это отвечает mount namespace. Но всё немного сложнее.
Если два контейнера используют разные root filesystem на хосте, изменения файлов уже будут изолированы просто потому, что это разные директории.
Главная задача mount namespace другая: он изолирует список активных mount points, то есть таблицу монтирования.
Например, если в одном namespace сделать mount диска или подключить папку через bind mount, в другом namespace этого изменения не будет видно.
Именно поэтому контейнеры используют собственные mount namespaces.
Когда контейнер запускается, он переключается на свою файловую систему через pivot_root(). Это меняет корневой каталог процесса, но делать такое в основном namespace хоста нельзя: тогда можно случайно изменить / для всех процессов на сервере.
Поэтому контейнер получает отдельное пространство монтирования, где он может безопасно менять свою виртуальную файловую систему.
Docker-контейнеры выглядят простыми снаружи, но внутри это комбинация Linux-механизмов: namespaces, cgroups, pivot_root и файловые слои.
Разбор с практикой:
https://labs.iximiuz.com/tutorials/container-filesystem-from-scratch
Post #267
1.29K

- ❤ 3
- 💯 2
- 👎 1