docker составить тип тома - привязка vs том

TL; DR

В docker-compose, в чем разница между

volumes:
    - type: volume
      source: mydata
      target: /data

и

volumes:
    - type: bind
      source: mydata
      target: /data

?

Вопрос в длинном:

Когда вы указываете параметр volumes в своем docker-compose файле, вы можете использовать стиль с длинным синтаксисом

Согласно документации, параметр type принимает 3 разных значения: volume, bind и tmpfs:

Я понимаю вариант tmpfs - это означает, что том не будет сохранен после отключения контейнера..

Но я не могу найти в документации никакой ссылки на разницу между двумя другими вариантами: bind и volume, может ли кто-нибудь просветить меня по этому поводу?


person Efrat Levitan    schedule 26.03.2019    source источник


Ответы (2)


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

  • Bind mounts - это файлы, смонтированные с вашего хост-компьютера (того, на котором работает ваш демон docker) в ваш контейнер.
  • Volumes are like storage spaces totally managed by docker.
    You will find, in the literature, two types of volumes:
    • named volumes (you provide the name of it)
    • анонимные тома (обычные имена UUID из докера, например, вы можете найти их в контейнере или немаркированных изображениях)

Эти тома поставляются с собственным набором команд докеров; вы также можете просмотреть этот список через

docker volume --help

Вы можете увидеть свои существующие тома через

docker volume ls

Вы можете создать именованный том с помощью

docker volume create my_named_volume

Но вы также можете создать том с помощью docker-compose файла

version: "3.3"

services:
  mysql:
    image: mysql
    volumes:
      - type: volume
          source: db-data
          target: /var/lib/mysql/data

volumes:
  db-data:

Там, где эта часть говорит: , пожалуйста, докер, смонтируйте мне том с именем db-data поверх каталога контейнера / var / lib / mysql / data

- type: volume
    source: db-data
    target: /var/lib/mysql/data

И эта часть говорит докеру создайте мне том с именем db-data

volumes:
  db-data:

Документация Docker о трех типах монтирования:

person β.εηοιτ.βε    schedule 26.03.2019
comment
спасибо, теперь все очищается. Можете ли вы также сказать мне, когда я использую стиль короткого синтаксиса в моем томе (путь: путь), для какой опции используется этот тип по умолчанию? - person Efrat Levitan; 27.03.2019
comment
Никто. Или на самом деле оба. Докер начинает это понимать. Если он получит /pat/to/file, это будет привязка. Если он также получает ./relative/path/to/file, если это просто name, тогда докер понимает, что это том - person β.εηοιτ.βε; 27.03.2019

Если я вас правильно понял, вы спрашиваете другими словами: В чем разница между объемами и привязками?

Различия в управлении и изоляции на хосте

Привязки существуют в файловой системе хоста и управляются сопровождающим хоста.
Приложения / процессы за пределами Docker также могут его изменять.

Тома также могут быть реализованы на хосте, но Docker будет управлять ими за нас, и к ним нельзя будет получить доступ за пределами Docker.

Объемы - гораздо более широкое решение

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

С помощью Volumes мы можем эффективно проектировать наши данные и отделять их от хоста и других частей системы, храня их в выделенных удаленных местах (например, в облаке) и интегрировать их с внешними службами, такими как резервное копирование, мониторинг, шифрование. и управление оборудованием.

Преимущества More Volumes по сравнению с привязными креплениями:

  1. Никаких проблем с хозяином.
  2. Можно управлять с помощью Docker CLI.
  3. Тома могут сэкономить вам некоторые разрешения, связанные с проблемами uid / gid, которые возникают в случаях, когда uid пользователя контейнера не совпадает с хостом gid.
  4. Содержимое нового тома может быть предварительно заполнено контейнером.

Примеры

Возьмем 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
comment
Я думаю, что этот ответ объясняет это лучше, чем принятый ответ, спасибо - person Muhammad; 30.01.2020
comment
любые данные, которые будут записаны на доступный для записи уровень в файловой системе объединения контейнера, будут потеряны после того, как контейнер перестанет работать. - ›после удаления контейнера. Не остановился. Источник: docs.docker.com/storage/storagedriver Очень четкий ответ. - person chaiyachaiya; 28.04.2020