Назад | Перейти на главную страницу

Как использовать OverlayFS с томами Docker?

Для некоторых случаев использования я хотел бы иметь возможность создать том с docker volume create, и заполните его данными. Затем я хочу создать новый том, который является только копией первого, но данные не нужно копировать, должны быть записаны только измененные файлы.

Это то, что Docker уже делает с изображениями и контейнерами, используя aufs или overlayfs. Вы знаете какую-либо стратегию решения этой проблемы с объемами? Если сейчас это не работает с томами докеров, подскажите, как сделать что-то подобное на хосте Docker? (Тогда я мог бы смонтировать эти папки с хоста.)

К настоящему времени у меня есть два варианта его использования, возможно, у вас есть совершенно другая идея, чтобы решить эту проблему:

  1. Очень большой репозиторий Git (около 10 ГБ): мне нужно запустить несколько контейнеров с этим репозиторием, некоторые из них также фиксируют изменения. Таким образом, он должен быть независимым от других контейнеров, push-коммиты в удаленный репозиторий, а затем скопированный том может быть удален.

  2. Очень большие базы данных mysql (около 130 ГБ): в целях тестирования и других задач миграции я бы не хотел копировать всю базу данных.

Учитывая отсутствие других ответов на этот вопрос, я вмешаюсь. Лучший способ добиться этого сегодня - сделать это самостоятельно с помощью overlayfs. В настоящее время он включен в ядро ​​Linux, поэтому вы можете работать без дополнительных пакетов или модулей (при условии, что вы используете 3.18 или новее).

С помощью overlayfs требуется рабочий каталог, «верхний» каталог и точка монтирования в дополнение к существующему каталогу, который вы не хотите изменять.

Предполагая, что у меня есть данные в myreadonlydir которые я не хочу, чтобы контейнеры менялись, я могу создать два таких наложения:

mkdir upperdir1 workdir1 mountpoint1 upperdir2 workdir2 mountpoint2
sudo mount -t overlay overlay -o lowerdir=myreadonlydir,upperdir=upperdir1,workdir=workdir1 mountpoint1
sudo mount -t overlay overlay -o lowerdir=myreadonlydir,upperdir=upperdir2,workdir=workdir2 mountpoint2

Теперь у меня есть две точки монтирования, mountpoint1 и mountpoint2 которые я могу прикрепить к своим контейнерам, например

docker run -v $PWD/mountpoint1:/data alpine:3.6   # first container
docker run -v $PWD/mountpoint2:/data alpine:3.6   # second container

И каждый контейнер будет видеть содержимое myreadonlydir внутри /data. Когда они записывать ко всему в /data (удалить файлы, добавить к файлам, создать файлы, что угодно), overlayfs будет только "писать" в upperdir, а данные в myreadonlydir остался один.

Поскольку контейнеры используют разные точки монтирования, модификации каждого контейнера для /data не влияют на другой контейнер.

Если вы хотите быть в безопасности, вы можете смонтировать свои данные -o ro чтобы защитить его от любых записей.

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

Обратите внимание, я понятия не имею, насколько хорошо overlayfs будет работать при использовании его с большой базой данных MySQL ... под капотом он выполняет операции копирования внутри workdir когда файл записан. В идеале ваш workdir должно быть на быстром хранилище - SSD или tmpfs если у вас достаточно оперативной памяти.

Больше информации @ https://wiki.archlinux.org/index.php/Overlay_filesystem.