EUR
european

EUR

usa

USD

Russian Ru
Ex. VAT Ex. VAT 0%

Как работает хранение данных в Docker: Volumes и Bind Mounts

Введение

В этом руководстве вы узнаете, как работает хранение данных в Docker и как сохранять данные с помощью Docker Volumes и Bind Mounts. Вы также поймете ключевые различия между этими подходами и когда использовать каждый из них в production. Это поможет избежать потери данных и спроектировать надежные контейнеризированные системы.

Предварительные требования

  • Целевая аудитория: начинающие системные администраторы
  • Примерное время: ~30 минут
  • Операционная система: любая ОС с поддержкой Docker, например Ubuntu 22.04+, Debian 12+, CentOS Stream или macOS с Docker Desktop
  • ПО: Docker 24.0.0 или новее
  • Права: пользователь с доступом к Docker или sudo-привилегиями
  • Аппаратные требования: минимум 2 ГБ ОЗУ и 10 ГБ свободного дискового пространства
  • Сеть: доступ в Интернет для загрузки образов контейнеров
  • Базовые знания: основы работы с командной строкой и понимание контейнеров

Шаг 1: Понимание работы хранения данных в Docker

Контейнеры Docker используют слоистую файловую систему. Каждый контейнер имеет записываемый слой поверх неизменяемых слоев образа.

Что происходит при записи данных в контейнер

  1. Docker хранит слои образа как read-only
  2. При запуске контейнера Docker добавляет записываемый слой
  3. Все изменения файлов происходят только в этом записываемом слое

Результат

При удалении контейнера все данные в записываемом слое теряются. Это означает, что хранение данных в контейнере по умолчанию является эфемерным.

Info

Такое поведение подходит для stateless-приложений, но не для баз данных или сервисов с постоянным хранением.

Шаг 2: Создание и использование Docker Volumes

Docker Volumes — это управляемые Docker области хранения данных.

Создание тома

Выполните команду:

docker volume create my_volume

В ответ вы увидите имя тома.

Использование тома в контейнере

Выполните команду:

docker run -d -v my_volume:/app/data --name volume_test busybox

Docker монтирует том в контейнер по пути /app/data.

Результат

Данные, записанные в /app/data, сохраняются даже после удаления контейнера.

Ключевые характеристики volumes

  • Управляются Docker
  • Хранятся во внутренних директориях Docker, например /var/lib/docker/volumes/
  • Удобны для резервного копирования и миграции
  • Изолированы от структуры файловой системы хоста

Tip

Используйте volumes для баз данных и production-нагрузок.

Шаг 3: Создание и использование Bind Mounts

Bind mounts связывают конкретную директорию на хосте с директорией внутри контейнера.

Использование bind mount

Выполните команду:

docker run -d -v /home/<YOUR_USERNAME>/data:/app/data --name bind_test busybox

Результат

Контейнер напрямую обращается к директории на хосте. Любые изменения на хосте сразу видны внутри контейнера.

Ключевые характеристики bind mounts

  • Зависят от путей файловой системы хоста
  • Позволяют напрямую редактировать файлы с хоста
  • Не имеют изоляции, управляемой Docker
  • Более гибкие, но менее переносимые

Info

Bind mounts мгновенно отражают изменения между хостом и контейнером.

Шаг 4: Сравнение Volumes и Bind Mounts

Понимание различий помогает выбрать правильный вариант.

Docker Volumes

  • Управляются Docker
  • Переносимы между окружениями
  • Безопаснее для production
  • Проще в резервном копировании
  • Абстрагированы от файловой системы хоста

Bind Mounts

  • Управляются хостом
  • Привязаны к конкретным путям
  • Удобны для разработки
  • Обеспечивают прямой доступ к файлам
  • Менее безопасны при неправильной настройке

Шаг 5: Выбор между Volumes и Bind Mounts в production

Используйте следующие рекомендации.

Когда использовать Docker Volumes

  • Запуск баз данных, например MySQL или PostgreSQL
  • Хранение данных приложения, которые должны сохраняться
  • Развертывание production-сервисов
  • Необходимость переносимости между серверами

Когда использовать Bind Mounts

  • Локальная разработка
  • Прямое редактирование кода или конфигурации
  • Отладка поведения контейнера
  • Временные или тестовые окружения

Info

Важно: Bind mounts могут открыть доступ контейнеру к чувствительным файлам хоста при неправильной настройке. Всегда проверяйте пути и права доступа.

Проверка и тестирование

Создайте тестовый контейнер с volume:

docker run -it -v my_volume:/data --name playground busybox

Внутри контейнера создайте файл:

echo test > /data/file.txt

Выйдите из контейнера и удалите его:

docker rm -f playground

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

docker run -it -v my_volume:/data --name playground busybox

Проверьте файл:

cat /data/file.txt

Ожидаемый результат: файл существует, что подтверждает сохранность данных.

Откат изменений

Для очистки ресурсов выполните команды:

docker rm -f playground volume_test bind_test

docker volume rm my_volume

docker system prune -f

Info

Важно: Удаление volumes безвозвратно удаляет все данные.

Устранение неполадок

  • Проблема: данные исчезают после перезапуска контейнера
    Причина: не используется volume или bind mount
    Решение: подключите постоянное хранилище
  • Проблема: ошибка permission denied
    Причина: несовпадение прав доступа
    Решение: используйте chmod или chown
  • Проблема: volume не монтируется
    Причина: неверный путь или синтаксис
    Решение: проверьте формат и пути

Заключение и дальнейшие шаги

Вы узнали, как работает хранение данных в Docker и как сохранять данные с помощью volumes и bind mounts. Теперь вы понимаете, когда использовать каждый подход в production. Далее изучите Docker Compose для управления multi-container приложениями и декларативного описания хранилища.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA