← Назад к вопросам

Чем является файловая система Docker?

2.0 Middle🔥 121 комментариев
#Python Core#Soft Skills#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Файловая Система Docker: Архитектура и Механизмы

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

Основные Компоненты Файловой Системы Docker

1. Union File System (Объединённая Файловая Система)

Основой файловой системы Docker является Union File System (UFS), наиболее распространённый вариант — OverlayFS. Это позволяет наложить несколько слоёв файловой системы друг на друга:

Контейнер (читаемый и записываемый слой)
        ↓
 Layer N (Образ слой N, только для чтения)
        ↓
 Layer 2 (Образ слой 2, только для чтения)
        ↓
Base Image / Layer 1 (Базовый слой, только для чтения)
        ↓
Хостовая файловая система

Каждый слой представляет собой набор изменений (diff) от предыдущего слоя. Это обеспечивает:

  • Эффективность памяти — общие слои между образами используются один раз
  • Быстрое создание контейнеров — не нужно копировать весь образ
  • Версионирование — можно откатиться к предыдущему слою

2. Copy-on-Write (CoW) Механизм

Когда контейнер пытается модифицировать файл из read-only слоя, Docker создаёт копию этого файла в слое контейнера:

# Пример Dockerfile, который демонстрирует слои
FROM ubuntu:20.04          # Layer 1 (Base image)
RUN apt-get update         # Layer 2 (изменения)
RUN apt-get install -y python3  # Layer 3 (изменения)
COPY app.py /app/app.py    # Layer 4 (добавленные файлы)
RUN pip install -r requirements.txt  # Layer 5 (изменения)
CMD ["python3", "/app/app.py"]     # Layer 6 (конфигурация)

Когда контейнер запускается на основе этого образа, Docker создаёт контейнерный слой:

ContainerLayer (read-write) — содержит изменения процесса
        ↓
Layer 6 (CMD) — read-only
Layer 5 (requirements) — read-only
Layer 4 (COPY) — read-only
Layer 3 (pip install) — read-only
Layer 2 (apt-get install) — read-only
Layer 1 (ubuntu:20.04) — read-only

Типы Storage Drivers

1. OverlayFS (Современный Стандарт)

Использует OverlayFS в Linux kernel для эффективного объединения слоёв:

# Проверить используемый storage driver
docker info | grep "Storage Driver"
# Output: Storage Driver: overlay2

Преимущества:

  • Хорошая производительность
  • Простая реализация
  • Поддержка inode indexing (overlay2)

2. AUFS (Старший Вариант)

Альтернативный Union File System, менее производителен, но поддерживает некоторые версии Linux:

# Использовать AUFS (если доступен)
docker daemon --storage-driver=aufs

3. Device Mapper

Использует блочные устройства и snapshots для изоляции:

# Использовать Device Mapper
docker daemon --storage-driver=devicemapper

Volumes vs Union File System

Для persistent данных Docker использует Volumes, которые обходят Union File System:

# Dockerfile с volume
FROM python:3.11
WORKDIR /app
VOLUME ["/data"]  # Директория выходит за пределы UFS
COPY app.py .
CMD ["python", "app.py"]
# Запуск контейнера с volume
docker run -v /host/data:/data myapp

# Или именованный volume (рекомендуется)
docker run -v my-volume:/data myapp

Различия:

AspectUnion File SystemVolume
ПроизводительностьХорошаяОтличная
PersistenceНет (удаляется с контейнером)Да (сохраняется)
Performance для БДНе рекомендуетсяОбязательно
ИспользованиеРабочие файлы, кодыДанные, БД, logs

Практический Пример: Понимание Слоёв

# Создать образ с несколькими слоями
cat > Dockerfile << EOF
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y python3 pip
RUN pip install flask
COPY app.py /app.py
CMD ["python3", "/app.py"]
EOF

# Построить образ
docker build -t myapp:v1 .

# Просмотреть историю слоёв
docker history myapp:v1
# Output:
# IMAGE          CREATED      CREATED BY                                      SIZE
# abc123def456   2 min ago    /bin/sh -c python3 /app.py                      0B
# def456ghi789   2 min ago    /bin/sh -c pip install flask                    50MB
# ghi789jkl012   2 min ago    /bin/sh -c apt-get update && apt-get install    200MB
# jkl012mno345   2 weeks ago  /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
# Запустить контейнер и проверить слои
docker run -it myapp:v1 bash

# Внутри контейнера — файловая система выглядит как обычно
ls /
# bin, boot, dev, etc, home, lib, ..., app.py

Оптимизация Размера Образа

Так как каждый layer занимает место, нужно минимизировать размер:

# ❌ Плохо — создаёт два больших слоя
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3 pip
RUN pip install flask django celery

# ✅ Хорошо — один слой с очисткой
FROM ubuntu:20.04
RUN apt-get update && \
    apt-get install -y python3 pip && \
    pip install flask django celery && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# ✅ Отличный подход — Multi-stage build
FROM ubuntu:20.04 AS builder
RUN apt-get update && apt-get install -y python3 pip
RUN pip install flask django celery

FROM ubuntu:20.04
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY app.py /app.py
CMD ["python3", "/app.py"]

Изоляция Файловой Системы

Каждый контейнер видит свою файловую систему, изолированную от хоста:

# На хосте
echo "Host file" > /tmp/test.txt

# Внутри контейнера
docker run -it ubuntu:20.04 bash
# cat /tmp/test.txt  # Файл хоста НЕ виден
# /tmp/ пуста

# С bind mount
docker run -it -v /tmp:/host_tmp ubuntu:20.04 bash
# cat /host_tmp/test.txt  # Теперь видим файл хоста

Заключение

Файловая система Docker — это строго спроектированная архитектура на основе Union File System (OverlayFS), которая обеспечивает:

  • Изоляцию — контейнеры не влияют друг на друга
  • Эффективность — общие слои экономят место и время
  • Гибкость — можно добавлять Volumes для persistent данных
  • Версионирование — слои образуют историю изменений

Понимание этого механизма критично для оптимизации размера образов, производительности и надёжности контейнеризованных приложений.

Чем является файловая система Docker? | PrepBro