前言
fabric 部署本來就是一件麻煩的事情券勺,如果還涉及到多機環(huán)境部署那就更加的麻煩了狡蝶。
因為 fabric 推薦部署在docker環(huán)境中把将,那很自然地想到通過集群部署工具來部署fabric焰枢。本文就通過例子來說明如何在 Swarm 集群中部署 fabric 區(qū)塊鏈網絡舀患。
還有之前看到過張海寧的k8s部署方案徽级,供大家參考。
文中所有IP地址,如192.168.1.93聊浅,都需要根據你本地的情況輸入餐抢。
本例子github地址:fabric-in-swarm , 歡迎star.
本文同時發(fā)布在個人網頁 http://qiushaoxi.com/2017/12/07/fabric-in-swarm/
轉載請注明出處。
架構說明
docker swarm 會在各臺機器之上 創(chuàng)建一個 overlay 虛擬網絡低匙,通過swarm啟動的container可以跨主機互相訪問旷痕。
docker service 是 swarm 編排的最小單位,可以配置運行的鏡像顽冶、網絡端口欺抗、環(huán)境變量等,一個service 可以啟動多個container進行負載均衡强重。不過因為區(qū)塊鏈中每個節(jié)點都有不同的配置绞呈,本例子中每個service只跑一個container。后續(xù)可以繼續(xù)探討啟動多個container的場景间景。qiushaoxi.github.io/img/fabric-in-swarm/cluster.png
docker stack 則是一組 service 的合集佃声, 每個stack會默認創(chuàng)建一個 default 的 overlay 網絡,其中還可以再配置其他網絡倘要。 stack 本意是技術棧圾亏,通過在 stack 中配置前后端、中間件等 service碗誉,可以實現一鍵部署整個技術棧召嘶。本例子的stack 中,配置了1個orderer哮缺、4個peer和1個cli一共6個service弄跌。后續(xù)可以根據需要加入kafka、couchdb等service尝苇。
swarm 集群會對外暴露一個IP铛只,通過端口映射埠胖,可以訪問到具體 service 的端口。
基礎環(huán)境搭建
Swarm 集群搭建
安裝 docker
如果還沒有安裝 docker 淳玩,執(zhí)行:
curl -fsSL https://get.docker.com | sh
在 leader 創(chuàng)建 Swarm 集群
選擇一臺機器作為 leader
docker swarm init --advertise-addr 192.168.1.93
這里的ip是整個swarm集群對外的ip直撤,所有swarm集群里面的容器都通過這個ip對外提供服務。
執(zhí)行返回:
To add a worker to this swarm, run the following command:
docker swarm join /
--token SWMTKN-1-16kit6dksvrqilgptjg5pvu0tvo5qfs8uczjq458lf9mul41hc-dzvgu0h3qngfgihz4fv0855bo /
192.168.1.93:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
其他機器加入 Swarm 集群
根據第一步返回的命令加入集群:
docker swarm join /
--token SWMTKN-1-16kit6dksvrqilgptjg5pvu0tvo5qfs8uczjq458lf9mul41hc-dzvgu0h3qngfgihz4fv0855bo /
192.168.1.93:2377
所有其他機器執(zhí)行命令后蜕着,在leader執(zhí)行
docker node ls
如果能看到所有機器谋竖,說明操作成功,Swarm集群搭建完畢承匣。
portainer
這里推薦一個開源的docker后臺管理工具portainer蓖乘,也支持Swarm集群的管理。
docker service create \
--name portainer \
--publish 9000:9000 \
--replicas=1 \
--constraint 'node.role == manager' \
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
portainer/portainer \
-H unix:///var/run/docker.sock
執(zhí)行這個命令就可以在Swarm中啟動韧骗,然后訪問 Swarm_IP:9000 就可以進行管理后臺嘉抒,初次需要設置密碼。
NFS服務器搭建
因為集群容器需要讀取一些文件袍暴,所以需要搭一個文件服務器些侍。
安裝nfs-kernel-server
可以在任意臺機器安裝,本例子就在 swarm manager的機器上安裝的政模。
apt install nfs-common
apt install nfs-kernel-server
修改配置文件
vim /etc/exports
修改內容如下:
/nfs *(rw,sync,no_root_squash)
各段表達的意思如下岗宣,根據實際進行修改
/nfs :共享的目錄
* :指定哪些用戶可以訪問
* 所有可以ping同該主機的用戶
192.168.1.* 指定網段,在該網段中的用戶可以掛載
192.168.1.12 只有該用戶能掛載
(ro,sync,no_root_squash): 權限
ro : 只讀
rw : 讀寫
sync : 同步
no_root_squash: 不降低root用戶的權限
其他選項man 5 exports 查看
創(chuàng)建目錄并重啟nfs服務
mkdir /nfs
service nfs-kernel-server restart
到此淋样,nfs的服務就搭建好了狈定。
連接掛載nfs服務器
執(zhí)行 showmount -e + 主機IP 測試和nfs服務器是否能夠聯通
apt install nfs-common
showmount -e 192.168.1.93
如果看到返回:
Export list for 192.168.1.93:
/nfs *
說明文件服務器是ok的。
將該目錄掛載到本地习蓬,每個機器都需要掛載,包括管理節(jié)點的機器措嵌。為的是保證每臺機器都能夠從/mnt/nfs/目錄獲取數據躲叼。
mkdir -p /mnt/nfs
mount 192.168.1.93:/nfs /mnt/nfs
訪問本地的/mnt/nfs目錄,就可訪問服務端共享的目錄了企巢。
部署 Fabric
部署文件準備
進入nfs目錄
cd /mnt/nfs
從github獲取示例腳本
git clone https://github.com/qiushaoxi/fabric-in-swarm.git
cd fabric-in-swarm
每個節(jié)點都需要有fabric相關的docker image枫慷,我例子使用fabric 1.0.0版本。
如果還沒有浪规,需要在每臺機器執(zhí)行下載腳本或听,拉取image
bash download-dockerimages.sh
如果覺得下載速度太慢,可以使用阿里云鏡像加速笋婿,或者在本地部署docker hub誉裆,具體方法可以參考本地Docker Hub配置.
執(zhí)行部署命令
設置相關環(huán)境變量,FABRIC_IP是你Swarm管理節(jié)點的ip
export FABRIC_IP=192.168.1.93
執(zhí)行docker stack deploy命令啟動stack缸濒,docker-compose-cli.yaml是docker-compose v3 配置文件足丢,配置了相關的service粱腻。
示例的配置參考fabric官方e2e_cli,1個orderer斩跌,4個peer绍些,一個cli。命令最后的 e2e 是stack的名稱耀鸦。
cd e2e_cli
docker stack deploy -c docker-compose-cli.yaml e2e
docker-compose文件中配置了cli容器會自動執(zhí)行腳本柬批,執(zhí)行創(chuàng)建通道、加入通道等一系列操作袖订。
docker service 會根據每臺機器的性能和負載氮帐,選擇啟動container的機器。
查看執(zhí)行結果
執(zhí)行下面命令著角,查詢執(zhí)行日志揪漩。
docker service logs -f e2e_cli
如果看不到內容首昔,(我在本地可以用這個命令哮内,阿里云看不到,原因不明)啡邑。執(zhí)行
docker service ps e2e_cli
可以看到cli容器的id和運行在哪臺機器上产徊。
到運行cli容器的機器上執(zhí)行
docker logs [cli_container_id]
查看執(zhí)行日志昂勒。
如果最后出現 END-E2E,則說明執(zhí)行成功舟铜。
移除 stack
執(zhí)行
docker stack rm e2e
就可以停止并移除所有配置啟動的service戈盈。
其他說明
查看stack
docker stack ls
查看service
docker service ls
因為運行chaincode的container是通過unix://var/run/docker.sock啟動的,不是由swarm啟動的谆刨,所以通過docker service 是看不到的塘娶。需要到具體執(zhí)行的機器上執(zhí)行
docker ps
才能看到。
而且痊夭,就算是停止了stack也不會自動刪除這些container刁岸,不過因為peer停止了,這些chaincode的container也會自動停止她我。