Как устроена файловая система

Одно дерево от корня, и почему в контейнере всё выглядит знакомо.

Одно дерево

В 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 на месте, — но это слои образа, а не диск хоста.

Отсюда два практических следствия:

  1. Изменения внутри контейнера исчезают вместе с ним, если не смонтирован volume.
  2. Пути в контейнере и на хосте — разные пространства. /var/lib/postgresql внутри и снаружи это, как правило, не одно и то же место.

Проверить себя

Запустите контейнер и сравните с хостом:

docker run --rm alpine ls /

Структура знакомая, содержимое — другое.