基于Ubuntu Docker環(huán)境下進(jìn)行以太坊實(shí)踐區(qū)塊鏈
本文是指導(dǎo)以太坊技術(shù)愛好者,通過基于Ubuntu環(huán)境下通過docker來進(jìn)行以太坊的客戶端安裝和調(diào)試的指導(dǎo)教程。
本文是指導(dǎo)以太坊技術(shù)愛好者,通過基于Ubuntu環(huán)境下通過docker來進(jìn)行以太坊的客戶端安裝和調(diào)試的指導(dǎo)教程。
目錄
1、實(shí)踐環(huán)境要求
2、Ubuntu版本說明
3、Docker安裝
4、Ethereum安裝與實(shí)踐
5、ZSH小工具推薦
1 實(shí)踐環(huán)境要求
1.1 概述
https://docs.docker.com/engine/installation/linux/ubuntulinux/
上面這篇文章主要指導(dǎo)你去安裝使用Docker-managed發(fā)布包及其安裝機(jī)制。使用這些包確保你獲得最近的docker官方發(fā)布版本。如果你需要安裝使用Ubuntu-managed包,查閱Ubuntu文檔。
1.2 docker對(duì)操作系統(tǒng)支持
Ubuntu Xenial 16.04[LTS]
Ubuntu Trusty 14.04[LTS]
Ubuntu Precise 12.04[LTS]
1.3 前置需求
不管你是Ubuntu的哪個(gè)版本,Docker需要64的操作系統(tǒng)。此外你的kernel內(nèi)核至少要在3.10版本之上。最近的3.10小版本或者最新的維護(hù)版本也是可以接受的。kernel3.10版本之前的系統(tǒng)缺少一些特性來運(yùn)行docker容器。這些舊版本有些已知的bugs會(huì)導(dǎo)致數(shù)據(jù)丟失并且在一定條件下會(huì)頻繁的故障。檢查你當(dāng)前的kernel版本,打開終端,輸入uname –r
注意:如果你之前使用APT安裝過docker,為了新版本的docker倉庫,確保你更新了APT源。
1.4 更新apt源
Docker的APT倉庫包含1.7.1以及更高的版本。通過設(shè)置APT使用來自docker倉庫的包。
1) 登陸機(jī)器,用戶必須使用sudo或者root權(quán)限。
2) 打開終端
3) 更新包信息,確保APT能使用https方式工作,并且CA證書已安裝了
1 2 3 |
#sudo apt-get update#sudo apt-get install apt-transport-https ca-certificates |
出現(xiàn)這個(gè)問題可能是有另一個(gè)程序正在運(yùn)行,導(dǎo)致資源被鎖不可用。而導(dǎo)致資源被鎖的原因可能是上次運(yùn)行安裝或更新沒有正常完成,解決辦法就是刪掉。
1 2 3 |
#sudo rm /var/cache/apt/archives/lock#sudo rm /var/lib/dpkg/lock |
4)添加一個(gè)新的GPG密鑰
1 |
#sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D |
5)找到合適你的Ubuntu操作系統(tǒng)的鍵,這個(gè)鍵決定APT將搜索哪個(gè)包??赡艿逆I有:
Ubuntu version: Precise 12.04, Trusty 14.04,Cenial 16.04
注意:docker沒有為所有的架構(gòu)提供包,Binary artifacts are built nightly,你可以從以下鏈接下載。
https://master.dockerproject.org. 在一個(gè)多架構(gòu)的系統(tǒng)上安裝docker,為鍵添加一個(gè)[arch=]條款。更多細(xì)節(jié)參考Debian Multiarch維基百科。
6)運(yùn)行下面的命令,用占位符為你的操作系統(tǒng)替換鍵。
#echo “” | sudo tee /etc/apt/sources.list.d/docker.list
比如你是16.04將上面命令的
替換成deb https://apt.dockerproject.org/repoubuntu-xenial main 執(zhí)行那條命令,就在那個(gè)文件夾下創(chuàng)建了一個(gè)docker.list文件,里面的內(nèi)容就是
deb https://apt.dockerproject.org/repoubuntu-xenial main
7)更新APT包索引
1 |
#sudo apt-get update |
8)校驗(yàn)APT是從一個(gè)正確的倉庫拉取安裝包。
當(dāng)運(yùn)行下面命令的時(shí)候,這個(gè)鍵會(huì)返回你目前可以安裝的docker版本,每個(gè)鍵都包括URL:https://apt.dockerproject.org/repo/。下面是截取的部分輸出內(nèi)容。
1 |
#apt-cache policy docker-engine |
現(xiàn)在當(dāng)你運(yùn)行apt-get upgrade的時(shí)候,APT就會(huì)從新的倉庫拉安裝包。
2 Ubuntu版本說明
2.1 前置準(zhǔn)備操作
Ubuntu Xenial 16.04[LTS],Ubuntu Trusty 14.04[LTS]這兩個(gè)版本記得安裝linux-iamge-extra-*的kernel包。這個(gè)包允許你使用aufs存儲(chǔ)驅(qū)動(dòng)。
# sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
Ubuntu Precise 12.04[LTS]對(duì)于這個(gè)版本,你需要3.13以上的kernel版本,你必須升級(jí)。下面表格指導(dǎo)你需要哪些包:
你可以執(zhí)行以下命令:
1 2 3 |
#sudo apt-get install linux-image-generic-lts-trusty#sudo reboot |
3 Docker安裝
3.1 前置操作
1).登陸系統(tǒng),用你的賬號(hào)使用sudo全權(quán)限
2).運(yùn)行命令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后臺(tái)進(jìn)程:sudo service docker start
6).校驗(yàn)docker是否安裝成功:sudo docker run hello-world
這個(gè)命令會(huì)下載一個(gè)測試鏡像,并且運(yùn)行在一個(gè)容器中。當(dāng)容器運(yùn)行時(shí),他會(huì)打印一些信息,并且退出。
3.2 創(chuàng)建一個(gè)docker組
docker后臺(tái)進(jìn)程是綁定的Unix的socket而不是TCP端口。默認(rèn)情況下,Unix的socket屬于用戶root,其它用戶要使用要通過sudo命令。由于這個(gè)原因,docker daemon通常使用root用戶運(yùn)行。為了避免使用sudo當(dāng)你使用docker命令的時(shí)候,創(chuàng)建一個(gè)Unix組名為docker并且添加用戶。當(dāng)docker daemon啟動(dòng),它會(huì)分配Unix socket讀寫權(quán)限給所屬的docker組。
注意:docker組不等價(jià)于用戶root,如果想要知道的更多關(guān)于安全影響,查看docker daemon attack surface。
1 2 3 |
#sudo groupadd docker#sudo usermod -aG docker $USER |
退出再重進(jìn),確保該用戶有正確的權(quán)限。校驗(yàn)生效,通過運(yùn)行docker命令不帶sudo:docker run hello-world,如果失敗會(huì)有以下類似的信息:Cannot connect to the Docker daemon. Is ‘docker daemon’ running on this host?確保DOCKER_HOST環(huán)境變量沒有設(shè)置。如果有取消它。
3.3 調(diào)整內(nèi)存和交換區(qū)計(jì)算
當(dāng)用戶運(yùn)行docker時(shí),他們可能在使用一個(gè)鏡像時(shí)看見下面的信息:
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
為了阻止這些信息,在你的系統(tǒng)中啟用內(nèi)存和交換區(qū)計(jì)算。這個(gè)操作會(huì)導(dǎo)致即便docker沒有使用也有內(nèi)存開銷以及性能下降。內(nèi)存開銷大概是總內(nèi)存的1%。性能降低了大約10%。
修改/etc/default/grub文件。vi或者vim命令都行,設(shè)置GRUB_CMDLINE_LINUX的值,如下:
GRUB_CMDLINE_LINUX=“cgroup_enable=memory swapaccount=1”。
保存文件并關(guān)閉。
1 |
#sudo update-grub |
更新啟動(dòng)項(xiàng),reboot重啟你的系統(tǒng)。
3.4 啟動(dòng)UFW轉(zhuǎn)發(fā)
當(dāng)你運(yùn)行docker時(shí),在同一臺(tái)主機(jī)上使用UFW(Uncomplicated Firewall) ,你需要額外的配置。docker使用橋接方式來管理容器的網(wǎng)絡(luò)。默認(rèn)情況下,UFW廢棄所有的轉(zhuǎn)發(fā)流量。因此,docker運(yùn)行時(shí)UFW可以使用,你必須設(shè)置合適UFW的轉(zhuǎn)發(fā)規(guī)則。
UFW默認(rèn)配置規(guī)則拒絕了所有傳入流量。如果你想要從另一個(gè)主機(jī)到達(dá)你的容器需要允許連接docker的端口。docker的默認(rèn)端口是2376如果TLS啟用,如果沒有啟動(dòng)則是2375,會(huì)話是不加密的。默認(rèn)情況,docker運(yùn)行在沒有TLS啟動(dòng)的情況下。
為了配置UFW并且允許進(jìn)入的連接docker端口:
檢查UFW是否安裝并啟用:
1 |
#sudo ufw status |
打開/etc/default/ufw文件并編輯:
1 |
#sudo nano /etc/default/ufw |
設(shè)置DEFAULT_FORWARD_POLICY:DEFAULT_FORWARD_POLICY=“ACCEPT”
保存退出并重啟使用新的設(shè)置:
1 |
#sudo ufw reload |
允許所有的連接到docker端口:
1 |
#sudo ufw allow 2375/tcp |
3.5 為docker配置DNS服務(wù)器
系統(tǒng)運(yùn)行桌面的Ubuntu或者Ubuntu衍生產(chǎn)品通常使用127.0.0.1作為默認(rèn)的nameserver文件/etc/resolv.conf文件中。NetworkManager也通常設(shè)置dnsmasq nameserver 127.0.0.1在/etc/resolv.conf。
當(dāng)在桌面機(jī)器運(yùn)行容器,使用這些配置時(shí),docker的使用者會(huì)看見這些警告:
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]
這個(gè)警告發(fā)生是因?yàn)閐ocker容器不能使用本地DNS命名服務(wù)器。此外docker默認(rèn)使用一個(gè)額外的nameserver。
為了避免這個(gè)警告,你可以在使用docker容器的時(shí)候指定一個(gè)DNS服務(wù)器。或者你可以禁用dnsmasq在NetworkManager中。但是,禁用會(huì)導(dǎo)致DNS協(xié)議在某些網(wǎng)絡(luò)中變慢。
下面的說明描述了如何在Ubuntu14.0或以下版本配置docker守護(hù)進(jìn)程。Ubuntu15.04及之上的使用systemd用于啟動(dòng)項(xiàng)和服務(wù)管理。指導(dǎo)通過使用systemd來配置和控制一個(gè)守護(hù)進(jìn)程。
設(shè)置指定的DNS服務(wù):
打開/etc/default/docker文件并編輯:sudo nano /etc/default/docker,添加配置項(xiàng):DOCKER_OPTS=“—dns 8.8.8.8”。將8.8.8.8用一個(gè)本地的DNS服務(wù)例如192.168.1.1替換。你也可以配置多個(gè)DNS服務(wù)器。
用空格隔開它們,如:—dns 8.8.8.8 —dns 192.168.1.1。
警告:當(dāng)你在筆記本連接了不同網(wǎng)絡(luò)的情況時(shí)做這些操作,確保選擇一個(gè)公用的DNS服務(wù)器。保存文件并退出,重啟docker守護(hù)進(jìn)程:sudo service docker restart?;蛘吡硪粋€(gè)選擇,禁用dnsmasq在網(wǎng)絡(luò)管理器中,這可能導(dǎo)致你的網(wǎng)速變慢:
打開/etc/NetworkManager/NetworkManager.conf文件,
編輯它:sudo nano /etc/NetworkManager/NetworkManager.conf。
找到行dns=dnsmasq,注釋掉。
保存關(guān)閉文件,重啟網(wǎng)絡(luò)管理器和docker.
1 2 3 |
#sudo restart network-manager#sudo restart docker |
3.6 配置docker引導(dǎo)啟動(dòng)
Ubuntu15.04之后使用systemd作為引導(dǎo)啟動(dòng)和服務(wù)管理,14.10及以下版本是upstart。15.04以上,需要配置docker守護(hù)進(jìn)程boot啟動(dòng),
運(yùn)行命令:
1 |
#sudo systemctl enable docker |
14.10及以下版本安裝方法會(huì)自動(dòng)配置upstart來啟動(dòng)docke daemon在boot。
3.7 升級(jí)卸載docker
升級(jí):
1 |
#sudo apt-get upgrade docker-engine |
卸載:
1 |
#sudo apt-get purge docker-engine |
卸載及依賴:
1 |
#sudo apt-get autoremove --purge docker-engine |
上述命令不會(huì)卸載images,containers,volumes或者用戶自己創(chuàng)建的配置文件。
你如果想刪除這些東西,執(zhí)行下面的命令:
1 |
#rm -rf /var/lib/docker |
安裝最簡單的方法是:
1 2 3 |
#sudo apt-get update #sudo apt-get install |
3.8 執(zhí)行docker-compose安裝
docker-compose 是用于定義和運(yùn)行復(fù)雜docker應(yīng)用的工具,以yaml定義語言在一個(gè)docker-compose.yaml文件中定義一個(gè)包括多容器的應(yīng)用,用一條命令即可啟動(dòng)應(yīng)用中包括的所有docker container,容器啟動(dòng)所有依賴的動(dòng)作都會(huì)被工具自動(dòng)完成。
1 2 3 |
#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安裝與實(shí)踐
4.1 通過docker安裝Ethereum
運(yùn)行如下命令
1 |
#docker pull docker.io/ethereum/client-go |
4.2 直接安裝Ethereum
運(yùn)行如下命令
1 2 3 |
#apt-get update#apt-get install software-properties-common add-apt-repository -y ppa:ethereum/ethereum |
安裝一個(gè)穩(wěn)定版本的以太坊
1 2 3 4 5 |
#apt-get update#apt-get install ethereum#apt-get update |
生成引導(dǎo)節(jié)點(diǎn)ID
1 |
#bootnode --genkey=boot.key |
運(yùn)行引導(dǎo)節(jié)點(diǎn)
1 |
#bootnode --nodekey=boot.key |
4.3 新建genesis.json文件
運(yùn)行以下命令
1 |
vi genesis.json |
輸入
4.4 初始化創(chuàng)始區(qū)塊
運(yùn)行如下命令
1 |
#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 創(chuàng)建Ethereum節(jié)點(diǎn)的容器
運(yùn)行如下命令
1 2 3 |
#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節(jié)點(diǎn)docker日志
運(yùn)行如下命令
1 |
#docker logs -f gethDev1 |
4.7啟動(dòng)Ethereum節(jié)點(diǎn)
運(yùn)行如下命令
1 |
#docker startgethDev1 |
4.8 Attach Ethereum節(jié)點(diǎn)
運(yùn)行如下命令
1 |
#docker attach gethDev1 |
4.9 Detach Ethereum節(jié)點(diǎn)
先后按下鍵盤ctrl p q退出節(jié)點(diǎn),注意:有先后順序
4.10 停止Ethereum節(jié)點(diǎn)
運(yùn)行命令如下
1 |
#docker stopgethDev1 |
4.11 Ethereum日志釋疑
首先,告警提示geth抱怨沒有定義etherbase,etherbase是成功挖掘區(qū)塊,執(zhí)行智能合約并在區(qū)塊鏈內(nèi)返回結(jié)果之后用來接收以太獎(jiǎng)勵(lì)的“默認(rèn)以太坊地址”。這個(gè)帳戶,在開發(fā)合同時(shí)也很方便。
接下來,我們看到blockchain數(shù)據(jù)被寫入/root/.ethereum/chaindata,因?yàn)槲覀円呀?jīng)從我們的主機(jī)掛載了這個(gè)目錄,我們應(yīng)該可以在本地磁盤上看到出現(xiàn)的數(shù)據(jù):
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
在當(dāng)前配置中,我們有一個(gè)可以掛載到我們的容器中的以太坊數(shù)據(jù)目錄。這不是因?yàn)閰^(qū)塊鏈數(shù)據(jù)只能在任何情況下由一個(gè)進(jìn)程訪問,而是訪問可由Ethereum節(jié)點(diǎn)用于進(jìn)程間通信的IPC文件描述符。因此,我們可以在這里繼續(xù),而不需要訪問網(wǎng)絡(luò)。
5 zsh小工具推薦
zsh是一款小工具,對(duì)命令補(bǔ)全功能非常強(qiáng)大,可以補(bǔ)齊路徑,補(bǔ)齊命令,補(bǔ)齊參數(shù)等。
5.1 修改root用戶SHELL
先進(jìn)入root用戶,命令:
1 |
su root |
查看默認(rèn)SHELL命令:
1 |
echo $SHELL |
然后查看是否安裝了zsh,命令:
1 |
cat /etc/shells |
默認(rèn)沒有安裝,那么先安裝zsh,命令:
1 |
apt-get install zsh |
確認(rèn)zsh是否安裝成功,命令:
1 |
zsh --version |
接下來替換bash為zsh,命令:
1 |
chsh -s /bin/zsh |
然后reboot重啟,之后查看默認(rèn)SHELL,發(fā)現(xiàn)修改為/bin/zsh
查看是否安裝git,命令:
1 |
git –version |
如果沒有安裝則安裝,命令:
1 |
apt-get install git |
最后下載oh-my-zsh,命令:
1 |
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" |
出現(xiàn)如上則安裝成功,重新進(jìn)入終端即可。
5.2 修改普通用戶SHELL
查看默認(rèn)SHELL,命令:
1 |
echo $SHELL |
如果是/bin/zsh則直接:
1 |
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" |
是/bin/bash則,切換:
1 |
chsh -s /bin/zsh |
然后用root權(quán)限r(nóng)eboot,然后:
1 |
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
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。