Как люди обращаются с постоянным хранилищем для ваших контейнеров Docker?
В настоящее время я использую этот подход: построить образ, например, для PostgreSQL, а затем запустить контейнер с
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 ...
(см обслуживаемого ответ)
источник
--name
. у вас есть-name
Ответы:
Докер 1.9.0 и выше
Использовать том API
Это означает, что шаблон контейнера только для данных должен быть оставлен в пользу новых томов.
На самом деле API тома - это только лучший способ достичь того, что было шаблоном контейнера данных.
Если вы создаете контейнер с помощью
-v volume_name:/container/fs/path
Docker, он автоматически создает именованный том, который может:docker volume ls
docker volume inspect volume_name
--volumes-from
соединениеНовый API томов добавляет полезную команду, которая позволяет определять висячие тома:
А затем удалите его через его имя:
Как подчеркивает @mpugach в комментариях, вы можете избавиться от всех висячих томов с помощью одной строки:
Докер 1.8.x и ниже
Подход, который лучше всего работает для производства, заключается в использовании контейнера только для данных .
Контейнер только для данных запускается на изображении barebones и фактически ничего не делает, кроме предоставления объема данных.
Затем вы можете запустить любой другой контейнер, чтобы иметь доступ к томам контейнера данных:
В этом сообщении блога есть хорошее описание так называемого контейнера как шаблона объема, в котором разъясняется основной смысл наличия контейнеров только для данных .
Документация Docker теперь содержит ОПРЕДЕЛИТЕЛЬНОЕ описание контейнера в виде тома / с .
Ниже приведена процедура резервного копирования / восстановления для Docker 1.8.x и ниже.
РЕЗЕРВНЫЙ:
ВОССТАНОВИТЬ:
Вот хорошая статья от отличного Брайана Гоффа, объясняющая, почему хорошо использовать одно и то же изображение для контейнера и контейнера данных.
источник
--volumes-from
позволяет вам совместно использовать дисковое пространство--link
позволяет вам совместно использовать сервисы.docker volume create --name mydata
) предпочтительнее, чем контейнер томов данных. Сами люди в Docker полагают, что контейнеры томов данных « больше не считаются рекомендуемым шаблоном », « именованные тома должны иметь возможность заменять тома только для данных в большинстве (если не во всех) случаях » и « нет причин, которые я вижу, чтобы использовать контейнеры только для данных ».В выпуске Docker v1.0 привязка монтирования файла или каталога на главном компьютере может быть выполнена с помощью данной команды:
Вышеуказанный том можно использовать в качестве постоянного хранилища на хосте, на котором работает Docker.
источник
В Docker Compose 1.6 теперь улучшена поддержка томов данных в Docker Compose. Следующий файл compose создаст образ данных, который будет сохраняться между перезапусками (или даже удалением) родительских контейнеров:
Вот объявление в блоге: Compose 1.6: Новый файл Compose для определения сетей и томов.
Вот пример составного файла:
Насколько я понимаю: это создаст контейнер тома данных (
db_data
), который будет сохраняться между перезапусками.Если вы запустите:
docker volume ls
вы должны увидеть свой том в списке:Вы можете получить более подробную информацию об объеме данных:
Некоторое тестирование:
Ноты:
Вы также можете указать различные драйверы в
volumes
блоке. Например, вы можете указать драйвер Flocker для db_data:Отказ от ответственности: этот подход многообещающий, и я успешно использую его в среде разработки. Я бы опасался использовать это в производстве только сейчас!
источник
Если из обновления 5 выбранного ответа неясно, как в Docker 1.9, вы можете создавать тома, которые могут существовать без привязки к определенному контейнеру, что делает шаблон «контейнер только для данных» устаревшим.
См. Только для данных контейнеры устарели с Docker 1.9.0? # 17798 .
Я думаю, что сопровождающие Docker поняли, что шаблон контейнера только для данных был чем-то вроде запаха проекта, и решили сделать тома отдельной сущностью, которая может существовать без связанного контейнера.
источник
Хотя это все еще часть Docker, которая требует некоторой работы , вы должны поместить том в Dockerfile с помощью инструкции VOLUME, чтобы вам не нужно было копировать тома из другого контейнера.
Это сделает ваши контейнеры менее взаимозависимыми, и вам не придется беспокоиться об удалении одного контейнера, влияющего на другой.
источник
docker rm
)При использовании Docker Compose просто подключите именованный том, например:
источник
Ответ @ tommasop хорош и объясняет некоторые механизмы использования контейнеров только для данных. Но как человек, который изначально думал, что контейнеры данных были глупы, когда можно было просто привязать монтирование тома к хосту (как предложено несколькими другими ответами), но теперь понимает, что на самом деле контейнеры только для данных довольно аккуратны, я могу предложить свой сообщение в блоге на эту тему: Почему контейнеры данных Docker (тома!) хороши
См. Также: мой ответ на вопрос « Каков (лучший) способ управления разрешениями для общих томов Docker? » Для примера того, как использовать контейнеры данных, чтобы избежать таких проблем, как разрешения и сопоставление uid / gid с хостом.
Для решения одной из первоначальных проблем ФП: не следует удалять контейнер данных. Даже если контейнер данных будет удален, сами данные не будут потеряны, пока любой контейнер имеет ссылку на этот том, т. Е. Любой контейнер, через который монтируется том
--volumes-from
. Таким образом, если все связанные контейнеры не будут остановлены и удалены (можно считать это случайнымrm -fr /
), данные будут в безопасности. Вы всегда можете воссоздать контейнер данных, выполнив--volumes-from
любой контейнер, имеющий ссылку на этот том.Как всегда, делайте резервные копии, хотя!
ОБНОВЛЕНИЕ: теперь в Docker есть тома, которыми можно управлять независимо от контейнеров, что еще больше упрощает управление.
источник
Существует несколько уровней управления постоянными данными в зависимости от ваших потребностей:
-v host-path:container-path
чтобы сохранить данные каталога контейнера в каталоге хоста.--volumes-from
для монтирования этих данных в контейнер приложения.источник
Если вы хотите переместить ваши объемы вокруг, вы также должны посмотреть на Flocker .
Из README:
источник
Это зависит от вашего сценария (это не совсем подходит для производственной среды), но есть один способ:
Создание MySQL Docker-контейнера
Суть этого в том, чтобы использовать каталог на вашем хосте для сохранения данных.
источник
Недавно я написал о возможном решении и приложении, демонстрирующем технику. Я считаю, что это довольно эффективно во время разработки и производства. Надеюсь, что это помогает или вызывает некоторые идеи.
Репо: https://github.com/LevInteractive/docker-nodejs-example
Статья: http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/
источник
Я просто использую предопределенный каталог на хосте для сохранения данных для PostgreSQL. Кроме того, таким образом можно легко перенести существующие установки PostgreSQL в контейнеры Docker: https://crondev.com/persistent-postgresql-inside-docker/
источник
Мое решение состоит в том, чтобы использовать новый
docker cp
, который теперь может копировать данные из контейнеров, независимо от того, работает он или нет, и совместно использовать том хоста в том же месте, где приложение базы данных создает свои файлы базы данных внутри контейнера. , Это двойное решение работает без контейнера только для данных, прямо из исходного контейнера базы данных.Поэтому мой сценарий инициализации systemd выполняет резервное копирование базы данных в архив на хосте. Я поместил отметку времени в имени файла, чтобы никогда не переписывать файл.
Это делает это на ExecStartPre:
И он делает то же самое на ExecStopPost:
Кроме того, я открыл папку с хоста как том в том же месте, где хранится база данных:
Он отлично работает на моей виртуальной машине (я создаю для себя стек LEMP): https://github.com/DJviolin/LEMP
Но я просто не знаю, является ли это «пуленепробиваемым» решением, когда ваша жизнь зависит от него на самом деле (например, интернет-магазин с транзакциями в любых возможных миллисекундах)?
Через 20 минут 20 секунд после официального видео с докером докладчик делает то же самое с базой данных:
Начало работы с Docker
источник
Используйте постоянную заявку на объем (PVC) от Kubernetes, которая является инструментом управления и планирования контейнеров Docker:
Постоянные тома
Преимущества использования Kubernetes для этой цели заключаются в том, что:
источник