Не считая хост директорий, есть 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.
Дефолтное поведение докера — не удалять ничего пока пользователь не попросит этого эксплицитно, это распространяется как на дата-контейнеры, так и на вольюмы.