Если я вас правильно понял, вы спрашиваете другими словами: В чем разница между объемами и привязками?
Различия в управлении и изоляции на хосте
Привязки существуют в файловой системе хоста и управляются сопровождающим хоста.
Приложения / процессы за пределами Docker также могут его изменять.
Тома также могут быть реализованы на хосте, но Docker будет управлять ими за нас, и к ним нельзя будет получить доступ за пределами Docker.
Объемы - гораздо более широкое решение
Хотя оба решения помогают нам отделить жизненный цикл данных от контейнеров, с помощью Volumes вы получаете гораздо больше возможностей и гибкости по сравнению с вашей системой.
С помощью Volumes мы можем эффективно проектировать наши данные и отделять их от хоста и других частей системы, храня их в выделенных удаленных местах (например, в облаке) и интегрировать их с внешними службами, такими как резервное копирование, мониторинг, шифрование. и управление оборудованием.
Преимущества More Volumes по сравнению с привязными креплениями:
- Никаких проблем с хозяином.
- Можно управлять с помощью Docker CLI.
- Тома могут сэкономить вам некоторые разрешения, связанные с проблемами uid / gid, которые возникают в случаях, когда uid пользователя контейнера не совпадает с хостом
gid
.
- Содержимое нового тома может быть предварительно заполнено контейнером.
Примеры
Возьмем 2 сценария.
Случай 1. Веб-сервер.
Мы хотим предоставить нашему веб-серверу файл конфигурации, который может часто изменяться.
Например: отображение портов в соответствии с текущей средой.
Мы можем перестраивать образ каждый раз с соответствующей настройкой или создавать 2 разных образа для каждой среды. Оба эти решения не очень эффективны.
С помощью Bind mounts Docker монтирует заданный исходный каталог в место внутри контейнера.
(Исходный каталог / файл в слое только для чтения внутри файловой системы union будет просто переопределен).
Например - привязка динамического порта к nginx:
version: "3.7"
services:
web:
image: nginx:alpine
volumes:
- type: bind #<-----Notice the type
source: ./mysite.template
target: /etc/nginx/conf.d/mysite.template
ports:
- "9090:8080"
environment:
- PORT=8080
command: /bin/sh -c "envsubst < /etc/nginx/conf.d/mysite.template >
/etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
(*) Обратите внимание, что этот пример также можно решить с помощью Volumes.
Случай 2. Базы данных.
В контейнерах Docker не хранятся постоянные данные: любые данные, которые будут записаны на доступный для записи уровень в файловой системе union контейнера, будут потеряны после того, как контейнер перестанет работать.
Но что, если у нас есть база данных, работающая в контейнере, и контейнер останавливается - это означает, что все данные будут потеряны?
Объемы спешат на помощь.
Это именованные деревья файловых систем, которыми за нас управляет Docker.
Например - сохранение данных Postgres SQL:
services:
db:
image: postgres:latest
volumes:
- "dbdata:/var/lib/postgresql/data"
volumes:
- type: volume #<-----Notice the type
source: dbdata
target: /var/lib/postgresql/data
volumes:
dbdata:
Обратите внимание, что в этом случае для именованных томов источником является имя тома (для анонимных томов это поле опускается).
person
RtmY
schedule
30.09.2019