环境:ubuntu 16.04

Docker  17.04.0-ce

go 1.7.4

consoul v0.8.0.4

=======================================================================

一、项目准备

想必能搜到这篇文章的人对Hyperledger Fabric(以下简称Fabric)已经是有了一定的了解了,我就不多介绍了。

先说一下Fabric的构建环境:

Hyperledger Fabric  tag v1.0.0-alpha (Fabric 的主项目)

Hyperledger Fabric-sdk-node  branch v1.0.0-alpha(Fabric的js应用的sdk)

Hyperledger Fabric-ca branch v1.0.0-alpha(Fabric的权限管理项目)

两台主机,处于同一个网段。

这里要多说两句,我们从git hub 服务器(无论是github.com还自己搭建的服务器)上clone下来的工程一般默认是在master分支上的,所以我们下载下来上面三个工程后要记得切换分支,目前在我写这篇博文的时候已经是Fabric1.0已经推出三个版本了(alpha、alpha2、beta),我们用的是第一个发行版本v1.0.0-alpha。

说一下切换分支的方法,熟悉的人可以跳过:

第一种在克隆的时候指定分支

  1. git clone --branch <远程分支名> <源地址>

第二种是克隆后切换分支

git clone <源地址>

git checkout <远程分支名> #此时你的git仓库头指针是游离的,需要新建一个本地分支和远程绑定

git checkout -b <本地分支名> #绑定完成

ps:切换分支之前请保证本地的文件已经完全提交且与远程一致,否则会报错。

二、镜像获取

镜像的获取方式有很多种,不一定非要自己从源代码编译,你也可以从官网指定的地址去拉去镜像,或者直接执行 `docker pull` 命令。

如果想用源码编译镜像的话很简单,分别切换到$fabric、$fabric-ca下执行 ` make docker `

ps:这里友情提示以下,从源码编译最好是准备一个梯子,否则你会痛苦不堪,推荐直接拉取编译好的镜像。

参考地址:

三、环境搭建

现在开始讲最重要的部分,所有服务基于docker多机环境搭建绕不开一个问题:跨主机通信的。根据我在网上搜集来的信息可以将实现跨主机通讯的方法分为以下几种:

1> 本地共享:最直接的方式就是与主机共享网络资源,这种方式的弊端也很明显。

2> 物理桥接:将物理网卡桥接到docker的所依赖的虚拟网桥中,将ip地址限定为物理主机同一网段,这个方式跟1差不多。

3> swarm(docker或第三 提供的docker集成管理项目):简单来说就是将多主机纳入同一个docker manager下,将底层的资源调度分配与客户端部署隔离,主要是构建docker集群。Fabric社区中有一个kubernetes的讨论组,他们现在主要研究方向就是将云服务器与kubernetes相结合,部署一个“云区块链”,方便那些中小企业部署区块链方案,但是我个人认为这已经是跑偏了。区块链本身是一个去中心化的技术,如果完全托管到云上,岂不是一种变相的中心化?毕竟你所有的数据都在云服务商手中。

4>overlay network: swarm 中也应用到了overlay network 基于的是vxlan技术,就是在主机网络上在封装一层虚拟网络,达到将所有容器纳入同一网段的目的。而且它相比于直接的物理桥接有一个好处就是可以根据容器的host name来动态解析路由容器的ip,只要你容器host name不变,我们之间就能互联,从而实现了ip的动态分配。

其实用第三种方法更方便一些,因为我们要执行docker-compose.yml来部署环境,而在swarm二中可以通过 ‘docker stack deploy -c  <compose>.yml <name>'来一键完成傻瓜式部署,但是它有一个弊端,容器的到底部署在哪个节点是根据其调度算法来分配的,我们则是想要指定每一个节点安装的主机。

参考网址:http://www.sdnlab.com/7241.html

综上所述,我们最后采用了 docker-compose + overlay network 的方式来实现我们想要的分布式部署,我们先看一下 $fabric-sdk-node/test/fixtures目录下的 docker-compose.yaml

  1. version: '3'
  2.  
  3. services:
  4. ca0:
  5. image: hyperledger/fabric-ca
  6. environment:
  7. - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
  8. - FABRIC_CA_SERVER_CA_NAME=ca-org1
  9. - FABRIC_CA_SERVER_TLS_ENABLED=true
  10. - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/org1.example.com-cert.pem
  11. - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/a22daf356b2aab5792ea53e35f66fccef1d7f1aa2b3a2b92dbfbf96a448ea26a_sk
  12. ports:
  13. - "7054:7054"
  14. command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/a22daf356b2aab5792ea53e35f66fccef1d7f1aa2b3a2b92dbfbf96a448ea26a_sk -b admin:adminpw -d'
  15. volumes:
  16. - ./channel/crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
  17. container_name: ca_peerOrg1
  18. ca1:
  19. image: hyperledger/fabric-ca
  20. environment:
  21. - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
  22. - FABRIC_CA_SERVER_CA_NAME=ca-org2
  23. - FABRIC_CA_SERVER_TLS_ENABLED=true
  24. - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/org2.example.com-cert.pem
  25. - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/464d550fe9bf9e7d8976cdf59d1a5d472598f54c058c3546317c5c5fb0ddfd6e_sk
  26. ports:
  27. - "8054:7054"
  28. command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/464d550fe9bf9e7d8976cdf59d1a5d472598f54c058c3546317c5c5fb0ddfd6e_sk -b admin:adminpw -d'
  29. volumes:
  30. - ./channel/crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
  31. container_name: ca_peerOrg2
  32.  
  33. orderer.example.com:
  34. container_name: orderer.example.com
  35. image: hyperledger/fabric-orderer
  36. environment:
  37. - ORDERER_GENERAL_LOGLEVEL=debug
  38. - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
  39. - ORDERER_GENERAL_GENESISMETHOD=file
  40. - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/twoorgs.genesis.block
  41. - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
  42. - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp/orderer
  43. - ORDERER_GENERAL_TLS_ENABLED=true
  44. - ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/msp/orderer/keystore/e8a4fdaacf1ef1d925686f19f56eb558b6c71f0116d85916299fc1368de2d58a_sk
  45. - ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/msp/orderer/signcerts/orderer.example.com-cert.pem
  46. - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/msp/orderer/cacerts/example.com-cert.pem, /etc/hyperledger/msp/peerOrg1/cacerts/org1.example.com-cert.pem, /etc/hyperledger/msp/peerOrg2/cacerts/org2.example.com-cert.pem]
  47. working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderer
  48. command: orderer
  49. ports:
  50. - 7050:7050
  51. dns:
  52. - 8.8.8.8
  53. - 8.8.4.4
  54. volumes:
  55. - ./channel:/etc/hyperledger/configtx
  56. - ./channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/:/etc/hyperledger/msp/orderer
  57. - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/msp/peerOrg1
  58. - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/etc/hyperledger/msp/peerOrg2
  59.  
  60. peer0.org1.example.com:
  61. container_name: peer0.org1.example.com
  62. image: hyperledger/fabric-peer
  63. environment:
  64. - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
  65. - CORE_PEER_ID=peer0.org1.example.com
  66. - CORE_LOGGING_PEER=debug
  67. - CORE_PEER_LOCALMSPID=Org1MSP
  68. - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/
  69. - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
  70. - CORE_PEER_TLS_ENABLED=true
  71. - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/msp/peer/keystore/ecd9f80eb183352d5d4176eeb692e30bbfba4c38813ff9a0b6b799b546dda1d8_sk
  72. - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/msp/peer/signcerts/peer0.org1.example.com-cert.pem
  73. - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/msp/peer/cacerts/org1.example.com-cert.pem
  74. # # the following setting starts chaincode containers on the same
  75. # # bridge network as the peers
  76. # # https://docs.docker.com/compose/networking/
  77. - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fixtures_default
  78. - GOPATH=/tmp/gopath
  79. working_dir: /opt/gopath/src/github.com/hyperledger/fabric
  80. command: peer node start --peer-defaultchain=false
  81. ports:
  82. - 7051:7051
  83. - 7053:7053
  84. volumes:
  85. - ./src/github.com:/tmp/gopath/src/github.com
  86. - /var/run/:/host/var/run/
  87. - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/msp/peer
  88. depends_on:
  89. - orderer.example.com
  90.  
  91. peer0.org2.example.com:
  92. container_name: peer0.org2.example.com
  93. image: hyperledger/fabric-peer
  94. environment:
  95. - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
  96. - CORE_PEER_ID=peer0.org2.example.com
  97. - CORE_PEER_LOCALMSPID=Org2MSP
  98. - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/
  99. - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
  100. - CORE_PEER_TLS_ENABLED=true
  101. - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/msp/peer/keystore/81c71fd393054571c8d789f302a10390e0e83eb079b02a26a162ee26f02ff796_sk
  102. - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/msp/peer/signcerts/peer0.org2.example.com-cert.pem
  103. - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/msp/peer/cacerts/org2.example.com-cert.pem
  104. # # the following setting starts chaincode containers on the same
  105. # # bridge network as the peers
  106. # # https://docs.docker.com/compose/networking/
  107. - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fixtures_default
  108. - GOPATH=/tmp/gopath
  109. working_dir: /opt/gopath/src/github.com/hyperledger/fabric
  110. command: peer node start --peer-defaultchain=false
  111. ports:
  112. - 8051:7051
  113. - 8053:7053
  114. volumes:
  115. - ./src/github.com:/tmp/gopath/src/github.com
  116. - /var/run/:/host/var/run/
  117. - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/etc/hyperledger/msp/peer
  118. depends_on:
  119. - orderer.example.com
  120.  
  121. couchdb:
  122. container_name: couchdb
  123. image: hyperledger/fabric-couchdb
  124. ports:
  125. - 5984:5984
  126. environment:
  127. DB_URL: http://localhost:5984/member_db

它所部署Fabric 网络是一个单orderer的solo网络,结构如下:

  1. OrdererMsp
  2.  
  3.   |----- orderer.example.com (共识服务节点)
  4.  
  5. Org1MSP
  6.  
  7.   |-----peer0.org1.example.com (peer节点、Anchor节点)
  8.  
  9.   |-----ca0ca服务)
  10.  
  11. Org2MSP
  12.  
  13.   |-----peer0.org2.example.com
  14.  
  15.   |-----ca1
  16.  
  17. DB
  18.  
  19.  |---- couchdb(总帐存储)

为了能分布式部署其中有一些环境变量参数是需要我们进行修改的,至于怎么修改我们等下再说,先说一下构建overlay网络环境,我主要参考了Tony大神的一篇博客,只是因为环境不同有一些改动。

参考网址: http://tonybai.com/2016/02/15/understanding-docker-multi-host-networking/

1、创建consul 服务

考虑到kv store在本文并非关键,仅作跨多主机容器网络创建启动的前提条件之用,因此仅用包含一个server节点的”cluster”。

参照拓扑图,我们在上启动一个consul,关于consul集群以及服务注册、服务发现等细节可以参考我之前的一 篇文章

$consul agent -server -bootstrap-expect 1 -data-dir ./data -node=master -bind=10.10.126.101 -client=0.0.0.0 &

ps :这个consul解压出来之后就是一个二进制的执行文件,我们可以直接把它添加到$PATH路径下面

2、修改Docker Daemon DOCKER_OPTS参数

前面提到过,通过Docker 1.9创建跨多主机容器网络需要重新配置每个主机节点上的Docker Daemon的启动参数:

ubuntu系统这个配置在/lib/systemd/system/docker.service 下: ExecStart=/usr/bin/dockerd -H fd://

修改为ExecStart=/usr/bin/dockerd -H fd:// --dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 --cluster-advertise <物理网卡的名字,不一定是eth0>:2375 --cluster-store consul://10.10.126.101:8500/network --storage-driver=devicemapper

ps:注意有可能启动服务时候会失败,不要慌。这是因为我们平时默认--storage-driver使用的是aufs模式,当切换到devicemapper模式时可能会发生错误。

code bash:

sudo /usr/bin/dockerd --storage-driver=devicemapper #这时会显示错误的具体信息,其中大概的意思是不能rename一个文件,我们就假设它为 xxx

sudo apt-get install dmsteup

sudo dmsteup rm xxx #执行这个命令之前一定要备份镜像,因为这个命令执行完之后你会发现之前的镜像都不见了

或者

修改 ExecStart=/usr/bin/dockerd -H fd:// --dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 --cluster-advertise <物理网卡的名字,不一定是eth0>:2375 --cluster-store consul://10.10.126.101:8500/network --storage-driver=aufs

aufs 这时一个默认的docker的 --storage-driver,主要是用于docker容器和主机共享文件卷,它和devicemapper的具体区别还有带查证,但现在的Linux系统大部分支持aufs,所以没有切换的必要了。

这里多说几句:

-H(或–host)配置的是Docker client(包括本地和远程的client)与Docker Daemon的通信媒介,也是Docker REST api的服务端口。默认是/var/run/docker.sock(仅用于本地),当然也可以通过tcp协议通信以方便远程Client访问,就像上面 配置的那样。非加密网通信采用2375端口,而TLS加密连接则用2376端口。这两个端口已经申请在IANA注册并获批,变成了知名端口。-H可以配置多个,就像上面配置的那样。 unix socket便于本地docker client访问本地docker daemon;tcp端口则用于远程client访问。这样一来:docker pull ubuntu,走docker.sock;而docker -H 10.10.126.101:2375 pull ubuntu则走tcp socket。

–cluster-advertise 配置的是本Docker Daemon实例在cluster中的地址;
–cluster-store配置的是Cluster的分布式KV store的访问地址;

如果你之前手工修改过iptables的规则,建议重启Docker Daemon之前清理一下iptables规则:sudo iptables -t nat -F, sudo iptables -t filter -F等。

ps:为了图方便我直接把防火墙关了,另外我有一篇博客也说过直接修改/etc/default/docker不会生效。

3、启动各节点上的Docker Daemon

以10.10.126.101为例:

  1. $ sudo service docker start
  2. $ ps -ef|grep docker
  3. root 2069 1 0 Feb02 ? 00:01:41 /usr/bin/docker -d --dns 8.8.8.8 --dns 8.8.4.4 --storage-driver=devicemapper -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-advertise eth0:2375 --cluster-store consul://10.10.126.101:8500/network

启动后iptables的nat, filter规则与单机Docker网络初始情况并无二致。

  1. 101节点上初始网络driver类型:
  2. $docker network ls
  3. NETWORK ID NAME DRIVER
  4. 47e57d6fdfe8 bridge bridge
  5. 7c5715710e34 none null
  6. 19cc2d0d76f7 host host

4、创建overlay网络net1和net2

在101节点上,创建net1:

  1. $ sudo docker network create -d overlay net1

在71节点上,创建net2:

  1. $ sudo docker network create -d overlay net2

之后无论在71节点还是101节点,我们查看当前网络以及驱动类型都是如下结果:

  1. $ docker network ls
  2. NETWORK ID NAME DRIVER
  3. 283b96845cbe net2 overlay
  4. da3d1b5fcb8e net1 overlay
  5. 00733ecf5065 bridge bridge
  6. 71f3634bf562 none null
  7. 7ff8b1007c09 host host

此时,iptables规则也并无变化。

5、启动两个overlay net下的containers

我们分别在net1和net2下面启动两个container,每个节点上各种net1和net2的container各一个:

  1. 101:
  2. sudo docker run -itd --name net1c1 --net net1 ubuntu:14.04
  3. sudo docker run -itd --name net2c1 --net net2 ubuntu:14.04
  4. 71:
  5. sudo docker run -itd --name net1c2 --net net1 ubuntu:14.04
  6. sudo docker run -itd --name net2c2 --net net2 ubuntu:14.04

启动后,我们就得到如下网络信息(容器的ip地址可能与前面拓扑图中的不一致,每次容器启动ip地址都可能变化):

  1. net1:
  2. net1c1 - 10.0.0.7
  3. net1c2 - 10.0.0.5
  4. net2:
  5. net2c1 - 10.0.0.4
  6. net2c2 - 10.0.0.6

6、容器连通性

在net1c1中,我们来看看其到net1和net2的连通性:

  1. root@021f14bf3924:/# ping net1c2
  2. PING 10.0.0.5 (10.0.0.5) 56(84) bytes of data.
  3. 64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=0.670 ms
  4. 64 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=0.387 ms
  5. ^C
  6. --- 10.0.0.5 ping statistics ---
  7. 2 packets transmitted, 2 received, 0% packet loss, time 999ms
  8. rtt min/avg/max/mdev = 0.387/0.528/0.670/0.143 ms
  9. root@021f14bf3924:/# ping 10.0.0.4
  10. PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.
  11. ^C
  12. --- 10.0.0.4 ping statistics ---
  13. 2 packets transmitted, 0 received, 100% packet loss, time 1008ms

可见,net1中的容器是互通的,但net1和net2这两个overlay net之间是隔离的。

ps:这就是我们前面说的,overlay网络同网段下运行容器可以根据容器的host name 路由到目的容器.

如果你一路执行到这里说明你的overlay环境已经搭好了,那么我们说一下docker-compose.yaml应该如何修改:

1>将Fabric拆分为两个部分:

host1 (104)包含order、Org1、couchdb

host2 (121) 包含Org2

所以我将docker-compose.yaml也拆成了两个部分。

2>网络的设定:

我们之前会新建两个overlay网络net1、net2,为了省事我们就直接用net1作为指定的网络。如果我们不指定网络,docker-compose会默认生成一个brige网络<($dirname)_default>,这样是无法联通的。

3>参数修改:

CORE_VM_ENDPOINT= tcp://ip:port

fabric目前没有运行chain code 的虚拟机,当部署chain code时它会自动构建一个docker镜像,然后再以运行容器的方式来执行chain code。这个环境变量的作用救是在部署chain code时候,指定peer与docker后台服务通信地址.

CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=net1

指定peer的network

4>示例

host(104) :docer-compose-0.yaml

  1. version: '3'
  2.  
  3. services:
  4. ca0:
  5. container_name: ca_peerOrg1
  6. image: hyperledger/fabric-ca
  7. environment:
  8. - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
  9. - FABRIC_CA_SERVER_CA_NAME=ca-org1
  10. - FABRIC_CA_SERVER_TLS_ENABLED=true
  11. - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/org1.example.com-cert.pem
  12. - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/a22daf356b2aab5792ea53e35f66fccef1d7f1aa2b3a2b92dbfbf96a448ea26a_sk
  13. ports:
  14. - "7054:7054"
  15. command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/a22daf356b2aab5792ea53e35f66fccef1d7f1aa2b3a2b92dbfbf96a448ea26a_sk -b admin:adminpw -d'
  16. volumes:
  17. - ./channel/crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
  18. networks:
  19. - net1
  20. orderer.example.com:
  21. container_name: orderer.example.com
  22. image: hyperledger/fabric-orderer
  23. environment:
  24. - ORDERER_GENERAL_LOGLEVEL=debug
  25. - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
  26. - ORDERER_GENERAL_GENESISMETHOD=file
  27. - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/twoorgs.genesis.block
  28. - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
  29. - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp/orderer
  30. - ORDERER_GENERAL_TLS_ENABLED=true
  31. - ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/msp/orderer/keystore/e8a4fdaacf1ef1d925686f19f56eb558b6c71f0116d85916299fc1368de2d58a_sk
  32. - ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/msp/orderer/signcerts/orderer.example.com-cert.pem
  33. - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/msp/orderer/cacerts/example.com-cert.pem, /etc/hyperledger/msp/peerOrg1/cacerts/org1.example.com-cert.pem, /etc/hyperledger/msp/peerOrg2/cacerts/org2.example.com-cert.pem]
  34. working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderer
  35. command: orderer
  36. ports:
  37. - 7050:7050
  38. volumes:
  39. - ./channel:/etc/hyperledger/configtx
  40. - ./channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/:/etc/hyperledger/msp/orderer
  41. - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/msp/peerOrg1
  42. - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/etc/hyperledger/msp/peerOrg2
  43. networks:
  44. - net1
  45.  
  46. peer0.org1.example.com:
  47. container_name: peer0.org1.example.com
  48. image: hyperledger/fabric-peer
  49. environment:
  50. - CORE_VM_ENDPOINT=tcp://192.168.1.104:2375
  51. - CORE_PEER_ID=peer0.org1.example.com
  52. - CORE_LOGGING_PEER=debug
  53. - CORE_PEER_LOCALMSPID=Org1MSP
  54. - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/
  55. - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
  56. - CORE_PEER_TLS_ENABLED=true
  57. - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/msp/peer/keystore/ecd9f80eb183352d5d4176eeb692e30bbfba4c38813ff9a0b6b799b546dda1d8_sk
  58. - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/msp/peer/signcerts/peer0.org1.example.com-cert.pem
  59. - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/msp/peer/cacerts/org1.example.com-cert.pem
  60. # # the following setting starts chaincode containers on the same
  61. # # bridge network as the peers
  62. # # https://docs.docker.com/compose/networking/
  63. - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=net1
  64. working_dir: /opt/gopath/src/github.com/hyperledger/fabric
  65. command: peer node start --peer-defaultchain=false
  66. ports:
  67. - 7051:7051
  68. - 7053:7053
  69. volumes:
  70. - /var/run/:/host/var/run/
  71. - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/msp/peer
  72. depends_on:
  73. - orderer.example.com
  74. networks:
  75. - net1
  76.  
  77. couchdb:
  78. container_name: couchdb
  79. image: hyperledger/fabric-couchdb
  80. ports:
  81. - 5984:5984
  82. environment:
  83. DB_URL: http://localhost:5984/member_db
  84. networks:
  85. - net1
  86.  
  87. networks:
  88. net1:
  89. external: true #此网络由外部引用,无需创建

host(121) docker-compose-1.yaml

  1. version: '3'
  2.  
  3. services:
  4. ca1:
  5. image: hyperledger/fabric-ca
  6. environment:
  7. - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
  8. - FABRIC_CA_SERVER_CA_NAME=ca-org2
  9. - FABRIC_CA_SERVER_TLS_ENABLED=true
  10. - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/org2.example.com-cert.pem
  11. - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/464d550fe9bf9e7d8976cdf59d1a5d472598f54c058c3546317c5c5fb0ddfd6e_sk
  12. ports:
  13. - "7054:7054"
  14. command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/464d550fe9bf9e7d8976cdf59d1a5d472598f54c058c3546317c5c5fb0ddfd6e_sk -b admin:adminpw -d'
  15. volumes:
  16. - ./channel/crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
  17. container_name: ca_peerOrg2
  18. networks:
  19. - net1
  20. peer0.org2.example.com:
  21. container_name: peer0.org2.example.com
  22. image: hyperledger/fabric-peer
  23. environment:
  24. - CORE_VM_ENDPOINT=tcp://192.168.1.104:2375
  25. - CORE_PEER_ID=peer0.org2.example.com
  26. - CORE_PEER_LOCALMSPID=Org2MSP
  27. - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/
  28. - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
  29. - CORE_PEER_TLS_ENABLED=true
  30. - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/msp/peer/keystore/81c71fd393054571c8d789f302a10390e0e83eb079b02a26a162ee26f02ff796_sk
  31. - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/msp/peer/signcerts/peer0.org2.example.com-cert.pem
  32. - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/msp/peer/cacerts/org2.example.com-cert.pem
  33. # # the following setting starts chaincode containers on the same
  34. # # bridge network as the peers
  35. # # https://docs.docker.com/compose/networking/
  36. - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=net1
  37. - GOPATH=/tmp/gopath
  38. working_dir: /opt/gopath/src/github.com/hyperledger/fabric
  39. command: peer node start --peer-defaultchain=false
  40. ports:
  41. - 7051:7051
  42. - 7053:7053
  43. volumes:
  44. - ./src/github.com:/tmp/gopath/src/github.com
  45. - /var/run/:/host/var/run/
  46. - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/etc/hyperledger/msp/peer
  47. - ./channel:/etc/hyperledger/configtx
  48. networks:
  49. - net1
  50.  
  51. networks:
  52. net1:
  53. external: true

运行的时候先运行docker-compose-0.yaml:

  docker-compose -f docer-compose-0.yaml up --force-recreate

然后在另一台主机运行docker-compose-1.yaml

  docker-compose -f docer-compose-1.yaml up --force-recreate

运行后执行docker命令进入容器的bash界面

  docker exec -it <container> bash

ping 另一个主机上的容器验证是否联通,fabric的镜像里面是没有ping的 我们需要自己手动安装

  apt-get update

  apt-get install inetutils-ping

如果ping通了那么恭喜你,你已经完成了一半工程了,如果发现无法ping通也不要慌张,先关闭清理当前的容器 :

  docker-compose -f xx.yaml down

然后再清理一下没有被使用的docker网络(此时不要有docker 容器运行):

  docker network prune -f

清理之后重启fabric网络再试试。

基于docker的 Hyperledger Fabric 多机环境搭建(上)的更多相关文章

  1. 基于docker的 Hyperledger Fabric 多机环境搭建(下)

    Docker环境部署见上一篇博客:http://www.cnblogs.com/cnblogs-wangzhipeng/p/6994541.html. 我们部署分布式容器服务后就要在上面部署Fabri ...

  2. Hyperledger fabric 1.4 环境搭建(一)

    Hyperledger fabric 1.4 环境搭建(一) 1.更换下载源 更换apt的下载源,因为官方下载源很慢,需要更换到国内的镜像站 1.1.进入/etc/apt/目录 cd etc/apt ...

  3. Ubuntu下搭建Hyperledger Fabric v1.0环境

      多次尝试才正常启动了Fabric,如遇到各种莫名错误,请参考如下一步步严格安装,特别用户权限需要注意. 一.安装Ubuntu16 虚拟机或双系统,虚拟机有VirtualBox或者VMware,Ub ...

  4. jumpserver 堡垒机环境搭建

    jumpserver 堡垒机环境搭建(图文详解) https://blog.csdn.net/my_bai/article/details/62226474   http://docs.jumpser ...

  5. Linux基于Docker的Redis主从复制、哨兵模式搭建

    本教程基于CentOS7,开始本教程前,请确保您的Linux系统已安装Docker. 1.使用docker下载redis镜像 docker pull redis 安装完成后,使用docker imag ...

  6. 【转】jumpserver 堡垒机环境搭建(图文详解)

    jumpserver 堡垒机环境搭建(图文详解)   摘要: Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装ag ...

  7. 基于全志H3芯片的ARM开发环境搭建

    基于全志H3芯片的ARM开发环境搭建 最近买了个友善之臂的NanoPi M1板子,又在网上申请了个NanoPi NEO板子,这两个都是基于全志H3芯片的Crotex-A7四核ARM开发板,两个板子可以 ...

  8. ActiveMQ此例简单介绍基于docker的activemq安装与集群搭建

    ActiveMQ拓展连接 此例简单介绍基于Docker的activemq安装与集群搭建 一 :安装 1.获取activemq镜像 docker pull webcenter/activemq 2.启动 ...

  9. Windows系统appium移动端自动化真机环境搭建

    appium-windows-android环境搭建完成以后,就可以进行真机模式下的appium环境搭建啦!! 准备:把要测试的app下载至本机(小波的是把apk放在桌面上,例如:C:\Users\w ...

随机推荐

  1. 2017年4月 TIOBE 编程语言排名

    2017年4月 TIOBE 编程语言排名 Hack是Facebook 在三年推出的PHP方言,在2017年4月首次进入TIOBE编程语言排行榜前50位. Hack原是Facebook的内部项目,与20 ...

  2. js日期转化(计算一周的日期)

    之前做项目的时候遇到过一个日期转化的问题,一个日期控件和近一天,近七天和近一月的的联动效果.发现自己不会,后来就百度了一下解决了这个问题. 现在抽空又写了一个时间转化的案例(计算一周的日期),因为之前 ...

  3. 简谈-Python的输入、输出、运算符、数据类型转换

    输出: 格式化输出: 看到了 % 这样的操作符,这就是Python中格式化输出. 换行输出: 在输出的时候,如果有 \n 那么,此时 \n 后的内容会在另外一行显示 输入: 在python2.7当中, ...

  4. bootstrap快速入门笔记(七)-表格,表单

    一,表格 1,<table>中加.table类 2,条纹表格:通过 .table-striped 类可以给 <tbody> 之内的每一行增加斑马条纹样式. **跨浏览器兼容性: ...

  5. 界面底部Tab实现

    现在基本上大部分的手机APP都要实现底部Tab,底部实现Tab的实现方式有很多种,那么有没有好的实现方式呢? 今天我将使用一个开源插件来实现底部Tab 参考自zhangli_的博客:http://bl ...

  6. 做一个常规的banner图——负边距的使用、banner图的拼法

    在这之前,首先要了解如何设置块级元素在块级元素水平居中 方法: 设置子容器为定位元素 水平居中 left:50%:margin-left:-width/2: 垂直居中 top:50%:margin-t ...

  7. arcgis for javascript 之 clone()问题小计

    情景再现:      用户点击一个featurelayer的图斑,(属性信息从mysql中获取),同时高亮此地块,点击一下个地块时候,取消高亮.(请忽略跨域造成的图标错误,jetty试了好久不能跨域· ...

  8. 【css笔记】css中的盒模型和三种定位机制(固定定位,绝对定位,浮动)

    html页面上的元素都可以看成是框组成的,框通过三种定位机制排列在一起就过程了我们看到的页面.而框就是盒模型. 盒模型 1.页面上的每个元素可以看成一个矩形框,每个框由元素的内容,内边距,边框和外边距 ...

  9. 宝爷Debug小记——Cocos2d-x(3.13之前的版本)底层BUG导致Spine渲染花屏

    最近在工作中碰到不少棘手的BUG,其中的一个是Spine骨骼的渲染花屏,在战斗中派发出大量士兵之后有概率出现花屏闪烁(如下图所示),这种莫名奇妙且难以重现的BUG最为蛋疼.   前段时间为了提高Spi ...

  10. druid抛出的异常------javax.management.InstanceAlreadyExistsException引发的一系列探索

    最近项目中有个定时任务的需求,定时检查mysql数据与etcd数据的一致性,具体实现细节就不说了,今天要说的就是实现过程中遇到了druid抛出的异常,以及解决的过程 异常 异常详细信息 五月 05, ...