Объем данных докеров по сравнению с установленным каталогом хоста
У нас может быть объем данных в докере:
$ docker run -v /path/to/data/in/container --name test_container debian
$ docker inspect test_container
...
Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data",
"Destination": "/path/to/data/in/container",
"Driver": "local",
"Mode": "",
"RW": true
}
]
...
Но если объем данных находится в /var/lib/docker/volumes/fac362...80535/_data
, не отличается ли он от данных в папке, установленной с помощью -v /path/to/data/in/container:/home/user/a_good_place_to_have_data
?
Ответы
Ответ 1
не отличается ли он от данных в папке, установленной с помощью -v/path/to/data/in/container:/home/user/a_good_place_to_have_data?
Это потому, что, как упоминалось в "" Установить каталог хоста как тома данных"
Каталог хоста по своей природе зависит от хоста. По этой причине вы не можете установить каталог хоста из Dockerfile, потому что созданные изображения должны быть переносимыми. Каталог хоста не будет доступен для всех потенциальных хостов.
Если у вас есть постоянные данные, которые вы хотите разделить между контейнерами или хотите использовать из непостоянных контейнеров, лучше всего создать именованный контейнер томов данных, а затем смонтировать данные из него.
Вы можете комбинировать оба подхода:
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
Здесь weve запустил новый контейнер и установил том из контейнера dbdata
.
Затем Weve установил локальный каталог хоста /backup
.
Наконец, мы передали команду, которая использует tar
для резервного копирования содержимого тома dbdata
в файл backup.tar
внутри нашего каталога /backup
. Когда команда завершится, и контейнер полностью остановится, останется резервная копия нашего тома dbdata
.
Ответ 2
Хотя при их использовании ощущается то же самое, с единственным изменением местоположения каталога, происходит другое.
Объемы против Bind Mounts
- С помощью Bind Mount файл или каталог на хост-машине монтируется в контейнер. На файл или каталог ссылается его полный или относительный путь на хост-компьютере.
- С помощью Volume создается новый каталог в каталоге хранилища Docker на хост-компьютере, а Docker управляет содержимым этого каталога.
Преимущества по сравнению с креплениями:
- Резервное копирование или перенос томов проще, чем привязывание монтировок.
- Вы можете управлять томами с помощью команд консоли Docker или API Docker.
- Тома работают как с контейнерами Linux, так и с Windows.
- Тома могут быть более безопасно разделены между несколькими контейнерами.
- Драйверы томов позволяют хранить тома на удаленных хостах или облачных провайдерах, шифровать содержимое томов или добавлять другие функции.
- Содержимое нового тома может быть предварительно заполнено контейнером.
ОБНОВЛЕНИЕ (9.9.2019):
Согласно комментарию @Sebi2020, монтирование Bind намного проще для резервного копирования. Docker не предоставляет никаких команд для томов резервного копирования. Вы должны использовать временные контейнеры с привязкой для создания резервных копий.
Объемы
Создано и управляется Docker. Вы можете создать том явно с помощью команды docker volume create, или Docker может создать том во время создания контейнера или услуги.
Когда вы создаете том, он сохраняется в каталоге на Докер хост. Когда вы монтируете том в контейнер, это каталог - это то, что монтируется в контейнер. Это похоже на работает метод bind mounts, за исключением того, что тома управляются Docker и изолированы от основной функциональности хоста машина.
Данный объем может быть установлен в несколько контейнеров одновременно. Если ни один из запущенных контейнеров не использует том, он все еще доступно для Docker и не удаляется автоматически. Вы можете удалить неиспользуемые тома, использующие сокращение тома докера.
При подключении тома он может быть названным или анонимным. анонимное томам не дается явное имя при первом подключении в контейнер, поэтому Docker дает им случайное имя, которое гарантированно будет уникальным в пределах данного хоста Docker. Помимо названия, Именованные и анонимные тома ведут себя одинаково.
Тома также поддерживают использование драйверов томов, которые позволяют хранить ваши данные на удаленных хостах или облачных провайдерах, среди прочего возможности.
![enter image description here]()
Привязать крепления
Доступно с первых дней Docker. Привязка ограничена функциональность по сравнению с объемами. Когда вы используете связывание, файл или каталог на хост-машине монтируется в контейнер. Файл или на каталог ссылается его полный путь на хост-машине. Файл или каталог уже не обязательно должны существовать на хосте Docker. Он создается по запросу, если он еще не существует. Привязные крепления очень производительный, но они полагаются на файловую систему хост-машины, имеющую доступна конкретная структура каталогов. Если вы разрабатываете новый Приложения Docker, рассмотрите возможность использования именованных томов. Вы не можете используйте команды Docker CLI для непосредственного управления подключениями.
![enter image description here]()
Также есть tmpfs mounts
.
tmpfs монтирует
Монтирование tmpfs не сохраняется на диске ни на хосте Docker, ни на в контейнере. Может использоваться контейнером в течение всей жизни. контейнера, для хранения непостоянного состояния или чувствительного Информация. Например, внутренне сервисы swarm используют tmpfs mounts монтировать секреты в служебные контейнеры.
![enter image description here]()
Ссылка:
https://docs.docker.com/storage/
Ответ 3
Разница между каталогом хоста и томом данных заключается в том, что Docker управляет последним, помещая его в каталог $DOCKER-DATA-DIR/volumes
и привязывая ссылку к нему (имена или случайно созданные идентификаторы). То есть вы получаете немного удобства.
Оба каталога хоста и тома данных являются каталогами на хосте. Оба они зависят от хоста. Вы не можете ссылаться ни на одну из них в Dockerfile
; директива VOLUME
создает новый безымянный (с произвольно сгенерированным идентификатором) тома каждый раз при запуске нового контейнера и не может ссылаться на существующий том.
* $DOCKER-DATA-DIR
здесь /var/lib/docker
, если вы не изменили значения по умолчанию.
Ответ 4
Да, это немного отличается от нескольких точек зрения.
Как вы писали в заголовке вопроса, все дело в понимании того, почему нам нужны тома данных, а не привязка к хосту.
Часть 1 - Основные сценарии с примерами
Давайте возьмем 2 сценария.
Случай 1: веб-сервер.
Мы хотим предоставить нашему веб-серверу файл конфигурации, который может часто меняться.
Например: отображение портов в соответствии с текущей средой.
Мы можем каждый раз перестраивать изображение с соответствующей настройкой или создавать 2 разных изображения для каждой среды. Оба эти решения не очень эффективны.
С помощью Bind mounts Docker монтирует заданный исходный каталог в папку внутри контейнера.
(Исходный каталог/файл в слое только для чтения внутри файловой системы объединения будет просто переопределен).
Например - привязка динамического порта к 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;'"
(*) Обратите внимание, что этот пример также может быть решен с помощью томов.
Случай 2: Базы данных.
КонтейнерыDocker не хранят постоянные данные: любые данные, которые будут записаны на записываемый слой в файловой системе объединения контейнеров, будут потеряны после остановки работы контейнера.
Но что, если у нас есть база данных, работающая на контейнере, и контейнер останавливается - это означает, что все данные будут потеряны?
Тома на помощь.
Они называются деревьями файловой системы, которыми управляет 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:
Обратите внимание, что в этом случае для именованных томов источником является имя тома.
(Для анонимных томов это поле опущено).
Часть 2 - Сравнение
Различия в управлении и изоляции на хосте
Связывание монтируется в файловой системе хоста и управляется сопровождающим хоста.
Приложения/процессы вне Docker также могут изменять его.
Тома также могут быть реализованы на хосте, но Docker будет управлять ими за нас, и к ним нельзя получить доступ за пределами Docker.
Объемы - гораздо более широкое решение
Хотя оба решения помогают нам отделить жизненный цикл данных от контейнеров,
используя Volume, вы получаете гораздо больше мощности и гибкости по сравнению с вашей системой.
С помощью Volume мы можем эффективно разрабатывать наши данные и отделять их от других частей системы, сохраняя их в выделенных удаленных местах (например, в облаке), и интегрировать их с внешними сервисами, такими как резервное копирование, мониторинг, шифрование и управление оборудованием.