Docker Volumes - Создать параметры (Драйвер) - PullRequest
0 голосов
/ 03 августа 2020

Описание

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

Много чего неясно, но этот вопрос Я просто хочу настроить таргетинг на следующие:

При запуске docker volume create:

- driver --opt device --opt type

Когда я запускаю docker volume create --driver local --opt device=:/var/www/html/app --opt type=volume volumename Я действительно получить том:

  $docker volume inspect customvolume`
  [
  {
    "CreatedAt": "2020-08-03T09:28:10Z",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/customvolume/_data",
    "Name": "customvolume",
    "Options": {
        "device": ":/var/www/html/customfolder",
        "type": "volume"
    },
    "Scope": "local"
}

]

Попытка смонтировать этот новый том:

 docker run --name test-with-volume \ 
    --mount source=customvolume,target=/var/www/html/app77' \ 
    my-app-only:latest

Ошибка:

     Error response from daemon: error while mounting
     volume '/var/lib/docker/volumes/customvolume/_data': failed to 
    mount local volume: mount     :/var/www/html/customfolder:/var/lib/docker/volumes/customvolume/_data: no such device.

Вопросы

Очевидно, что параметры позволяют делать некоторые неожиданные вещи, мне удалось создать том volume в произвольном месте, но он не монтируется.

  • Что это варианты для type (с объяснением разницы в каждом): при использовании docker volume create они мне непонятны. docker run --mount документация говорит о volume, bind, tmp, но на docker volume create они показывают только примеры, а именно tmpfs, btrfs, nfs .

  • Когда можно использовать device? Я думал, что это можно использовать для создания настраиваемого местоположения для типа тома (также известного как тома) на исходном хосте (аналогично тому, как могут быть смонтированы привязки) Я предположил, что могу используйте «рекомендуемый способ именованных томов, включая расположение настраиваемой папки» вместо монтирования хоста (bind-mounts).

  • Наконец, как вы могли настроить docker -compose.yml

Я думаю, что путаница заключается в том, что docker run --mount vs docker volume create кажутся несовместимыми из-за того, насколько неясно Docker качество документации

Ответы [ 3 ]

1 голос
/ 30 августа 2020

Недавно я искал нечто подобное: как заставить том docker записывать свои данные по настраиваемому пути, который на самом деле является точкой монтирования постоянного диска. Было 2 мотива:

  1. во-первых, избегать того, чтобы том docker застрял внутри дискового пространства образа виртуальной машины.
  2. во-вторых, чтобы данные пережили сам том docker ( например, легко повторно использовать на другом экземпляре виртуальной машины и только что созданном docker томе).

Это казалось возможным, если передать дополнительные параметры стандартному local драйверу при выполнении docker volume create. Например, приведенная ниже команда заставляет docker volume tmp-volume записывать в значение аргумента устройства. Обратите внимание, что docker volume inspect по-прежнему выводит совершенно другой, но неиспользуемый MountPoint. Это работало, когда Ubuntu была основной ОС внутри этого экземпляра виртуальной машины:

docker volume create -d local  --name tmp-volume\
    --opt device="/mnt/disks/disk-instance-test-volume" \
    --opt type="none" \
    --opt o="bind"

Может быть, это совпадает с вашим вариантом использования? Я написал всю историю здесь более подробно: https://medium.com/@francis.meyvis / how-to-force-a- docker -volume-on-a-gce-disk-45b59d4973e? Source = friends_link & sk = 0e71ef39db84f4cb0ecccc7cd0f3c254

1 голос
/ 03 августа 2020

Есть две основные категории данных - постоянные и непостоянные.

Постоянные - это данные, которые вам необходимо сохранить. Вещи как; записи клиентов, финансовые данные, результаты исследований, журналы аудита и даже некоторые типы данных журнала приложений. Непостоянные - это данные, которые вам не нужно хранить.

Оба важны, и Docker предлагает решения для обоих. Для работы с непостоянными данными каждый контейнер Docker получает собственное непостоянное хранилище. Он автоматически создается для каждого контейнера и тесно связан с жизненным циклом контейнера. В результате при удалении контейнера будет удалено хранилище и все данные на нем. Чтобы иметь дело с постоянными данными, контейнер должен хранить их в томе. Тома - это отдельные объекты, жизненные циклы которых отделены от контейнеров. Это означает, что вы можете создавать тома и управлять ими независимо, и они не привязаны к жизненному циклу какого-либо контейнера. Net результат, вы можете удалить контейнер, который использует том, и этот том не будет удален.

Этот доступный для записи уровень локального хранилища управляется на каждом Docker хосте драйвером хранилища (не путать с драйвером громкости). Если вы используете Docker в производственной среде на Linux, вам необходимо убедиться, что вы сопоставили правильный драйвер хранилища с дистрибутивом Linux на вашем Docker хосте. Используйте следующий список в качестве руководства:

  • Red Hat Enterprise Linux: используйте драйвер overlay2 с современными версиями RHEL, работающими под управлением Docker 17.06 или выше. Используйте драйвер devicemapper со старыми версиями. Это относится к Oracle Linux и другим исходящим и исходящим дистрибутивам, связанным с Red Hat.

  • Ubuntu: используйте драйверы overlay2 или aufs. Если вы используете ядро ​​Linux 4.x или выше, вам следует go с overlay2.

  • SUSE Linux Enterprise Server: используйте драйвер хранилища btrfs.

  • Windows Windows имеет только один драйвер, и он настроен по умолчанию.

По умолчанию Docker создает новые тома с встроенный локальный драйвер. Как следует из названия, тома, созданные с помощью локального драйвера, доступны только контейнерам на том же узле, что и том. Вы можете использовать флаг -d, чтобы указать другой драйвер. Сторонние драйверы громкости доступны как плагины. Они обеспечивают Docker беспрепятственный доступ к внешним системам хранения, таким как облачные сервисы хранения и локальные системы хранения, включая SAN или NAS.

$ docker volume inspect myvol
[
{
"CreatedAt": "2020-05-02T17:44:34Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvol/_data",
"Name": "myvol",
"Options": {},
"Scope": "local"
}
]

Обратите внимание, что драйвер и область действия являются локальными. Это означает, что том был создан с помощью локального драйвера и доступен только контейнерам на этом хосте Docker. Свойство Mountpoint сообщает нам, где в файловой системе хоста Docker находится том.

С монтированием привязки

version: '3.7'
services:
   maria_db:
    image: mariadb:10.4.13
    environment:
      MYSQL_ROOT_PASSWORD: Test123@123
      MYSQL_DATABASE: database
    ports:
      - 3306:3306
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data_mariadb/:/var/lib/mysql/  

С монтированием тома

version: "3.8"
services:
  web:
    image: mariadb:10.4.13
    volumes:
      - type: volume
        source: dbdata
        target: /var/lib/mysql/ 

volumes:
  dbdata:  

Объяснение креплений-привязок

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

tmpfs монтирует объяснение

Тома и привязки монтирования позволяют вам обмениваться файлами между хост-машиной и контейнером, так что вы можете сохранять данные даже после остановки контейнера. Если вы используете Docker на Linux, у вас есть третий вариант: tmpfs mounts. Когда вы создаете контейнер с монтированием tmpfs, контейнер может создавать файлы за пределами доступного для записи уровня контейнера. В отличие от томов и привязок, монтирование tmpfs является временным и сохраняется только в памяти хоста. Когда контейнер останавливается, монтирование tmpfs удаляется, и файлы, записанные в него, не сохраняются.

Объяснение тома

Тома являются предпочтительным механизмом для хранения данных, созданных и используемых контейнерами Docker. В то время как привязка монтирования зависит от структуры каталогов на хост-машине, тома полностью управляются Docker.

0 голосов
/ 04 августа 2020

Подробное объяснение Дамита об именованных томах и привязках - хорошая ссылка для чтения для всех. Чтобы ответить на мой вопрос, он рассказал о сторонних плагинах , поэтому мне пришлось продолжить расследование.

Кажется, нет возможности использовать настраиваемое местоположение при использовании именованного тома (только bind-mounts могут) с установкой по умолчанию Docker, но действительно существует плагин, который действует аналогично named-volume , но с некоторыми дополнительными функциями.

Хотя это лишь частично отвечает на некоторые из вещей, которые я упомянул в вопросе (и до сих пор не совсем понимаю), используйте его для справки, если вы хотите использовать named-volume acting like bind-mounts

Решение

Для моего конкретного случая использования плагин Docker local-persist, кажется, удовлетворяет мои требования, он имеет возможность 1) сохранять данные при удалении контейнеров и 2) позволяют использовать произвольное расположение .

Matchbooklab Docker local-persist

Установка:

Подтверждена работа с установкой Ubuntu 20.04 * 103 7 *

Это установит и настроит сценарий запуска для local-persist для мониторинга томов.

Установочный том

  • Создайте новый локально-постоянный том:

    docker volume create -d local-persist --opt mountpoint=/custom/path/on/host --name new-volume-name
    

Использование

  • Присоединение тома к контейнеру:

Новый синтаксис --mount:

   docker run --name container-name --mount 'source=new-volume-name,target=/path/inside/container'

-v синтаксис: (не тестировался - как показано в readme github)

   docker run -d -v images:/path/inside/container/ imagename:version
  • Или с docker -compose.yml: (пример показывает v2; еще не тестировался)

    version: '2'
    
    services:
      one:
        image: alpine
        working_dir: /one/
        command: sleep 600
        volumes:
          - data:/one/
    
      two:
        image: alpine
        working_dir: /two/
        command: sleep 600
        volumes:
          - data:/two/
    
    volumes:
      data:
        driver: local-persist
        driver_opts:
          mountpoint: /data/local-persist/data
    
...