docker swarm和命名卷存在问题

时间:2019-04-09 12:48:42

标签: docker digital-ocean docker-swarm bitcoin docker-volume

在我的一个Docker堆栈中使用命名卷时遇到一些问题。

基本上,我正在运行bcoin开发的比特币节点。我要实现的目标是让运行节点的容器从附着到我的一个液滴(VM)上的Digital Ocean卷中写入和读取区块链数据。我猜我遇到了一些问题,因为我通常仅以一种方式使用卷,即主机中的内容存在于容器中。

此DO卷存在于我的管理器节点(或Droplet)中的目录/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 个答案:

答案 0 :(得分:1)

有多种方法可以实现您的目标,尤其是在蜂群环境中。 首先,假设docker不会在群集之间同步卷,除非您使用合适的驱动程序。 因此,根据您需要读/写还是只读,您必须使用驱动程序或其他解决方案!

以下是一些想法(不是所有解决方案!):

  • 您可以通过示例NFS在托管节点的计算机之间安装共享驱动器。确保将它们安装在所有主机上的相同路径上。然后,只需将路径绑定到容器/ data。虽然,这不是最简单的方法。但是,如果需要R / W选项,这是一个合适的解决方案。但是,请注意,该解决方案可以看作是引入了SPOOF,在生产环境中并没有那么大。
  • 您也可以使用命名卷,但是在分布式环境中,您将必须使用卷驱动程序才能对其进行同步。 Docker文档具有a few exemples。您有一个音量插件列表here。根据您选择的一种,可以消除SPOOF问题。
  • 最终,如果不需要r / w的可能性,则可以使用群体模式使用secrets / configs。特别是secrets显然适合您这样的敏感数据。

希望这会有所帮助!