Для некоторых случаев использования я хотел бы иметь возможность создать том с docker volume create
, и заполните его данными. Затем я хочу создать новый том, который является только копией первого, но данные не нужно копировать, должны быть записаны только измененные файлы.
Это то, что Docker уже делает с изображениями и контейнерами, используя aufs или overlayfs. Вы знаете какую-либо стратегию решения этой проблемы с объемами? Если сейчас это не работает с томами докеров, подскажите, как сделать что-то подобное на хосте Docker? (Тогда я мог бы смонтировать эти папки с хоста.)
К настоящему времени у меня есть два варианта его использования, возможно, у вас есть совершенно другая идея, чтобы решить эту проблему:
Очень большой репозиторий Git (около 10 ГБ): мне нужно запустить несколько контейнеров с этим репозиторием, некоторые из них также фиксируют изменения. Таким образом, он должен быть независимым от других контейнеров, push-коммиты в удаленный репозиторий, а затем скопированный том может быть удален.
Очень большие базы данных 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.