今天干了件事,虽然不是很难吧,但是里面还是有一些坑,所以我想还是写个博客记录下来,同时也跟大家分享一下。
本文的主要内容包括:
记录一些在部署过程的注意事项。
下面内容中的代码是我直接copy的我环境中的,所以大家在用的时候要根据自己的环境进行相应修改。
我原计划是在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
运行以下命令制作镜像docker build -t ubuntu:geth .
这一步由网络环境决定,可能会比较慢。我还在里面装了一些网络工具这样就可以使用常用的ipconfig
ping
等命令了
网上有很多内容,是使用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
网上已经有很多搭以太坊私联、联盟联的教程了,我就不说那些诸如准备创世文件的内容,可以参考我在后边列出的参考文档其中有详细过程,说一下上边内容中需要注意的地方。
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
进行连接的。[::]
为相应节点的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
所生成的所有文件`command: sh -c 'sleep 1000000'
前面的#
全部去掉,同时把另一个command
语句给注释掉。然后使用docker-compose -f docker-compose.yaml up
启动后执行下面所说的过程 geth --datadir ./ init genesis.json
该命令需要进入node0、node1 container中分别执行。bootnode -genkey bootnode.key
该命令需要进入bootnode container中执行。以产生bootnode.key ,然后使用命令bootnode -nodekey=bootnode.key
启动后我们可以看到类似如下输出:enode://4a9742409e3213c722814f2b39f6f7c9fec02482d2f0bfd917c243c0f7f02d341390420871cf04efb761fe2e7e7a5902738a51a17297dc522b25ea4dbd08324e@[::]:30301
[::]需要替换为bootnode容器的IP,然后将其复制的node0、node1
的启动command的 --bootnodes
参数后。一切准备就绪就可以使用命令docker-compose -f docker-compose.yaml up -d
启动了。可以使用参考文档中的测试过程测试我们新建的网络了。(测试方法我就不写了)
本文内容是非常的不详细,很多内容都省略了。所以要真正地从无到有地学会如何搭建私有联联盟联,大家还是要参考下边三篇文章,写的都非常详细。当有一天你需要使用docker-compose启动一个以太坊网络的时候,本文才能起到作用。