基于Docker搭建一个Go-ethereum节点(下)

2024-08-28 23:32
文章标签 go docker 搭建 节点 ethereum

本文主要是介绍基于Docker搭建一个Go-ethereum节点(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:http://dockone.io/article/1936

上一篇奠定了基础的知识点以后,我们开始区块链之旅了!

我们要做的第一件事是将“geth”节点连接到以太坊生产网络,从而保证我们的本地区块链同步,并为其他工具打开服务端口 - 当然也是在容器中运行。

c87d59d.jpg
通过“docker run”命令,启动镜像“ethereum / client-go”。 RUN命令具有以下参数:

“-it”以交互模式启动容器,并将容器的标准输出发送到我们的终端。当以后重新启动容器时,我们可以选择在后台运行该进程,但是现在我们要看看发生了什么。

“ - -name”给容器以逻辑名“ethereum”,我们稍后可以使用它来访问这个实例。
“-p 30303:30303 -p 8545:8545 -p 8546:8546”公开并且将三个端口从容器内部映射到外部。
“-v /opt/docker/ethereum:/root/.ethereum”将主机目录“/ opt / docker / ethereum”(我们要存储区块链数据的位置)挂载到位置“/ root / .ethereum“。后者是“geth”在使用root用户帐户启动时存储所有信息的默认位置。

这个镜像的ENTRYPOINT命令“geth”可以通过INSPECTing可视化来调用,就像我们在主机上直接运行时使用该工具一样。请注意,容器命令行参数不能(容易)过后更改,如果需要不同的命令行,我们将需要创建一个新容器。然而从Docker的角度“容器很便宜”,所以这个约束不是真正的问题,特别是数据不在容器中,不需要重新下载。有一件事要记住:同一时间只有一个“geth”节点可以访问blockchain数据,所以不可能同时运行多个主“geth”节点。

“ - -ws - -rpc”分别激活“geth”的Web接口和HTTP RPC接口。“ - -rpcaddr”0.0.0.0“ - -wsaddr”0.0.0.0“向网络上的所有地址开放这些接口。这样做通常会有点危险,但我们不是在主机的物理网络上运行。这个部分后面会介绍更多。执行上面的命令应该启动一个新的容器,调用“geth”工具,然后开始下载blockchain数据。 (注意:您可以使用“-fast”选项)。
3199e31.jpg

f73f674.jpg


以下行值得重点关注:
8128089.jpg

3748e4f.jpg

1、首先,告警提示“geth”抱怨没有定义“etherbase”。 “etherbase”是成功挖掘区块,执行智能合约并在区块链内返回结果之后用来接收以太奖励的“默认以太坊地址”。这个帐户,在开发合同时也很方便。

2 、接下来,我们看到blockchain数据被写入“/root/.ethereum/chaindata”,因为我们已经从我们的主机挂载了这个目录,我们应该可以在本地磁盘上看到出现的数据:
640.jpg

3、最后,HTTP和Web socket端点已经打开,并且创建了默认的IPC(进程间通信)文件句柄“/root/.ethereum/geth.ipc”。这通常会隐藏在容器中,但是我们已经挂载了外部目录,所以该文件可以用于与这个“geth”节点通信。

剩下的就是定义一个默认的以太坊帐户。使用Docker命令允许在正在运行的容器中执行命令,所以很容易。注意,这各操作不会打开另一个不同的容器,它连接到现在运行的容器。
bfc532b.jpg

不要忘记记下以太坊地址和密码。为了被“geth”节点识别,容器必须重新启动。新帐户可以在我们挂载的数据目录中找到:
d5cadc7.jpg

在交互式模式下,容器实例可以使用CTRL + C停止。否则,应该调用docker STOP命令。
关于这一点的最后说明:

为了能与以太坊网络同步,主机时间必须精确匹配以太网网络时间。因此,可能需要使用NTP协议与“世界时间”执行同步:
fb6f2b7.jpg

容器相关知识

在当前配置中,我们有一个可以挂载到我们的容器中的以太坊数据目录。这不是因为区块链数据只能在任何情况下由一个进程访问,而是访问可由Ethereum节点用于进程间通信的IPC文件描述符。因此,我们可以在这里继续,而不需要访问网络。

然而,为了充分利用我们的完整容器化以太坊节点,了解Docker如何与网络结合可以大大帮助我们为我们未来的用例找到最佳解决方案。众所周知,网络可以是相当复杂的,所以我们在这里只专注于文章内容相关的部分。

默认情况下,Docker容器无法访问主机的网络。如果这样的话,容器化有什么意义呢?作为替代,Docker创建一个单独的虚拟网络,所有容器和主机都可以访问:“docker0”。可以通过显示主机的网络配置查看:
43f8277.jpg

除了我们的本地网络“eth0”(或类似,NB。eth以太网,而不是以太坊),我们看到名为“docker0”的网络。它是一个不同的子网,172.17.42.1是这个网络上的主机IP地址。为了简单,我们将使用由所有容器共享的默认“docker0”网络。但是,知道Docker也允许创建单独的逻辑网络并将它们分配到特定的容器!

获取容器的IP地址不太直接。默认情况下,在轻量级Linux镜像中未安装“ifconfig”。我们可以使用命令“sudo docker exec apt-get -y install .....”安装一切,但是这个需要在每个容器中一次又一次地执行。有一个更容易的解决方案:
7f9e26a.jpg

对于这个IP必须要清楚的事情是,它会在在容器重新启动时改变。这个对于将IP用于在创建另一个容器作为命令行参数传递时可能是一个问题,我们将在下面看到。

顺便提一句,INSPECT命令允许查看关于容器,系统和IO配置,启动命令行,文件路径和挂载等等的任何信息。
73a637e.jpg

640_(1).jpg

640_(2).jpg

640_(3).jpg

4 、连接JavaScript控制台

接下来,我们想让以太坊主节点与“geth”JavaScript控制台进行交互。这个十分简单…

而棘手的部分是两个容器化的“geth”节点之间的进程间通信。第一个选项是使用安装的数据目录中存在的IPC文件。这是当在同一主机上运行时“geth”节点通信的典型方式。我们需要的是将数据目录安装到第二个节点,在同一个地方,所以“geth”“看到”另一个节点,就好像它只运行一个控制台窗口。两个容器使用相同的IPC描述符进行互连:

微信截图_20161221161617.png

替代方案是Web socket或HTTP接口。这需要知道主节点的IP地址,我们知道如何找出.
af61022.jpg

此方法有一个重要的障碍:我们必须指定主“geth”节点的IP地址作为第二个容器的命令行的一部分。一旦创建,此IP声明不能再更改(除了在配置文件上做手脚),所以这个容器只有在目标容器重新启动和其IP更改之前才有用。

最简单的解决方案是删除此容器,并在每次需要控制台时启动一个新容器。记住 - “容器很便宜”,我们可以用脚本自动化:
微信截图_20161221161739.png

5 、运行MIX IDE

现在它将要变得非常有趣。到目前为止,我们使用纯命令行“geth”实例在单独的容器中运行,我们使它们进行通信。运行Ethereum Mix IDE增加了一个新的挑战:使用图形用户界面。

Docker不是真正设计为在容器内运行UI,但是我们可以使用各种技巧来解决。目前有三种方式:

1)将整个X11服务器安装到容器中,并使用一些魔法:),如下所述。这个方式很重,但却是完全“Docker方式”让容器保持隔离。

2)简单地将VNC服务器安装到容器中并远程打开UI。很聪明,但由于性能问题用VNC工作却不是真的那么趣。

3)在正确的地方将Linux主机的X11 IPC(进程间通信)socket装入容器,这是相对优雅的,但却打破了容器之间的隔离,因此可能带来安全和稳定问题。

这个问题解决了,我们需要将Mix IDE转换为容器。由于以太坊团队尚未提供预定义的镜像,我们勇敢地使用“Dockerfile”构建自己的镜像。

第一步是创建一个目录来存储Dockerfile,让我们说“ethereum-mix-ide”。接下来,在内部创建名为“Dockerfile”的文件(文件名是必需的),其内容如下:
640_(4).jpg

a58ad33d3c6c8af51da3ad9d7bef726c.jpg

最后,在目录中,我们调用Docker命令,逐步执行此脚本,并将最终结果保存到我们的新镜像中。请不要忘记在末尾的“。”,因为它是命令行的一部分。
d90e8ae9a1f52bbf3ef18d428184dbe8.png

“Dockerfile”脚本是相当自我解释 。我们的镜像是基于最新的官方UBUNTU镜像。首先,它安装各种工具和Mix IDE。为了能够连接到X服务器,正在运行的进程不能是“root”。因此,脚本创建一个名为“mix”的用户并赋予他sudo权限。最后,“mix-ide”设置为自动启动点。
让我们来验证一下结果:
1f77e8d1ab570a42b37320e6ede2841a.png

镜像准备好了,我们将创建一个新的容器,并自豪地命名为“ethereumix”
b8b33dc6c3eacd98f567cf0e0b4aa393.jpg

一旦构建,容器可以随时重新启动:
3060eb41d51cbd89d4d33ce81f71bb39.png

或者,在交互模式下查看所有Beta版的警告消息:
6e1cc74ed1dbafeea02374ca32d7b5f2.png

你可能已经注意到这个参数:“-p 18545:8545”。它确实是一个参数,没有typo :)“geth”主节点容器已经将它的端口8545绑定到主机端口8545,所以我们需要选择另一个地方绑定。由于Mix IDE容器启动到“geth”主节点的连接,因此绑定位置不重要。

“-v /tmp/.X11-unix:/tmp/.X11-unix”将我们的本地X11服务器socket挂载到容器,这次使用Docker的VOLUME功能,“-e DISPLAY = $ DISPLAY”设置$ DISPLAY环境变量在容器内的值与我们在主机上的值相同。此变量指定X客户端要显示的地址,这是必须设置的。

Mix IDE不需要访问Blockchain数据,但是我们需要在我们要在区块链上部署Smart Contract时联系主要的以太坊“geth”服务器节点。同样,我们需要服务器节点的IP地址:

6c385f950aed5812a57d7ba466ed2356.png

然而,这一次,目标地址在UI中指定,并且当服务器IP更改时,容器可以重复使用而不用麻烦。

ddfa75537d0dbc05bfc0d508f9c73905.jpg

镜像创建脚本安装了使用Mix IDE所需的内容,但我们可能需要安装其他工具或稍后调整容器。正如我们上面已经看到的,我们可以在容器内执行命令,这甚至可以是一个交互式shell:
dee5e132d03d11ca32d879c7a4a63318.jpg
成功!

f73f674.jpg

这篇关于基于Docker搭建一个Go-ethereum节点(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116200

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而