Как работают тома в Docker?

Пришел к осознанию того что я не до конца понимаю как работают тома в докере, начал разбираться, по поводу томов вывел 4 сущности:

  1. Монтирование внешних папок параметром -v. Тут вроде все и так понятно.
  2. Data-only containers. Как я понял тупо создается контейнер, в котором в нужной папке будут лежать данные (по факту гдето в /var/lib/docker/vfs/dir/..), и это можно юзать с помощью --volumes-from. Плюс и в таком случае не надо морочится по поводу прав и т.п. на файлы если это требуется, например, для работы с файлами бд в отличии от первого способа.
  3. Named volumes. В отличии от data-only не создается контейнер (как следствие не нужен базовый образ), размещается где-то в /var/lib/docker/volumes/.., доступен по имени. Удобнее делать inspect.
  4. VOLUME в Dockerfile. Вот тут я понять не могу. Указываю, например, VOLUME /var/www сохраняю туда что-то, удаляю контейнер, пересоздаю с того же образа, данные пропали. Какой смысл? В документации ответа для себя найти не смог.


Скажите пожалуйста, правильно ли я понял первые 3 пункта, и подскажите по поводу 4го.

Спасибо.
  • Вопрос задан
  • 5609 просмотров
Решения вопроса 1
@askhat
Не считая хост директорий, есть 2 способа делать персистанс в докере: (1) дата-контейнеры и (2) вольюмы. На примере композа, рассмотрим оба варианта.

1. Дата-контейнеры
Самый старый и, на мой взгляд, костыльный способ. Заключается в том, что данные будут сохраняться в контейнере в котором не запущен процесс, и по факту контейнер остановлен. В качестве такого контейнера можно использовать «основной» имедж или использовать специальный, как tianon/true.
docker-compose.yml
version: '2'
services:
  web:
    image: 'nginx'
    volumes_from:
      - 'data'
  data:
    build: './public_html'

public_html/Dockerfile
FROM nginx
ADD index.html /var/www/public_html
CMD /bin/true

Обратите внимание на директиву CMD в Докерфайле дата-контейнера. Не смотря на то что исходным имеджем является nginx, как и в сервисе web, команда /bin/true не запустит процесс, а лишь сигнализирует докеру об успешной сборке контейнера. docker-compose ps покажет что дата-контейнер иммет статус типа Exit..., и это именно то состояние которого мы ищем для этого контейнера.
Прим.: для tianon/true директиву CMD указывать не обязательно, однако придётся указать директиву VOLUME, так как в отличии от основного имеджа, она не указана в исходном Докерфайле.

2. Вольюмы
Или, как их называют официально, именованные вольюмы. Более очевидный способ работать с персистансом.
docker-compose.yml
version: '2'
services:
  web:
    image: 'nginx'
    volumes:
      - 'web_data:/var/www/public_html'
volumes:
  web_data:

Такая конфигурация автоматически создаст вольюм с именем web_data и замапит его на папку /var/www/public_html внутри контейнера web, при старте композа. Обратите внимание, что в этом примере вольюм обозначен как ключ без значений, это валидный ямл синтаксис, и, в данном случае, означает что композ сфолбэчит опции вольюма на дефолтные, обязательной из которых является driver: 'default'. В случае если вы поднимаете композ локально или на удалённой докер машине, дефолтный драйвер вам подойдёт, если только вы не знаете что нет.
Прим.: из драйверов, которые представляют особый интерес, во всяком случае мне, драйвер для NFS и DigitalOcean Block Storage.

Дефолтное поведение докера — не удалять ничего пока пользователь не попросит этого эксплицитно, это распространяется как на дата-контейнеры, так и на вольюмы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы