Как синхронизировать записи из нескольких контейнеров в один и тот же том в рое?

Безопасно ли / возможно ли использовать flock в рой докеров?

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

Если у меня есть несколько экземпляров одного и того же образа в службе, и все они совместно используют том, то, когда я запускаю это в рое, будут ли контейнеры запускаться на разных хостах? Если да, то как будет совместно использоваться том на уровне ОС? Какие параметры синхронизации у меня есть для управления одновременными операциями записи?


person Philip Couling    schedule 07.10.2020    source источник
comment
Вы должны выводить свои данные в том, поддерживаемый NFS, который доступен для всех узлов кластера swarm и управляет доступом к диску. Bind-mounts не синхронизируются между узлами.   -  person masseyb    schedule 07.10.2020


Ответы (2)


Создайте том NFS

Пример:

  # create a reusable volume
  $ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=192.168.1.1,rw \
      --opt device=:/path/to/dir \
      foo

  # inside a docker-compose file
  ...
  volumes:
    nfs-data:
      driver: local
      driver_opts:
        type: nfs
        o: nfsvers=4,addr=192.168.1.1,rw
        device: ":/path/to/dir"
person Bilal Ali Jafri    schedule 07.10.2020
comment
Я немного смущен этим ответом. Вопрос касался синхронизации и поведения Docker. В этом контексте этот ответ ничего не говорит о синхронизации или поведении Docker (по умолчанию?). - person Philip Couling; 07.10.2020
comment
@PhilipCouling это начало (не хватает подробностей), но, по сути, вы задаете 2 вопроса: (1) как тома могут быть разделены между узлами swarm и (2) параметры синхронизации для одновременной записи — адреса NFS совместно используют тома между узлами и реализует близкую к открытой согласованность. - person masseyb; 07.10.2020
comment
@masseyb нет, я не спрашиваю, как этим можно поделиться. Это вообще не мой вопрос. Мой первый вопрос, что произойдет, если... они действительно будут запущены на разных хостах? И, чтобы быть ясным, я не спрашивал о монтировании привязки (достаточно запутанно). Я спрашивал о простых томах. - person Philip Couling; 07.10.2020
comment
@PhilipCouling хорошо, должно быть, неправильно понял, что я запускаю это на рое, будут ли контейнеры запускаться на отдельных хостах? Если да, то как будет совместно использоваться том на уровне ОС? - да они будут запускаться на отдельных хостах. Простые тома связаны с подключением, и том создается на любом хосте, на котором находится контейнер. docker тома НЕ синхронизируются между узлами. Действительно запутанно. Если вам нужен доступ к одному и тому же тому на нескольких узлах, вы можете использовать NFS. - person masseyb; 07.10.2020
comment
@PhilipCouling Я ищу безопасный способ для нескольких контейнеров записывать в один и тот же файл (на одном томе) в рое докеров - пожалуйста, уточните свой вопрос, если вы на самом деле не ищете способ синхронизировать одновременную запись в один и тот же том в docker swarm. Простое упоминание о swarm и том же томе подразумевает, что вам понадобится общий том между узлами swarm, и существует очень много способов сделать это, и простые тома docker с привязкой не являются одним из них. - person masseyb; 07.10.2020
comment
@masseyb это нормально, ответ становится все более структурной проблемой. Основываясь на ваших комментариях, ответ состоит из трех частей: 1) объяснение ваших комментариев выше 2) объяснение того, как обойти это ограничение, это ответ. 3) обсуждение вариантов синхронизации по NFS. - person Philip Couling; 07.10.2020
comment
@PhilipCouling позвольте мне попытаться обобщить все это в ответе. - person masseyb; 07.10.2020

docker volumes являются локальными для узла, на котором они созданы, они не являются общими для docker swarm узлов.

При работе в многоузловом кластере swarm (или в Kubernetes) контейнер может оказаться на любом из узлов внутри кластер. Для совместного доступа к docker volume (или PVC в случае Kubernetes) том должен поддерживаться чем-то вроде сетевой файловой системы, к которой можно получить доступ с каждого из узлов внутри кластера.

NFS версии 4 реализует согласованность "близко к открытию". Полная информация о том, что реализовано в NFS v4, доступна в версии 9.3. Кэширование данных RFC 3530:

Резервирование ресурсов и блокировка записей — это средства протокола NFS версии 4, которые позволяют приложениям координировать доступ, предоставляя средства взаимного исключения.

Совет: имена docker volumes являются bind- монтируется, тома создаются на диске (по умолчанию) в /var/lib/docker/volumes и монтируются при помощи привязки во время docker run -v <named_docker_volume>:<container_mount_path> ....

person masseyb    schedule 07.10.2020