首页 > 编程语言 >【区块链】HyperLedger Besu Docker异地组网(续)

【区块链】HyperLedger Besu Docker异地组网(续)

时间:2023-06-12 12:03:54浏览次数:48  
标签:端口 节点 PORT swarm XX HyperLedger Docker docker Besu

最近有些朋友私信我,说之前《【区块链】HyperLedger Besu Docker异地组网》中提到使用docker swarm 可以进行异地组网,但实际上在公网层面无法实现。嗯...的确之前我没有说清楚,其实在我实施的过程中还是遇到了比较多的问题的,譬如:

  1. 国内三大网络运营商对于公网接入会有不同的网络策略;
  2. docker 的 vxlan 网络虚拟化技术的局限性;
  3. 服务器端口开放规划问题;
  4. ......

既然大家问到了,那我将简单说一下可能遇到的情况以及如何解决。

首先,在 Hyperledger Besu(以下简称“Besu”) 中节点之间是通过 P2P 对等网络进行通讯的,这个我们可以通过 toml 文件看到,如下图:

bootnodes=["enode://[email protected]:30303","enode://[email protected]:30303"]

这里将告诉节点服务 enode 地址(区块链网络地址),ip 和端口。 其中 ip 就有学问了,如果你或你的企业舍得花钱拉一条专线,那么按照 docker swarm 配置即可,这里的 ip 也是 overlay 网络内部地址。但是这种情况下你的区块链就只能是私有链了,都说是“专线”嘛,只能通过特殊路由配置进行接收和转发,一般人并不能够随意接入。 如果你需要做成联盟链或者公链,这里就不能使用 docker swarm 的overlay网络。这里是跟上面说到的三大网络运营商的公网接入策略不同有关(这里不能说太细不然又不能发了),改为 host 网络吧,然后将这里的 ip 设置为公网 ip 就可以了。 最后来到 30303 这个端口的问题了,这个端口使用的并不是 TCP 协议而是 UDP 协议的。在开放端口的时候就要注意了。很多时候大家下意识会认为端口开放 TCP就可以了,但是我们使用的 Besu 区块链是 ETH1.0 区块链,PoA共识下执行一次上链操作需要节点之间多次且快速的通讯来确保“三相共识”的完整,这就需要使用 UDP 的快速通讯特性了,因此记得在防火墙中将这个端口的准入设置为 UDP。

那么有的小伙伴也许会说“我使用了 host 模式某些端口会跟其他应用冲突怎么办?”,不用怕 Besu 有提供端口修改的参数,稍微修改一下就可以了如下图:

docker run \
-e JAVA_OPTS=' -Xms1g -Xmx1g -XX:ParallelGCThreads=10 -XX:MaxTenuringThreshold=10 -XX:+DisableExplicitGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+ExplicitGCInvokesConcurrent -XX:+ScavengeBeforeFullGC -XX:+UseG1GC -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+SegmentedCodeCache -XX:ReservedCodeCacheSize=512m' \
-e BESU_RPC_HTTP_PORT=$hp \
-e BESU_P2P_PORT=$p2p \
-e BESU_RPC_WS_PORT=$ws \
--name $custom_folder$i \
--restart always \
--network=host \
-v $target_folder:/var/lib/besu \
-d $docker_image \
--config-file=/var/lib/besu/ibft_config.toml

如上面所示,可以通过“-e BESU_RPC_HTTP_PORT”、“-e BESU_P2P_PORT”、“-e BESU_RPC_WS_PORT”来指定对应的端口号。譬如,我现在不能使用 30303 端口了,那么我就要写成“-e BESU_P2P_PORT=30305”,然后在 enode 里面也要将对应的节点端口改为 30305 即可。

以上的都是自建机房然后自己搭建的情况,如果是云服务的情况呢? 其实云服务的情况下最好的就是购买对应运营商的区块链产品,省下不少麻烦。首先在部署层面,云服务供应商基本上是不允许部署 docker swarm 网络的。要使用 docker swarm 网络是需要同时开启以下端口:

  • 2377(TCP):用于集群管理通信。在 swarm manager 节点上监听此端口,其他节点连接到该端口以加入 swarm 集群;
  • 4789(UDP):用于 overlay 网络的隧道通信。这个端口用于 overlay 网络中的容器之间的数据传输;
  • 7946(TCP/UDP):用于节点之间的通信。这些端口用于节点之间的 overlay 网络通信,包括跨节点的服务发现和容器间的通信;

而这个 4789 的 UDP 端口有点特殊,他是 vxlan 的标准端口。目前几乎所有的云服务器都不会开放这个端口的,因此注定docker swarm 无法在云服务上部署。但有些博主说可以尝试使用“-data-path-port uint32”参数来转移 docker 的 4789 端口,我不知道是不是我的做法不对,反正我没有成功过。 那云服务上就不能部署了吗?可以部署,用 host 模式且节点都在同一家云服务供应商的前提下是可以部署且速度还挺快的。但是跨云服务就不清楚了...... 但随之而来的又是一个新问题了,如下图: WechatIMG699.png 这...这真的没有办法了,如果真的有小伙伴需要在云服务上部署还是先咨询一下云服务供应商,做好调研之后再行动会比较好。

其实总的来说,如果要走云服务,那么要不就购买产品要不就先咨询再行动。如果是自建机房或者自己家里面玩玩那问题不大,留意一下端口开放和公网接入策略基本上就没有问题了。不是专线的情况下还是走 host 模式吧,至于网络不太好的小伙伴就不太建议尝试了,这个技术稍微了解一下就好。

标签:端口,节点,PORT,swarm,XX,HyperLedger,Docker,docker,Besu
From: https://blog.51cto.com/u_15761576/6461272

相关文章

  • How to Clear Logs of Running Docker Containers
    HowtoClearLogsofRunningDockerContainers https://www.howtogeek.com/devops/how-to-clear-logs-of-running-docker-containers/UnderstandingtheProblemDockercollectslogsfromthestandardoutputanderrorstreamsofcontainerforegroundprocesses.......
  • Jenkins + Docker 一键自动化部署 Spring Boot 项目,步骤齐全,少走坑路!
    本文章实现最简单全面的Jenkins+docker+springboot一键自动部署项目,步骤齐全,少走坑路。环境:centos7+git(gitee)简述实现步骤:在docker安装jenkins,配置jenkins基本信息,利用Dockerfile和shell脚本实现项目自动拉取打包并运行。推荐一个开源免费的SpringBoot实战项目:https://......
  • Docker runc容器逃逸漏洞(CVE-2021-30465)
    --原文件的名称并授权cd/tmpmvrunc.amd64runc&&chmod+xrunc--查看runc的位置whichrunc--将备份runc文件cd/usr/bincpruncrunc.bak--复制新的runc到usr/bincp/tmp/runc/usr/bin/systemctlstopdockersystemctlstartdocker......
  • windows 安装docker desktop 报错
    安装docker时报错:JSON字符串无效。(异常来自HRESULT:0x83750007)在Windows.Data.Json.JsonValue.Parse(Stringinput)在CommunityInstaller.InstallWorkflow.SetupBackendModeAndFeatures-----------------------------------------------------------------------......
  • Docker CLI docker exec 常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • Docker CLI docker container exec 常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • Docker CLI docker export 常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • Docker
    Docker概述1.Docker出现开发-上线两套环境java---jar(环境)打包项目带上环境(镜像)--(Docker仓库:商店)--下载我们发布的镜像--直接运行即可!隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。2.Docker历史开源基于Go语言官网:https://www.docker.com/文档:https://docs.docker.......
  • 通过 docker-compose 快速部署 Azkaban 保姆级教程
    目录一、概述二、Azkaban的调度流程三、前期准备1)部署docker2)部署docker-compose四、创建网络五、Azkaban编排部署1)安装MySQL2)下载Azkaban编译3)初始化azkaban用户和表4)配置5)启动脚本bootstrap.sh6)构建镜像Dockerfile7)编排docker-compose.yaml8)开始部署六、简单测试验......
  • docker-compose安装
    1、下载docker-composesudocurl-L"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname-s)-$(uname-m)"-o/usr/local/bin/docker-compose2、增加可执行权限sudochmod+x/usr/local/bin/docker-compose3、添加软链接sudoln-s/usr/lo......