[Docker] Как работать с постоянным хранилищем (например, базами данных) в докере



Answers

В версии Docker v1.0 привязка монтирования файла или каталога на главной машине может выполняться с помощью данной команды:

$ docker run -v /host:/container ...

Вышеупомянутый том можно использовать как постоянное хранилище на хосте, работающем в докере.

Question

Как люди справляются с постоянным хранением ваших контейнеров-докеров? В настоящее время я использую этот подход: создайте образ, например, для Postgres, а затем запустите контейнер с помощью

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

ИМХО, у которого есть недостаток, что я никогда не должен (случайно) удалять контейнер «c0dbc34fd631».

Другая идея заключалась бы в том, чтобы монтировать тома хоста «-v» в контейнер, однако идентификатор пользователя в контейнере не обязательно совпадает с идентификатором пользователя с хоста, а затем разрешения могут быть испорчены.

Примечание. Вместо --volumes-from 'cryptic_id' вы также можете использовать --volumes-from my-data-container где my-data-container - это имя, которое вы назначили контейнеру только для данных, например, docker run --name my-data-container ... (см. принятый ответ)




В случае, если из 5-го варианта выбранного ответа не ясно, с Docker 1.9 вы можете создавать тома, которые могут существовать без привязки к определенному контейнеру, что делает шаблон «только для данных» устаревшим.

См. Https://github.com/docker/docker/issues/17798

Я думаю, что сторонники Docker поняли, что шаблон данных только для данных был немного конструктивным запахом и решил сделать томами отдельный объект, который может существовать без связанного с ним контейнера.




Использовать постоянный объем заявки от Kubernetes, который является инструментом управления и планирования контейнеров докеров

http://kubernetes.io/docs/user-guide/persistent-volumes/

Преимущество использования Kubernetes для этой цели заключается в том, что

  • вы можете использовать любое хранилище, такое как NFS или другое хранилище, и даже если узел не работает, хранилище не должно быть.
  • Более того, данные в таких томах могут быть сконфигурированы для сохранения даже после уничтожения самого контейнера - чтобы его можно было отменить, если необходимо, другим контейнером.



Если вы хотите перемещать тома вокруг, вы также должны посмотреть https://github.com/clusterhq/flocker

из README:

Flocker - это диспетчер объема данных и многоуровневый инструмент управления кластерами Docker. С его помощью вы можете управлять своими данными, используя те же инструменты, которые вы используете для своих приложений без состояния, используя возможности ZFS в Linux. Это означает, что вы можете запускать свои базы данных, очереди и хранилища ключей в Docker и перемещать их так же легко, как и остальные приложения.




Зависит от вашего сценария (это не подходит для среды prod), но вот один из способов: http://txt.fliglio.com/2013/11/creating-a-mysql-docker-container/

это его суть, используйте каталог на вашем хосте для сохранения данных.




Я просто использую предопределенный каталог на хосте для сохранения данных для Postgres. Кроме того, таким образом можно легко переносить существующие установки Postgres в контейнер Docker: https://crondev.com/persistent-postgresql-inside-docker/




Ответ @ tommasop является хорошим и объясняет некоторые из механизмов использования контейнеров только для данных. Но как тот, кто изначально считал, что контейнеры данных глупы, когда можно просто привязать монтирование к хосту (как это было предложено несколькими другими ответами), но теперь понимает, что на самом деле контейнеры только для данных довольно аккуратные, я могу предложить свои собственные сообщение в блоге по этой теме: https://medium.com/@ramangupta/why-docker-data-containers-are-good-589b3c6c749e

См. Также: мой ответ на вопрос « Каков наилучший способ управления разрешениями для разделяемых тонов докеров » на примере использования контейнеров данных, чтобы избежать проблем, таких как разрешения и сопоставление uid / gid с хостом.

Чтобы обратиться к одной из исходных проблем OP, нужно: контейнер данных не удалять. Даже если контейнер данных удален, сами данные не будут потеряны, если любой контейнер имеет ссылку на этот том, т.е. любой контейнер, который установил том через --volumes-from . Поэтому, если все связанные контейнеры не будут остановлены и удалены (можно считать это эквивалентом случайного rm -fr / ), данные безопасны. Вы всегда можете воссоздать контейнер данных, выполнив --volumes-from любого контейнера, который имеет ссылку на этот том.

Как всегда, делайте резервные копии!

ОБНОВЛЕНИЕ: теперь у Docker есть тома, которые можно управлять независимо от контейнеров, что дополнительно упрощает управление.




Links