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

    @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.

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