Directorio de artículos
Obviamente, la diferencia entre la implementación de una sola máquina y la de múltiples máquinas es la configuración de la red, es decir, cómo comunicarse entre los contenedores acoplables, por lo que la clave para la implementación de múltiples máquinas es en realidad la comunicación de la red acoplable.
Instalar HLF
Cinco servidores, el sistema es Ubuntu16.04, el certificado ssh se ha configurado para iniciar sesión, suponiendo que la IP es respectivamente
10.22.1.12 # orderer.example.com, cli
10.22.1.13 # peer0.org1.example.com
10.22.1.14 # peer1.org1.example.com
10.22.1.15 # peer0.org2.example.com
10.22.1.16 # peer1.org2.example.com
Si no hay instrucciones especiales, los siguientes comandos se ejecutan en 10.22.1.12
el /home/myuser/
directorio de la máquina .
Cree un host.txt
archivo para facilitar la modificación dinámica y la implementación en otras máquinas:
vim hosts.txt
10.22.1.12 # orderer.example.com, cli
10.22.1.13 # peer0.org1.example.com
10.22.1.14 # peer1.org1.example.com
10.22.1.15 # peer0.org2.example.com
10.22.1.16 # peer1.org2.example.com
Instale el script de curl, docker, docker-composer, imagen HLF (versión 1.3, si necesita reemplazar el número de versión en el script por otras versiones) install.sh
, necesita la contraseña de usuario como primer parámetro:
#!/bin/bash
if [ $# -eq 0 ]; then
echo "please input password..."
exit 1
fi
cat hosts.txt | while read host
do
echo ' '
echo ' '
echo ' '
echo '################################'
echo '##########' $host '##########'
echo '################################'
echo ' '
echo ' '
echo ' '
ssh myuser@$host << end
echo $1 | sudo apt install curl -y
sudo -S apt-get remove docker docker-engine docker.io containerd runc -y
docker -v
sudo apt-get update -y
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common -y
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
sudo apt-get update -y
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
docker run hello-world
docker -v
if [ $? -ne 0 ]; then
echo "##################################################"
echo "some wrong when install docker!"
echo "##################################################"
exit 1
fi
echo $1 | sudo -S curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo rm /usr/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose -v
if [ $? -ne 0 ]; then
echo "##################################################"
echo "some wrong when install docker-compose!"
echo "##################################################"
exit 1
fi
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.3.0
if [ $? -ne 0 ]; then
echo "##################################################"
echo "some wrong when pull the images"
echo "##################################################"
exit 1
fi
end
done
echo done!
Si no hay ningún accidente aquí, incluso si está configurado, puede ir al /home/myuser/fabric-samples/first-network/
directorio para probar si la instalación se realizó correctamente:
inicie la red:
./byfn.sh up
Si ve el siguiente resultado, la instalación se realizó correctamente:
90
===================== Query successful on peer1.org2 on channel 'mychannel' =====================
========= All GOOD, BYFN execution completed ===========
_____ _ _ ____
| ____| | \ | | | _ \
| _| | \| | | | | |
| |___ | |\ | | |_| |
|_____| |_| \_| |____/
Apague y limpie la red (recuerde limpiar antes de reiniciar la red; de lo contrario, se informará un error):
./byfn.sh down
Configurar la red de Docker
Se dice que se puede
host
implementar usando el modo, que es mucho más simple, pero cuando uso el modo host, siempre informo un error al crear instancias del chaincode. No encontré una solución, así que usé eloverlay
modo.
docker swarm init --advertise-addr=10.22.1.12 # 在10.22.1.12上初始化swarm
docker swarm join-token manager # 这里会输出一个命令docker swarm join --token ... ,复制下来,去其他机器上执行
ssh [email protected]
docker swarm join --token ...
ssh [email protected]
docker swarm join --token ...
ssh [email protected]
docker swarm join --token ...
ssh [email protected]
docker swarm join --token ...
# 回到10.22.1.12
docker network create --attachable --driver overlay HLF # 创建一个overlay网络
En este momento, verifique la red de acopladores docker network ls
, será así:
NETWORK ID NAME DRIVER SCOPE
ntubodu3k0fp HLF overlay swarm
31158df52877 bridge bridge local
54ad61772123 docker_gwbridge bridge local
d8b38ea6fbed host host local
rlzokyfpla8r ingress overlay swarm
e97a070185d2 none null local
Lo mismo es cierto en otras máquinas, se crean automáticamente.
Crea un archivo de inicio
/home/myuser/fabric-samples/first-network
Hay un docker-compose-cli.yaml
archivo en el directorio , que se modifica principalmente de acuerdo con este archivo.
Divida este archivo en cinco, uno contiene el orden y el cli, y los otros cuatro son cuatro pares.
.
├── base
│ ├── docker-compose-base.yaml
│ └── peer-base.yaml
├── docker-compose-cli.yaml
├── orderer_cli.yaml
├── peer01.yaml
├── peer02.yaml
├── peer11.yaml
└── peer12.yaml
La modificación principal es modificar la red a la red HLF que creamos anteriormente, pero debe prestar atención a especificar externo como verdadero, de lo contrario, Docker recreará automáticamente una red. Aquí están todos los archivos:
orderer_cli.yaml:
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
orderer.example.com:
networks:
HLF:
external: true ## important!!!!!
services:
orderer.example.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.example.com
container_name: orderer.example.com
#network_mode: overlay
networks:
- HLF
# extra_hosts:
# - "orderer.example.com:10.22.1.12"
# - "peer0.org1.example.com:10.22.1.13"
# - "peer1.org1.example.com:10.22.1.14"
# - "peer0.org2.example.com:10.22.1.15"
# - "peer1.org2.example.com:10.22.1.16"
cli:
container_name: cli
image: hyperledger/fabric-tools:$IMAGE_TAG
tty: true
stdin_open: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
#- CORE_LOGGING_LEVEL=DEBUG
- CORE_LOGGING_LEVEL=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /var/run/:/host/var/run/
- ./../chaincode/:/opt/gopath/src/github.com/chaincode
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
networks:
- HLF
# extra_hosts:
# - "orderer.example.com:10.22.1.12"
# - "peer0.org1.example.com:10.22.1.13"
# - "peer1.org1.example.com:10.22.1.14"
# - "peer0.org2.example.com:10.22.1.15"
# - "peer1.org2.example.com:10.22.1.16"
peer01.yaml:
# Copyright IBM Corp. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
peer0.org1.example.com:
networks:
HLF:
external: true
services:
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org1.example.com
#network_mode: overlay
#networks:
# - byfn
networks:
- HLF
peer02.yaml:
# Copyright IBM Corp. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
peer0.org1.example.com:
networks:
HLF:
external: true
services:
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org1.example.com
#network_mode: overlay
#networks:
# - byfn
networks:
- HLF
peer11.yaml:
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
peer0.org2.example.com:
networks:
HLF:
external: true
services:
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org2.example.com
#network_mode: overlay
#networks:
# - byfn
networks:
- HLF
# extra_hosts:
# - "orderer.example.com:10.22.1.12"
# - "peer0.org1.example.com:10.22.1.13"
# - "peer1.org1.example.com:10.22.1.14"
# - "peer0.org2.example.com:10.22.1.15"
# - "peer1.org2.example.com:10.22.1.16"
peer12.yaml:
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
version: '2'
volumes:
peer1.org2.example.com:
networks:
HLF:
external: true
services:
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: base/docker-compose-base.yaml
service: peer1.org2.example.com
#network_mode: overlay
# networks:
# - byfn
networks:
- HLF
# extra_hosts:
# - "orderer.example.com:10.22.1.12"
# - "peer0.org1.example.com:10.22.1.13"
# - "peer1.org1.example.com:10.22.1.14"
# - "peer0.org2.example.com:10.22.1.15"
# - "peer1.org2.example.com:10.22.1.16"
Además /home/myuser/fabric-samples/first-network
, se deben modificar dos archivos en el directorio:
base
├── docker-compose-base.yaml
└── peer-base.yaml
La - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn
modificación en peer-base.yaml es - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=HLF
.
Parte de mapeo de puertos en docker-compose-base.yaml:
- 7051:7051
- 7053:7053
- 8051:7051
- 8053:7053
- 9051:7051
- 9053:7053
- 10051:7051
- 10053:7053
Modificado a
- 7051:7051
- 7053:7053
- 7051:7051
- 7053:7053
- 7051:7051
- 7053:7053
- 7051:7051
- 7053:7053
Esta modificación está completa.
En este momento, puede consultar el comando del sitio web oficial para generar el archivo de certificado y el archivo de configuración del canal. El script es el siguiente:
#!/bin/zsh
cd /home/myuser/fabric-samples/first-network
# clear the old X.509
rm -rf crypto-config
rm -rf channel-artifacts/*
# generate X.509 using the default configuration
cryptogen generate --config=crypto-config.yaml
# tell the tool where to look for the configtx.yaml
export FABRIC_CFG_PATH=$PWD
export CHANNEL_NAME=mychannel
# create the orderer genesisi block
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block #-channelID $CHANNEL_NAME
# create a channel configuration transaction
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
# define the anchor peer for Org1
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
# define the anchor peer for Org2
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
Transfiera los archivos y certificados modificados de 7 yaml crypto-config
a la máquina correspondiente a través de scp a la ubicación correspondiente
Corriendo
Iniciar script:./run.sh
#!/bin/bash
peer01=10.22.1.13
peer11=10.22.1.14
peer02=10.22.1.15
peer12=10.22.1.16
cd ~/fabric-samples/first-network
docker-compose -f orderer.yaml up -d
ssh myuser@$peer01 "cd fabric-samples/first-network; docker-compose -f peer01.yml up -d"
ssh myuser@$peer11 "cd fabric-samples/first-network; docker-compose -f peer11.yml up -d"
ssh myuser@$peer02 "cd fabric-samples/first-network; docker-compose -f peer02.yml up -d"
ssh myuser@$peer12 "cd fabric-samples/first-network; docker-compose -f peer12.yml up -d"
Ingrese cli容器
:docker exec -it cli bash
En cli容器
las pruebas realizadas en el guión: bash scripts/script.sh
consulte los siguientes salida muestra un éxito:
90
===================== Query successful on peer1.org2 on channel 'mychannel' =====================
========= All GOOD, BYFN execution completed ===========
_____ _ _ ____
| ____| | \ | | | _ \
| _| | \| | | | | |
| |___ | |\ | | |_| |
|_____| |_| \_| |____/
Posibles errores
- Al tirar el espejo, usted puede reportar
curl: (56) recv failure: connection reset by peer
: lo haráinstall.sh
elcurl -sSL http://bit.ly/2ysbOFE | bash -s 1.3.0
cambiocurl -sSL https://bit.ly/2ysbOFE | bash -s 1.3.0
a - En
cli容器
el momento de la ejecución del script de prueba puede tener una variedad de circunstancias, esta vez para comprobar la conectividad de red, y luego comprobar si el archivo de certificado en cuestión, ....