Проблема с роем докеров и именованными томами - PullRequest
0 голосов
/ 09 апреля 2019

У меня проблемы с использованием именованных томов в одном из моих стеков докеров.

В основном я использую биткойн-узел, разработанный bcoin. Я пытаюсь добиться того, чтобы контейнеры, на которых выполнялись узлы, записывали и считывали данные блокчейна с тома Digital Ocean, подключенного к одной из моих капель (ВМ). Я предполагаю, что у меня возникли некоторые проблемы, потому что я обычно использую тома только в одном направлении, когда в моих контейнерах присутствуют вещи на моей хост-машине.

Этот том DO присутствует в каталоге /mnt/blockchain-data в моем узле диспетчера (или дроплете).

Итак, вот мой файл docker-stack.yml:

version: "3.6"
services:
  bcoin:
    image: hollarves/bcoin-mueve
    ports:
      #-- Mainnet
      # - "8333:8333"
      # - "8332:8332" # RPC/HTTP
      # - "8334:8334" # Wallet
      #-- Testnet
      - "18333:18333"
      - "18332:18332" # RPC/HTTP
      - "18334:18334"
    networks:
      - bitcoin-private-net
    volumes:
      - blockchain:/data
      - ${PWD}/bitcoin/secrets/bcoin.conf:/data/bcoin.conf
      - ${PWD}/bitcoin/secrets/wallet.conf:/data/wallet.conf
    environment:
      BCOIN_CONFIG: /data/bcoin.conf
    deploy:
      labels:
        - "traefik.docker.network=bitcoin-net"
        - "traefik.bcoin.frontend.rule=Host:bcoin.xxxx.com"
        - "traefik.bcoin.backend=bcoin"
        - "traefik.bcoin.port=18332"
        - "traefik.bcoin.frontend.entryPoints=http"
        - "traefik.bcoin-wallet.frontend.rule=Host:bcoin-wallet.xxxx.com"
        - "traefik.bcoin-wallet.backend=bcoin-wallet"
        - "traefik.bcoin-wallet.port=18334"
        - "traefik.bcoin-wallet.frontend.entryPoints=http"
      placement:
        constraints:
          - node.role == manager

volumes:
  blockchain:
    driver: local
    driver_opts:
      type: bind
      device: :/mnt/blockchain-data

networks:
  bitcoin-private-net:
    external: true

Итак, я хочу, чтобы все, что находится в каталоге /data моих контейнеров, было синхронизировано с тем, что находится в моем /mnt/blockchain-data на моей хост-машине. Если контейнер записывает несколько новых блоков, они должны быть скопированы в каталог /mnt/blockchain-data, а если реплицируется новый биткойн-узел, у него уже должен быть каталог данных, синхронизированный с файлами на моем хост-компьютере.

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

Есть идеи, что я могу делать не так? Спасибо!

1 Ответ

1 голос
/ 09 апреля 2019

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

Вот несколько идей (не все решения!):

  • Вы можете смонтировать общий диск среди машин, на которых размещены ваши узлы, например NFS .Убедитесь, что они установлены по одному пути на всех хостах.Затем просто связать путь к контейнеру / данным.Хотя это не самый простой способ.Но если вам нужны опции R / W, это подходящее решение.Однако обратите внимание, что это решение можно рассматривать как введение SPOOF , что не так уж хорошо в производственной среде.
  • вы также можете использовать именованный том, но в распределенной среде выпридется использовать драйвер громкости, чтобы иметь возможность их синхронизировать.Докер док имеет несколько примеров .У вас есть список настроек громкости здесь .В зависимости от того, какой из них вы выберете, вы можете устранить проблему SPOOF.
  • В конце концов, если вам не нужны ч / б возможности, режим роя позволит вам использовать секреты / конфиги .Особенно, секреты явно подходят для таких конфиденциальных данных, как ваша.

Надеюсь, это поможет!

...