После прочтения документации я обнаружил, что не совсем понимаю, как лучше всего управлять продуктивными данными приложений / служб.
Кажется, есть 3 варианта:
-v
аргумент в пользу docker run
)--volumes-from
)docker volume create
)Кажется, что общепринятой практикой является вариант №2, но тогда мне интересно, какова цель №3.
Особенно, как правильно справляться с этими сценариями с docker volume
и что лучше использовать контейнер тома данных или это для каждой ситуации?
Начиная с Docker 1.9, создание именованных томов с Volumes API (docker volume create --name mydata
) предпочтительнее контейнера тома данных. По состоянию на февраль 2016 г. тома документации ужасно устарел. Сами сотрудники Docker предполагают, что контейнеры томов данных «больше не считаются рекомендуемым шаблоном, ”“именованные тома должны иметь возможность заменять тома, содержащие только данные, в большинстве (если не во всех) случаях," и "нет причин, по которым я могу использовать контейнеры только для данных. »
Я думаю, что №2 и №3 в значительной степени одно и то же, главное отличие в том, что нет остановленного контейнера с №3 (это буквально просто именованный том). Например, вы можете создать именованный том и сделать то же, что и с # 2, с -v
вместо.
Создайте именованный том:
$ docker volume create --name test
Смонтируйте и запишите на этот том данные из контейнера:
$ docker run -v test:/opt/test alpine touch /opt/test/hello
Затем вы можете установить тот же test
том в другом контейнере и прочтите данные:
$ docker run -v test:/opt/test alpine ls -al /opt/test
total 8
drwxr-xr-x 2 root root 4096 Jan 23 22:28 .
drwxr-xr-x 3 root root 4096 Jan 23 22:29 ..
-rw-r--r-- 1 root root 0 Jan 23 22:28 hello
Преимущество здесь в том, что том не исчезнет случайно, если вы удалите контейнер только данных. Теперь вы справляетесь с этим с помощью docker volume
подкоманда.
$ d volume ls
DRIVER VOLUME NAME
local test
Это также открывает возможности для драйверов томов в будущем, так что вы сможете создавать общие тома между хостами (то есть именованные тома через NFS). Примеры этого могут быть Флокер и Конвой. Если говорить конкретно о перемещении или резервном копировании данных, Convoy имеет специальные подкоманды для резервного копирования данных и позволяет хранить их на NFS или EBS, внешнем по отношению к вашему хосту.
По этой причине я думаю, что более новый способ (Docker 1.9+) - использовать именованный том, а не контейнер только для данных.