基于Ubuntu docker环境下进行以太坊实践
nanshan 2024-11-04 13:04 6 浏览 0 评论
本文是指导以太坊技术爱好者,通过基于Ubuntu环境下通过docker来进行以太坊的客户端安装和调试的指导教程。
目录
1、实践环境要求
2、Ubuntu版本说明
3、Docker安装
4、Ethereum安装与实践
5、ZSH小工具推荐
1 实践环境要求
1.1 概述
https://docs.docker.com/engine/installation/linux/ubuntulinux/ 。这篇文章主要指导你去安装使用Docker-managed发布包及其安装机制。使用这些包确保你获得最近的docker官方发布版本。如果你需要安装使用Ubuntu-managed包,查阅Ubuntu文档。
1.2 docker对操作系统支持
Ubuntu Xenial 16.04[LTS]
Ubuntu Trusty 14.04[LTS]
Ubuntu Precise 12.04[LTS]
1.3 前置需求
不管你是Ubuntu的哪个版本,Docker需要64的操作系统。此外你的kernel内核至少要在3.10版本之上。最近的3.10小版本或者最新的维护版本也是可以接受的。kernel3.10版本之前的系统缺少一些特性来运行docker容器。这些旧版本有些已知的bugs会导致数据丢失并且在一定条件下会频繁的故障。检查你当前的kernel版本,打开终端,输入uname –r
注意:如果你之前使用APT安装过docker,为了新版本的docker仓库,确保你更新了APT源。
1.4 更新apt源
Docker的APT仓库包含1.7.1以及更高的版本。通过设置APT使用来自docker仓库的包。
1) 登陆机器,用户必须使用sudo或者root权限。
2) 打开终端
3) 更新包信息,确保APT能使用https方式工作,并且CA证书已安装了
#sudo apt-get update
#sudo apt-get install apt-transport-https ca-certificates
出现这个问题可能是有另一个程序正在运行,导致资源被锁不可用。而导致资源被锁的原因可能是上次运行安装或更新没有正常完成,解决办法就是删掉。
#sudo rm /var/cache/apt/archives/lock
#sudo rm /var/lib/dpkg/lock
4)添加一个新的GPG密钥
#sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
5)找到合适你的Ubuntu操作系统的键,这个键决定APT将搜索哪个包。可能的键有:
注意:docker没有为所有的架构提供包,Binary artifacts are built nightly,你可以从https://master.dockerproject.org. 处下载下来。在一个多架构的系统上安装docker,为键添加一个[arch=]条款。更多细节参考Debian Multiarch维基百科。
6)运行下面的命令,用占位符<REPO>为你的操作系统替换键。
#echo "<REPO>" | sudo tee /etc/apt/sources.list.d/docker.list
比如你是16.04将上面命令的<REPO>
替换成deb https://apt.dockerproject.org/repoubuntu-xenial main 执行那条命令,就在那个文件夹下创建了一个docker.list文件,里面的内容就是
deb https://apt.dockerproject.org/repoubuntu-xenial main
7)更新APT包索引
#sudo apt-get update
8)校验APT是从一个正确的仓库拉取安装包。
当运行下面命令的时候,这个键会返回你目前可以安装的docker版本,每个键都包括URL:https://apt.dockerproject.org/repo/。下面是截取的部分输出内容。
#apt-cache policy docker-engine
现在当你运行apt-get upgrade的时候,APT就会从新的仓库拉安装包。
2 Ubuntu版本说明
2.1 前置准备操作
Ubuntu Xenial 16.04[LTS],Ubuntu Trusty 14.04[LTS]这两个版本记得安装linux-iamge-extra-*的kernel包。这个包允许你使用aufs存储驱动。
# sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
Ubuntu Precise 12.04[LTS]对于这个版本,你需要3.13以上的kernel版本,你必须升级。下面表格指导你需要哪些包:
你可以执行以下命令:
#sudo apt-get install linux-image-generic-lts-trusty
#sudo reboot
3 Docker安装
3.1 前置操作
1).登陆系统,用你的账号使用sudo全权限
2).运行命令apt-get install openssh-server安装ssh 查看是否安装成功ps -ef|grep ssh
3).更新APT包索引:sudo apt-get update
4).安装docker:sudo apt-get install docker-engine
5).开启docker后台进程:sudo service docker start
6).校验docker是否安装成功:sudo docker run hello-world
这个命令会下载一个测试镜像,并且运行在一个容器中。当容器运行时,他会打印一些信息,并且退出。
3.2 创建一个docker组
docker后台进程是绑定的Unix的socket而不是TCP端口。默认情况下,Unix的socket属于用户root,其它用户要使用要通过sudo命令。由于这个原因,docker daemon通常使用root用户运行。为了避免使用sudo当你使用docker命令的时候,创建一个Unix组名为docker并且添加用户。当docker daemon启动,它会分配Unix socket读写权限给所属的docker组。
注意:docker组不等价于用户root,如果想要知道的更多关于安全影响,查看docker daemon attack surface。
#sudo groupadd docker
#sudo usermod -aG docker $USER
退出再重进,确保该用户有正确的权限。校验生效,通过运行docker命令不带sudo:docker run hello-world,如果失败会有以下类似的信息:Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?确保DOCKER_HOST环境变量没有设置。如果有取消它。
3.3 调整内存和交换区计算
当用户运行docker时,他们可能在使用一个镜像时看见下面的信息:
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
为了阻止这些信息,在你的系统中启用内存和交换区计算。这个操作会导致即便docker没有使用也有内存开销以及性能下降。内存开销大概是总内存的1%。性能降低了大约10%。
修改/etc/default/grub文件。vi或者vim命令都行,设置GRUB_CMDLINE_LINUX的值,如下:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"。
保存文件并关闭。
#sudo update-grub更新启动项,reboot重启你的系统。
3.4 启动UFW转发
当你运行docker时,在同一台主机上使用UFW(Uncomplicated Firewall) ,你需要额外的配置。docker使用桥接方式来管理容器的网络。默认情况下,UFW废弃所有的转发流量。因此,docker运行时UFW可以使用,你必须设置合适UFW的转发规则。
UFW默认配置规则拒绝了所有传入流量。如果你想要从另一个主机到达你的容器需要允许连接docker的端口。docker的默认端口是2376如果TLS启用,如果没有启动则是2375,会话是不加密的。默认情况,docker运行在没有TLS启动的情况下。
为了配置UFW并且允许进入的连接docker端口:
检查UFW是否安装并启用:
#sudo ufw status
打开/etc/default/ufw文件并编辑:
#sudo nano /etc/default/ufw
设置DEFAULT_FORWARD_POLICY:DEFAULT_FORWARD_POLICY="ACCEPT"
保存退出并重启使用新的设置:
#sudo ufw reload
允许所有的连接到docker端口:
#sudo ufw allow 2375/tcp
3.5 为docker配置DNS服务器
系统运行桌面的Ubuntu或者Ubuntu衍生产品通常使用127.0.0.1作为默认的nameserver文件/etc/resolv.conf文件中。NetworkManager也通常设置dnsmasq nameserver 127.0.0.1在/etc/resolv.conf。
当在桌面机器运行容器,使用这些配置时,docker的使用者会看见这些警告:
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
这个警告发生是因为docker容器不能使用本地DNS命名服务器。此外docker默认使用一个额外的nameserver。
为了避免这个警告,你可以在使用docker容器的时候指定一个DNS服务器。或者你可以禁用dnsmasq在NetworkManager中。但是,禁用会导致DNS协议在某些网络中变慢。
下面的说明描述了如何在Ubuntu14.0或以下版本配置docker守护进程。Ubuntu15.04及之上的使用systemd用于启动项和服务管理。指导通过使用systemd来配置和控制一个守护进程。
设置指定的DNS服务:
打开/etc/default/docker文件并编辑:sudo nano /etc/default/docker,添加配置项:DOCKER_OPTS="--dns 8.8.8.8"。将8.8.8.8用一个本地的DNS服务例如192.168.1.1替换。你也可以配置多个DNS服务器。
用空格隔开它们,如:--dns 8.8.8.8 --dns 192.168.1.1。
警告:当你在笔记本连接了不同网络的情况时做这些操作,确保选择一个公用的DNS服务器。保存文件并退出,重启docker守护进程:sudo service docker restart。或者另一个选择,禁用dnsmasq在网络管理器中,这可能导致你的网速变慢:
打开/etc/NetworkManager/NetworkManager.conf文件,
编辑它:sudo nano /etc/NetworkManager/NetworkManager.conf。
找到行dns=dnsmasq,注释掉。
保存关闭文件,重启网络管理器和docker.
#sudo restart network-manager
#sudo restart docker。
3.6 配置docker引导启动
Ubuntu15.04之后使用systemd作为引导启动和服务管理,14.10及以下版本是upstart。15.04以上,需要配置docker守护进程boot启动,
运行命令:
#sudo systemctl enable docker
14.10及以下版本安装方法会自动配置upstart来启动docke daemon在boot。
3.7 升级卸载docker
升级:
#sudo apt-get upgrade docker-engine
卸载:
#sudo apt-get purge docker-engine
卸载及依赖:
#sudo apt-get autoremove --purge docker-engine
上述命令不会卸载images,containers,volumes或者用户自己创建的配置文件。
你如果想删除这些东西,执行下面的命令:
#rm -rf /var/lib/docker
安装最简单的方法是:
#sudo apt-get update
#sudo apt-get install
3.8 执行docker-compose安装
docker-compose 是用于定义和运行复杂docker应用的工具,以yaml定义语言在一个docker-compose.yaml文件中定义一个包括多容器的应用,用一条命令即可启动应用中包括的所有docker container,容器启动所有依赖的动作都会被工具自动完成。 curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-
4 Ethereum安装与实践
4.1 通过docker安装Ethereum
运行如下命令
#docker pull docker.io/ethereum/client-go
4.2 直接安装Ethereum
运行如下命令
#apt-get update
#apt-get install software-properties-common add-apt-repository -y ppa:ethereum/ethereum
安装一个稳定版本的以太坊
#apt-get update
#apt-get install ethereum
#apt-get update
生成引导节点ID
#bootnode --genkey=boot.key
运行引导节点
#bootnode --nodekey=boot.key
4.3 新建genesis.json文件
运行以下命令
vi genesis.json
输入
4.4 初始化创始区块
运行如下命令
#docker run -itd --privileged=true -v /path/docker/dev1:/root/ethdev --name gethDev1 ethereum/client-go --datadir /root/ethdev --networkid 8765639736937780 init /root/ethdev/genesis.json
4.5 创建Ethereum节点的容器
运行如下命令
#docker rm -f gethDev1
#docker run -itd -m 512M --privileged=true --memory-swap -1 --net=host -p 8545:8545 -p 40303:40303 -v /path/docker/dev1:/root/ethdev --name gethDev1 ethereum/client-go --ipcdisable --port 40303 --bootnodes "enode://2039a49989e45bf119ecd21403607ea9f5888b13a6bb7a03ed81687deabb251095e4193a77eca067076f77ed40e4c6fd51539038c440337beffbbb36953d1d75@192.168.3.43:30301" --debug --nodiscover --rpcapi "db,eth,net,web3,personal,admin,miner,txpool" --datadir /root/ethdev --networkid 8765639736937780 --wsapi "db,eth,net,web3,personal,admin,miner,txpool" --ws --wsaddr "0.0.0.0" --rpc --rpcaddr "0.0.0.0" --cache=512 --verbosity 6 --mine --minerthreads=1 --etherbase=0x5f38056f45091ee992298e53681b0a60c999ff95 console
4.6 查看Ethereum节点docker日志
运行如下命令
#docker logs -f gethDev1
4.7启动Ethereum节点
运行如下命令
#docker startgethDev1
4.8 Attach Ethereum节点
运行如下命令
#docker attach gethDev1
4.9 Detach Ethereum节点
先后按下键盘ctrl+p+q退出节点,注意:有先后顺序
4.10 停止Ethereum节点
运行命令如下
#docker stopgethDev1
4.11 Ethereum日志释疑
首先,告警提示geth抱怨没有定义etherbase,etherbase是成功挖掘区块,执行智能合约并在区块链内返回结果之后用来接收以太奖励的“默认以太坊地址”。这个帐户,在开发合同时也很方便。
接下来,我们看到blockchain数据被写入/root/.ethereum/chaindata,因为我们已经从我们的主机挂载了这个目录,我们应该可以在本地磁盘上看到出现的数据:
docker exec –i ethereum geth account new
ls –l /opt/docker/ethereum/keystore/.
docker exec ethereum apt-get install –y ntpdate
docker exec ethereum ntpdate –s ntp.ubuntu.com
在当前配置中,我们有一个可以挂载到我们的容器中的以太坊数据目录。这不是因为区块链数据只能在任何情况下由一个进程访问,而是访问可由Ethereum节点用于进程间通信的IPC文件描述符。因此,我们可以在这里继续,而不需要访问网络。
5 zsh小工具推荐
zsh是一款小工具,对命令补全功能非常强大,可以补齐路径,补齐命令,补齐参数等。
5.1 修改root用户SHELL
先进入root用户,命令:su root
查看默认SHELL命令:echo $SHELL
然后查看是否安装了zsh,命令:cat /etc/shells
默认没有安装,那么先安装zsh,命令:apt-get install zsh
确认zsh是否安装成功,命令:zsh --version
接下来替换bash为zsh,命令:chsh -s /bin/zsh
然后reboot重启,之后查看默认SHELL,发现修改为/bin/zsh
查看是否安装git,命令:git –version
如果没有安装则安装,命令:apt-get install git
最后下载oh-my-zsh,命令:sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
出现如上则安装成功,重新进入终端即可。
5.2 修改普通用户SHELL
查看默认SHELL,命令:echo $SHELL
如果是/bin/zsh则直接:sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)";
是/bin/bash则,切换:chsh -s /bin/zsh
然后用root权限reboot,然后:sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
安装成功后可以(vi ~/.zshrc)来修改配置文件以改变样式(注意root和非root都要改,可以选择不一样的样式)。
root的样式配置文件在根目录root下,为隐藏文件;非root在/home/root下。
具体样式选择https://github.com/robbyrussell/oh-my-zsh/wiki/themes
本篇文章由芯链团队整理。
相关推荐
- 实战派 | Java项目中玩转Redis6.0客户端缓存
-
铺垫首先介绍一下今天要使用到的工具Lettuce,它是一个可伸缩线程安全的redis客户端。多个线程可以共享同一个RedisConnection,利用nio框架Netty来高效地管理多个连接。放眼望向...
- 轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)
-
1、缓存穿透所谓缓存穿透就是非法传输了一个在数据库中不存在的条件,导致查询redis和数据库中都没有,并且有大量的请求进来,就会导致对数据库产生压力,解决这一问题的方法如下:1、使用空缓存解决对查询到...
- Redis与本地缓存联手:多级缓存架构的奥秘
-
多级缓存(如Redis+本地缓存)是一种在系统架构中广泛应用的提高系统性能和响应速度的技术手段,它综合利用了不同类型缓存的优势,以下为你详细介绍:基本概念本地缓存:指的是在应用程序所在的服务器内...
- 腾讯云国际站:腾讯云服务器如何配置Redis缓存?
-
本文由【云老大】TG@yunlaoda360撰写一、安装Redis使用包管理器安装(推荐)在CentOS系统中,可以通过yum包管理器安装Redis:sudoyumupdate-...
- Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?
-
你是否在开发互联网大厂后端项目时,遇到过系统响应速度慢的问题?当高并发请求涌入,数据库压力剧增,响应时间拉长,用户体验直线下降。相信不少后端开发同行都被这个问题困扰过。其实,通过在SpringBo...
- 【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案
-
在我们使用redis时,也会存在一些问题,导致请求直接打到数据库上,导致数据库挂掉。下面我们来说说这些问题及解决方案。1、缓存穿透1.1场景一个请求进来后,先去redis进行查找,redis存在,则...
- Spring boot 整合Redis缓存你了解多少
-
在前一篇里面讲到了Redis缓存击穿、缓存穿透、缓存雪崩这三者区别,接下来我们讲解Springboot整合Redis中的一些知识点:之前遇到过,有的了四五年,甚至更长时间的后端Java开发,并且...
- 揭秘!Redis 缓存与数据库一致性问题的终极解决方案
-
在现代软件开发中,Redis作为一款高性能的缓存数据库,被广泛应用于提升系统的响应速度和吞吐量。然而,缓存与数据库之间的数据一致性问题,一直是开发者们面临的一大挑战。本文将深入探讨Redis缓存...
- 高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局
-
一、什么是缓存穿透?缓存穿透是指查询一个根本不存在的数据,导致请求直接穿透缓存层到达数据库,可能压垮数据库的现象。在高并发场景下,这尤其危险。典型场景:恶意攻击:故意查询不存在的ID(如负数或超大数值...
- Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决
-
缓存穿透菜小弟:我先问问什么是缓存穿透?我听说是缓存查不到,直接去查数据库了。表哥:没错。缓存穿透是指查询一个缓存中不存在且数据库中也不存在的数据,导致每次请求都直接访问数据库的行为。这种行为会让缓存...
- Redis中缓存穿透问题与解决方法
-
缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...
- Redis客户端缓存的几种实现方式
-
前言:Redis作为当今最流行的内存数据库和缓存系统,被广泛应用于各类应用场景。然而,即使Redis本身性能卓越,在高并发场景下,应用于Redis服务器之间的网络通信仍可能成为性能瓶颈。所以客户端缓存...
- Nginx合集-常用功能指导
-
1)启动、重启以及停止nginx进入sbin目录之后,输入以下命令#启动nginx./nginx#指定配置文件启动nginx./nginx-c/usr/local/nginx/conf/n...
- 腾讯云国际站:腾讯云怎么提升服务器速度?
-
本文由【云老大】TG@yunlaoda360撰写升级服务器规格选择更高性能的CPU、内存和带宽,以提供更好的处理能力和网络性能。优化网络配置调整网络接口卡(NIC)驱动,优化TCP/IP参数...
- 雷霆一击服务器管理员教程
-
本文转载莱卡云游戏服务器雷霆一击管理员教程(搜索莱卡云面版可搜到)首先你需要给服务器设置管理员密码,默认是空的管理员密码在启动页面进行设置设置完成后你需要重启服务器才可生效加入游戏后,点击键盘左上角E...
你 发表评论:
欢迎- 一周热门
-
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
WindowsServer2022|配置NTP服务器的命令
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
-
- 实战派 | Java项目中玩转Redis6.0客户端缓存
- 轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)
- Redis与本地缓存联手:多级缓存架构的奥秘
- 腾讯云国际站:腾讯云服务器如何配置Redis缓存?
- Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?
- 【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案
- Spring boot 整合Redis缓存你了解多少
- 揭秘!Redis 缓存与数据库一致性问题的终极解决方案
- 高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局
- Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)