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

Как выбрать между контейнером тома докера и томом докера?

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

Кажется, есть 3 варианта:

  1. Просто сопоставьте том с каталогом хоста (т.е. -v аргумент в пользу docker run)
  2. Создайте образ контейнера докера для данных (т.е. отдельный контейнер и --volumes-from)
  3. Создание тома докера (т.е. 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+) - использовать именованный том, а не контейнер только для данных.