Как устроена файловая система
Одно дерево от корня, и почему в контейнере всё выглядит знакомо.
Одно дерево
В Linux нет дисков C: и D:. Есть один корень /, а всё остальное — включая другие диски, сетевые хранилища и виртуальные файловые системы — подключается («монтируется») в какую-то точку этого дерева.
df -h # что куда смонтировано и сколько свободно
mount | head # то же подробнее
Каталоги, которые встречаются каждый день
| Путь | Что внутри |
|---|---|
/etc |
конфигурация системы и сервисов |
/var/log |
логи |
/var/lib |
изменяемые данные сервисов (в т.ч. данные Docker) |
/usr/bin, /usr/local/bin |
исполняемые файлы |
/tmp |
временные файлы, часто чистятся при перезагрузке |
/proc, /sys |
не файлы, а интерфейс к ядру |
/home |
домашние каталоги пользователей |
/proc — это не диск
/proc не хранится нигде: ядро генерирует его содержимое на лету. Каждому процессу соответствует каталог с его PID:
cat /proc/1/cmdline # с какими аргументами запущен PID 1
ls -l /proc/1/fd # какие файлы и сокеты он держит открытыми
cat /proc/meminfo # состояние памяти
Это часто быстрее и надёжнее, чем утилиты: /proc есть даже в минимальном контейнере, где не установлено ничего.
Почему это важно для контейнеров
Контейнер видит своё собственное дерево файловой системы. Внутри всё выглядит как обычный Linux — /etc, /var, /usr на месте, — но это слои образа, а не диск хоста.
Отсюда два практических следствия:
- Изменения внутри контейнера исчезают вместе с ним, если не смонтирован volume.
- Пути в контейнере и на хосте — разные пространства.
/var/lib/postgresqlвнутри и снаружи это, как правило, не одно и то же место.
Проверить себя
Запустите контейнер и сравните с хостом:
docker run --rm alpine ls /
Структура знакомая, содержимое — другое.