百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

基于Ubuntu docker环境下进行以太坊实践

nanshan 2024-11-04 13:04 8 浏览 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

本篇文章由芯链团队整理。

相关推荐

服务器数据恢复—Raid5数据灾难不用愁,Raid5数据恢复原理了解下

Raid5数据恢复算法原理:分布式奇偶校验的独立磁盘结构(被称之为raid5)的数据恢复有一个“奇偶校验”的概念。可以简单的理解为二进制运算中的“异或运算”,通常使用的标识是xor。运算规则:若二者值...

服务器数据恢复—多次异常断电导致服务器raid不可用的数据恢复

服务器数据恢复环境&故障:由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档,上层安装的是Windowsserver操作系统,没有配置ups。因为服务器异常断电重启后,rai...

服务器数据恢复-V7000存储更换磁盘数据同步失败的数据恢复案例

服务器数据恢复环境:P740+AIX+Sybase+V7000存储,存储阵列柜上共12块SAS机械硬盘(其中一块为热备盘)。服务器故障:存储阵列柜中有磁盘出现故障,工作人员发现后更换磁盘,新更换的磁盘...

「服务器数据恢复」重装系统导致XFS文件系统分区丢失的数据恢复

服务器数据恢复环境:DellPowerVault系列磁盘柜;用RAID卡创建的一组RAID5;分配一个LUN。服务器故障:在Linux系统层面对LUN进行分区,划分sdc1和sdc2两个分区。将sd...

服务器数据恢复-ESXi虚拟机被误删的数据恢复案例

服务器数据恢复环境:一台服务器安装的ESXi虚拟化系统,该虚拟化系统连接了多个LUN,其中一个LUN上运行了数台虚拟机,虚拟机安装WindowsServer操作系统。服务器故障&分析:管理员因误操作...

「服务器数据恢复」Raid5阵列两块硬盘亮黄灯掉线的数据恢复案例

服务器数据恢复环境:HPStorageWorks某型号存储;虚拟化平台为vmwareexsi;10块磁盘组成raid5(有1块热备盘)。服务器故障:raid5阵列中两块硬盘指示灯变黄掉线,无法读取...

服务器数据恢复—基于oracle数据库的SAP数据恢复案例

服务器存储数据恢复环境:某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列,其中有1块硬盘作为热备盘使用。上层划分若干lun,存放Oracle数据库数据。服务器存储故障&分析:该RAID5阵...

「服务器虚拟化数据恢复」Xen Server环境下数据库数据恢复案例

服务器虚拟化数据恢复环境:Dell某型号服务器;数块STAT硬盘通过raid卡组建的RAID10;XenServer服务器虚拟化系统;故障虚拟机操作系统:WindowsServer,部署Web服务...

服务器数据恢复—RAID故障导致oracle无法启动的数据恢复案例

服务器数据恢复环境:某品牌服务器中有一组由4块SAS磁盘做的RAID5磁盘阵列。该服务器操作系统为windowsserver,运行了一个单节点Oracle,数据存储为文件系统,无归档。该oracle...

服务器数据恢复—服务器磁盘阵列常见故障表现&amp;解决方案

RAID(磁盘阵列)是一种将多块物理硬盘整合成一个虚拟存储的技术,raid模块相当于一个存储管理的中间层,上层接收并执行操作系统及文件系统的数据读写指令,下层管理数据在各个物理硬盘上的存储及读写。相对...

「服务器数据恢复」IBM某型号服务器RAID5磁盘阵列数据恢复案例

服务器数据恢复环境:IBM某型号服务器;5块SAS硬盘组成RAID5磁盘阵列;存储划分为1个LUN和3个分区:第一个分区存放windowsserver系统,第二个分区存放SQLServer数据库,...

服务器数据恢复—Zfs文件系统下误删除文件如何恢复数据?

服务器故障:一台zfs文件系统服务器,管理员误操作删除服务器上的数据。服务器数据恢复过程:1、将故障服务器所有磁盘编号后取出,硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做...

服务器数据恢复—Linux+raid5服务器数据恢复案例

服务器数据恢复环境:某品牌linux操作系统服务器,服务器中有4块SAS接口硬盘组建一组raid5阵列。服务器中存放的数据有数据库、办公文档、代码文件等。服务器故障&检测:服务器在运行过程中突然瘫痪,...

服务器数据恢复—Sql Server数据库数据恢复案例

服务器数据恢复环境:一台安装windowsserver操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。在windows服务器内装有SqlServer数据库。存储空间LU...

服务器数据恢复—阿里云ECS网站服务器数据恢复案例

云服务器数据恢复环境:阿里云ECS网站服务器,linux操作系统+mysql数据库。云服务器故障:在执行数据库版本更新测试时,在生产库误执行了本来应该在测试库执行的sql脚本,导致生产库部分表被tru...

取消回复欢迎 发表评论: