本內容基於Hyperledger Fabric1.0(《深度探索區塊鏈》)html
Hyperledger fabric1.0依賴Docker執行「智能合約」,須要先安裝Docker和Docker-Compose的運行環境。python
Docker支持Linux,Mac,Windows等多平臺,安裝文檔參考:https://docs.docker.com/engine/installationlinux
Linux環境下docker安裝(爲了學習本課程,電腦安裝visualbox虛擬機,同時安裝ubuntu鏡像)git
//0.安裝curl sudo apt install curl //1.Ubuntu,debian,centos等linux系統,可經過官方提供的腳本進行安裝: curl -sSL https://get.docker.com | sh //2.將用戶加入到docker組,非root用戶USER能夠執行docker命令(可能須要從新登陸生效) sudo usermod -aG docker $USER //如果ubuntu/debian操做系統,修改Docker配置文件/etc/default/docker,增長Docker的socket綁訂,運行在Docker中的進程才能經過映射的socket調用Docker的API執行鏡像編譯和建立容器等操做。 DOCKER_OPTS="-s=aufs -r=true --api-cors-header='*' -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock " //3.重啓docker服務,讓配置生效 sudo service docker start
docker version //查看docker版本號
阿里雲和DaoCloud :提供鏡像加速的服務,須要登陸註冊才能使用。(可使用github帳號登陸)github
阿里雲:登陸容器Hub服務:https://cr.console.aliyun.com的控制檯 (左側加速器幫助頁面會顯示爲你獨立分配的加速地址)docker
DaoCloud:在https://www.daocloud.io進行註冊登陸 (點擊加速器獲取加速器相關配置)json
修改Docker鏡像倉庫的辦法:在DOCKER_OPTS里加入registry-mirror參數bootstrap
如:ubuntu
DOCKER_OPTS="-s=aufs -r=true --api-cors-header='*' -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --registry-mirror=http://069f616f.m.daocloud.io"
點擊加速器,跳轉:windows
//編輯docker文件,添加加速器 $ cd /etc/default $ vi docker
重啓docker服務,便可以使用鏡像加速。(Docker在mac/windows能夠在圖形界面添加鏡像倉庫)
【1】。docker images:查看主機上的鏡像文件列表
【2】。docker pull:從鏡像倉庫中下載鏡你文件(如:docker pull hyperledger/fabric-peer)
【3】。docker tag:給鏡像文件打標籤,x86_64-1.0.0標記爲latest
(如:docker tag hyperledger/fabric-tools:x86_64-1.0.0 hyperledger/fabric-tools:latest)
【4】。docker run:從鏡像中啓動容器,
如:docker run -it --name cli ubuntu / bin/bash
其中:cli是容器名稱,ubuntu是鏡像名稱,-it是以交互方式啓動,/bin/bash是啓動容器時執行的命令
【5】。docker logs:查看容器日誌(如:docker logs -f cli)
【6】。docker ps:查看主機上的容器,其中:參數-a會顯示已經中止的容器(docker ps -a)
【7】。docker port:查看容器映射的端口(如:docker port peer0.org1.example.com)
【8】。docker rm:刪除容器,其中:cli爲容器名稱或者id (docker rm cli)
【9】。docker --help:查看幫助文檔
以上,更多命令查看幫助文檔:https://docs.docker.com/engine/reference/commandline/docker
說明:
Docker Compose可以在一個主機上建立出相互隔離的網絡。
經過命令行管理多個Docker容器,快速啓動,中止和更新容器。
//方式一:經過pip進行安裝
sudo apt-get install python-pip
sudo pip install docker-compose 或$ pip install docker-compose>=1.8.0
//方式二:直接下載文件 curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-'uname -s' - 'uname -m' -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose
推薦方式一。本人試用過,沒有問題。方式二方式會出現docker compose文件亂碼。
查看docker compose版本號:$ docker-compose -version
說明:Compose採用YAML文件定義Docker容器之間的依賴,設置環境變量和文件的持久化。
配置文件:/examples/e2e_cli/base/docker-compose-base.yaml
說明:
【1】。version:(version:'2')採用version 2的語法
【2】。services:定義服務列表
【3】。orderer.example.com:(根據服務名稱自定義)自定義的服務名稱,須要保持惟一。
【4】。container_name:容器名稱(如:container_name:orderer.example.com)
【5】。image:容器使用的鏡像文件(如:image:hyperledger/fabric-orderer)
【6】。environment:傳遞給容器的環境變量(-CORE_PEER_LOCALMSPID=Org1MSP)
【7】。working_dir:容器啓動的工做目錄(working_dir:/opt/gopath/src/github.com/hyperledger/fabric)
【8】。command:容器啓動的命令(command:orderer)
【9】。volumes:宿主機和容器之間的目錄映射(-/var/run/:/host/var/run/)
【10】。ports:宿主機和容器之間的端口映射(-7050:7050)
【11】。extends:服務擴展,基於common.yml文件(file:common.yml)
【12】。extends:服務擴展,基礎服務是peer-base(service:peer-base)
【1】。docker-compose up :根據配置文件docker-compose-cli.yaml啓動容器。
如:docker-compose -f docker-compose-cli.yaml up -d
其中 -f指定配置文件的名稱 -d設置之後臺方式運行
【2】。docker-compose down :中止配置文件docker-compose-cli.yaml的容器
如:docker-compose -f docker-compose-cli.yaml down
【3】。docker-compose pull:批量下載所需的鏡像文件
如:docker-compose -f docker-compose-cli.yaml pull
更多命令查看幫助文檔和在線文檔:https://docs.docker.com/compose/reference
超級帳本源代碼都託管在https://gerrit.hyperledger.org/r/#/admin/projects下面。
並在https://github.com/hyperledger上提供只讀代碼。
Git命令下載
$ sudo apt install git //安裝git
$ git version //查看git版本
$ git clone https://github.com/hyperledger/fabric.git //下載fabric源碼
本實例:
$ cd /opt
$ sudo mkdir -p ./gopath/src/github.com/hyperledger
$ cd ~/gopath/src/github.com/hyperledger
$ git clone -b release-1.0 https://github.com/hyperledger/fabric.git
也可打包下載文件後解壓:
https://github.com/hyperledger/fabric/archive/release.zip
說明:超級帳本scripts目錄下有多個下載鏡像的腳本,咱們能夠修改權限後直接運行。
//進入fabric/scripts 目錄 $ chmod +x bootstrap-1.0.0.sh //MacOS執行以下命令(不下載二進制文件) $ sed -i '' 's/curl/#curl/g' bootstrap-1.0.0.sh //其餘操做系統執行以下命令(不下載二進制文件) $ sed -i 's/curl/#curl/g' bootstrap-1.0.0.sh //直接下載Docker鏡像文件 $ ./bootstrap-1.0.0.sh
上述下載鏡像文件有9個:
Repository表明的是鏡像的倉庫名稱。每一個倉庫下面都有打了不一樣TAG的標籤名稱。表明不一樣的版本。
一般最少有2個標籤,一個是latest,另外一個的命名規則爲「主機CPU類型-超級帳本主版本號-snapshot-代碼庫版本號」
說明:運行超級帳本須要設置較多的初始化配置,咱們先繞開初始化過程,用fabric-samples工程中已經生成的配置文件來體驗部署安裝的過程:
//下載目錄位置:/opt/src/github.com/hyperledger/
git clone -b release-1.0 https://github.com/hyperledger/fabric-samples.git
//上述也可不指定版本,直接下載最新fabric,利用git版本切換到1.0
進入basic-network目錄,利用docker-compose啓動容器
$ cd fabric-samples/basic-network //利用docker-compose啓動容器 $ sudo docker-compose -f docker-compose.yml up -d //查看已經啓動的容器 $ docker ps
切換到管理員用戶再建立通道和加入通道:
//建立管理員密碼 su passwd root //輸入密碼 //切換到管理員root身份 su root
#切換環境到管理員用戶的MSP,進入peer節點容器peer0.org1.example.com docker exec -it -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com bash #建立通道 peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx #加入通道 peer channel join -b mychannel.block #退出peer節點容器peer0.org1.example.com exit #退出peer節點容器peer0.org1.example.com,進入cli容器安裝鏈碼和實例化: #進入cli容器
docker exec -it cli /bin/bash #給peer節點peer0.org1.example.com安裝鏈碼 peer chaincode install -n mycc -v v0 -p github.com/chaincode_example02 #實例化鏈碼 peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v v0 -c '{"Args":["init","a","100","b","200"]}'
上述鏈碼實例化後,能夠查詢初始值。一樣是在cli容器裏執行下面的操做:
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","a"]}'
調用鏈碼,從a轉移10到b
//a向b轉10
peer chaincode invoke -C mychannel -n mycc -v v0 -c '{"Args":["invoke","a","b","10"]}'
//查詢a值
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","a"]}'
//查詢b值
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","b"]}'
說明:在docker-compose.yml文件中,有ORDERER_GENERAL_LEDGERTYPE=ram的設置,這是傳遞給節點的參數。
給節點傳遞參數的方法有多種方式:
【1】。環境變量
【2】。配置文件
【3】。動態環境變量
【4】。默認值
程序在啓動時,會讀取配置文件和環境變量的值,分別保存到不一樣變量緩存起來,
在程序獲取某個變量值的時候,不一樣傳遞方法參數讀取流程圖以下所示:
從圖中能夠看到,若是配置了自動從環境變量獲取參數的值,那麼每次都實時地從環境變量中獲取,不然依次讀取程序啓動時從環境變量、配置文件中讀取後緩存到內存中的值,優先獲取到的值做爲返回值。若是都沒有獲取到,則返回空,交給程序進行處理,程序可能會以默認值運行,也可能會報錯中止運行,這跟業務邏輯有關係。因此,只有在設置了自動從環境變量中獲取參數的狀況下,才能在運行時經過修改環境變量改變參數的值。
每一個環境變量的名稱都有一個前綴,每一個模塊都是單獨設置的,好比ORDERER_GENERAL_LEDGERTYPE的前綴是ORDERER,一般每一個模塊的前綴是不同的。好比這裏的ORDERER表明的是排序服務節點,Peer節點的變量名稱前綴是CORE。環境變量名稱是以「_」做爲分隔符的,表明一種層級,是和配置文件一一對應的,好比ORDERER_GENERAL_LEDGERTYPE對應orderer.yaml配置文件的General.LedgerType。環境變量和配置文件的變量名稱都是不區分大小寫的,內部會統一轉換成小寫的變量名稱進行處理。
配置文件路徑優先讀取環境變量設置的路徑,排序服務節點和Peer節點都是相同的環境變量。若是沒有設置環境變量,則默認是應用程序所在的目錄,而後環境變量GOPATH路徑對應到模塊代碼工程下的目錄,好比排序服務節點的目錄是GOPATH/src/github.com/hyperledger/fabric/peer。
通常狀況下,配置文件的名稱設置成模塊前綴的小寫,好比排序服務節點的配置文件名稱是orderer,Peer節點的配置文件名稱是core。配置文件名稱的後綴支持:json、toml、yaml、properties、props、prop,它們分別對應JSON文件、TOML文件、YAML文件和Properties文件,程序設置配置文件的時候若是不指定後綴,則按支持的後綴順序在配置文件路徑下進行搜索,找到第一個匹配的文件做爲最終的配置文件。文件路徑和文件後綴按照廣度優先的搜索順序,即在同一路徑下匹配完全部文件後綴再進入下一個文件路徑。假設Peer節點沒有設置配置文件路徑,$GOPATH的路徑是/opt/gopath,則有兩個目錄下的文件以下所示:
vagrant@hyperledger-devenv:v0.2.2-58cde93: /opt/gopath/bin$ tree .
.
├── core.yaml
└── peer
vagrant@hyperledger-devenv:v0.2.2-58cde93: /opt/gopath/bin$ tree /opt/gopath/
src/github.com/hyperledger/fabric/peer
.
├── core.json
└── peer
搜索路徑順序是:
./core.json
./core.toml
./core.yaml
./core.properties
./core.props
./core.prop
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.json
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.toml
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.yaml
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.properties
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.props
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.prop
因此最終獲取到的配置文件是:./core.yaml。
而不是/opt/gopath/src/github.com/hyperledger/fabric/peer/core.json。
linux環境下,安裝Goland
//linux默認下載位置 /tmp/mozilla_shiyufeng0 cd /tmp/mozilla_shiyufeng0 ls //拷備goland的tar文件到 /usr/local下 cp -i goland-2018.2.tar.gz /usr/local/ //解壓縮到/opt目錄下 sudo tar -zxvf goland-2018.2.tar.gz -C /opt cd /opt/goland-2018.2/bin //啓動goland ./goland.sh
goland激活碼:http://idea.youbbs.org (可隨時在網上查找)
導入fabric項目,效果以下所示:
上述basic-network和first-network可用於部署區塊鏈網絡示例。
########### Docker經常使用命令 ###########