摘要
今天干了件事,虽然不是很难吧,但是里面还是有一些坑,所以我想还是写个博客记录下来,同时也跟大家分享一下。
本文的主要内容包括:
- 基于docker ubuntu:16.04镜像生成以太坊节点镜像(安装geth,并生成新的境像)
- 使用docker-compose启动三个docker container分别为 一个bootnode 和两个独立的以太坊节点
记录一些在部署过程的注意事项。
下面内容中的代码是我直接copy的我环境中的,所以大家在用的时候要根据自己的环境进行相应修改。
制作docker 镜像
我原计划是在docker hub 找一个现成的镜像来使用,但没找到合适的,所以我就自己基于ubuntu:16.04 镜像制作了一个。下面是Dockerfile内容
FROM ubuntu:16.04
RUN apt-get update \
&& apt install -y net-tools iputils-ping software-properties-common \
&& add-apt-repository -y ppa:ethereum/ethereum \
&& apt-get update \
&& apt-get install -y --allow-unauthenticated ethereum \
&& apt-get purge -y --auto-remove
- 1
- 2
- 3
- 4
- 5
- 6
- 7
运行以下命令制作镜像docker build -t ubuntu:geth .
这一步由网络环境决定,可能会比较慢。我还在里面装了一些网络工具这样就可以使用常用的ipconfig
ping
等命令了
编写docker-compose.yaml文件
网上有很多内容,是使用docker run 命令直接启动container的,但如果你想一次启动多个container就需要docker-compose,方便一些
version: '2'
services:
bootnode:
container_name: bootnode
image: ubuntu:geth
#command: sh -c 'sleep 1000000'
command: bootnode -nodekey=bootnode.key
working_dir: /data
volumes:
- /home/sglfe/Workspace/ethereum/study/dockernet/bootnode:/data
ports:
- 30301:30301
node0:
container_name: node0
image: ubuntu:geth
command: geth --datadir ./ --networkid 88 --rpcport 8545 --rpc --rpcaddr 0.0.0.0 --rpcapi db,eth,net,web3,personal,admin,miner --bootnodes enode://4a9742409e3213c722814f2b39f6f7c9fec02482d2f0bfd917c243c0f7f02d341390420871cf04efb761fe2e7e7a5902738a51a17297dc522b25ea4dbd08324e@172.21.0.2:30301
#command: sh -c 'sleep 1000000'
working_dir: /data
volumes:
- /home/sglfe/Workspace/ethereum/study/dockernet/node0-data:/data
ports:
- 8545:8545
- 30303:30303
depends_on:
- bootnode
node1:
container_name: node1
image: ubuntu:geth
command: geth --datadir ./ --networkid 88 --rpcport 8545 --rpc --rpcaddr 0.0.0.0 --rpcapi db,eth,net,web3,personal,admin,miner --bootnodes enode://4a9742409e3213c722814f2b39f6f7c9fec02482d2f0bfd917c243c0f7f02d341390420871cf04efb761fe2e7e7a5902738a51a17297dc522b25ea4dbd08324e@172.21.0.2:30301
#command: sh -c 'sleep 1000000'
working_dir: /data
volumes:
- /home/sglfe/Workspace/ethereum/study/dockernet/node1-data:/data
ports:
- 8546:8545
- 30304:30303
depends_on:
- bootnode
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
网上已经有很多搭以太坊私联、联盟联的教程了,我就不说那些诸如准备创世文件的内容,可以参考我在后边列出的参考文档其中有详细过程,说一下上边内容中需要注意的地方。
command: sh -c 'sleep 1000000'
这句是用于你进入docker container,使用geth命令手动启动以太坊网络,这样可方便测试、学习啊等。command: geth --datadir ./ --networkid 88 --rpcport 8545 --rpc --rpcaddr "0.0.0.0" --rpcapi "db,eth,net,web3,personal,admin,miner"
这句是让docker-compose 启动后自动启动geth网络。
注意:
- 在这里面需要注意的是
--rpcaddr "0.0.0.0"
这句一定要加,不然你在容器外是无法使用web3.js
进行连接的。 - 上述命令中没有–nodiscover 同时添加 –bootnodes <enode> 可以让以太坊网络自动发现节点。(如果不想自动发现节点而选择手动加入节点的话,具体方法可以参考最后给出的参考文档,但是一定要注意修改enode后的
[::]
为相应节点的IP地址。如:你要在node1
中添加node0
,node0
的admin.nodeInfo.enode
信息是enode://d465bcbd5c34da7f4b8e00cbf9dd18e7e2c38fbd6642b7435f340c7d5168947ff2b822146e1dc1b07e02f7c15d5ca09249a92f1d0caa34587c9b2743172259ee@[::]:30303
需要将最后的[::]
修改成该node0
的IP地址。你可以在node2
中ping node0
或者在node0
中执行ifconfig
以得到node0的IP地址) - 在节点启动后,你需要使用
geth --datadir=./ attach ipc:./geth.ipc console
命令打开相应节点的console。
- 在这里面需要注意的是
/home/sglfe/Workspace/ethereum/study/dockernet/node0-data:/data
这句里面 本地路径/home/sglfe/Workspace/ethereum/study/dockernet/node0-data
下放的是创世块配置文件,及使用geth --datadir ./ init genesis.json
所生成的所有文件- 虽然在最后给的参考文档里有诸如初始化创世块、bootnode启动的信息,但我在这里还是写一下,首先需要将上述docker-compose 文件中
`command: sh -c 'sleep 1000000'
前面的#
全部去掉,同时把另一个command
语句给注释掉。然后使用docker-compose -f docker-compose.yaml up
启动后执行下面所说的过程
- 初始化创世块:
geth --datadir ./ init genesis.json
该命令需要进入node0、node1 container中分别执行。 - 初始化bootnode并启动:
bootnode -genkey bootnode.key
该命令需要进入bootnode container中执行。以产生bootnode.key ,然后使用命令bootnode -nodekey=bootnode.key
启动后我们可以看到类似如下输出:enode://4a9742409e3213c722814f2b39f6f7c9fec02482d2f0bfd917c243c0f7f02d341390420871cf04efb761fe2e7e7a5902738a51a17297dc522b25ea4dbd08324e@[::]:30301
[::]需要替换为bootnode容器的IP,然后将其复制的node0、node1
的启动command的--bootnodes
参数后。
- 初始化创世块:
使用docker-compose启动
一切准备就绪就可以使用命令docker-compose -f docker-compose.yaml up -d
启动了。可以使用参考文档中的测试过程测试我们新建的网络了。(测试方法我就不写了)
参考文档
本文内容是非常的不详细,很多内容都省略了。所以要真正地从无到有地学会如何搭建私有联联盟联,大家还是要参考下边三篇文章,写的都非常详细。当有一天你需要使用docker-compose启动一个以太坊网络的时候,本文才能起到作用。
- 《 以太坊如何搭建私有连联盟链》如果只是对以太坊有所了解,从来没有搭过私有链、联盟链等,建议阅读本文
- 《 docker搭建以太坊私有链教程》使用docker进行手动配置的过程,讲的很详细。
- 《 以太坊bootnode测试》文中讲述了bootnode的启动和配置方法