Лучшая практика - Анонимный том против bind mount - PullRequest
3 голосов
/ 19 октября 2019

В контейнере можно создать

анонимный том

с синтаксисом (VOLUME /build) в Dockerfile

или

ниже синтаксисас volumes, имеющим /build запись

cache:
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes:
    - /tmp/cache:/cache
    - /build
  entrypoint: "true"

Насколько я понимаю, оба подхода (см. выше) делают том /build также доступным после перехода контейнера в состояние Exited.

Том является анонимным, поскольку /build указывает на какое-то случайное новое местоположение (в каталоге /var/lib/docker/volumes) на хосте докера

Я вижу, что анонимные тома более безопасны, чем именованные тома (например, /tmp/cache:/cache).

Поскольку местоположение /tmp/cache уязвимо, поскольку существует большая вероятность того, что это местоположение используется более чем одним док-контейнером.


1)

Почему используется анонимный томне рекомендуется?

2)

Является ли

VOLUME /build in Dockerfile

не таким как

volumes: 
 - /build 

indocker-compose.yml файл? Есть ли сценарий, где мы должны упомянуть оба?

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Вам не хватает ключевого третьего варианта, именованных томов . Если вы объявите:

version: '3'
volumes:
  build: {}
services:
  cache:
    image: ...
    volumes:
      - build:/build

Docker Compose создаст именованный том для вас;Вы можете увидеть это, например, docker volume ls. Вы можете явно управлять временем жизни именованных томов и устанавливать для них несколько дополнительных параметров, которые иногда полезны. В документации Docker есть страница, описывающая именованные тома в некоторых деталях.

Я бы предположил, что именованные тома строго превосходят анонимные тома, поскольку они могут явно видеть, когда они создаются, иуничтожен, и для возможности установить дополнительные параметры для них. Вы также можете смонтировать одноименный том в несколько контейнеров. (В этой последовательности вопросов, которые вы задавали, я обычно рекомендовал бы вам использовать именованный том, смонтировать его в несколько контейнеров и заменить volumes_from:.)

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

Практически никогда не требуется директива VOLUME. Вы можете монтировать том или каталог хоста в контейнер независимо от того, объявлен ли он как том. Его технический эффект заключается в монтировании нового анонимного тома в этом месте, если там не установлено ничего другого;его практический эффект заключается в том, что он предотвращает изменение этого каталога в будущих шагах Dockerfile. Если у вас есть строка VOLUME, вы почти всегда можете удалить ее, ничего не затрагивая.

2 голосов
/ 19 октября 2019

На самом деле использование анонимных томов (/build) рекомендуется по сравнению с bind mounts (/tmp/cache:/cache):

Тома имеютнесколько преимуществ перед bind mounts:

  • Тома легче создавать резервные копии или переносить, чем bind mounts.
  • Вы можете управлять томами с помощью команд Docker CLI или Docker API.
  • Тома работают как с контейнерами Linux, так и с Windows.
  • Тома могут быть более безопасно разделены между несколькими контейнерами.
  • Драйверы томов позволяют хранить тома на удаленных хостах или облачных провайдерах для шифрования содержимого. томов или для добавления других функций.
  • Контент нового тома может быть предварительно заполнен контейнером.

По поводу вашего второго вопроса, да. Вы можете создавать анонимные тома в файле docker-compose или в файле Dockerfile. Не нужно указывать в обоих местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...