docker-compose 搭建以太坊(Etherum)联盟链

摘要

今天干了件事,虽然不是很难吧,但是里面还是有一些坑,所以我想还是写个博客记录下来,同时也跟大家分享一下。
本文的主要内容包括:

  • 基于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

运行以下命令制作镜像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





网上已经有很多搭以太坊私联、联盟联的教程了,我就不说那些诸如准备创世文件的内容,可以参考我在后边列出的参考文档其中有详细过程,说一下上边内容中需要注意的地方。

  • 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后的[::] 为相应节点的IP地址。如:你要在node1中添加node0 , node0admin.nodeInfo.enode信息是enode://d465bcbd5c34da7f4b8e00cbf9dd18e7e2c38fbd6642b7435f340c7d5168947ff2b822146e1dc1b07e02f7c15d5ca09249a92f1d0caa34587c9b2743172259ee@[::]:30303 需要将最后的[::] 修改成该node0的IP地址。你可以在node2ping 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的启动和配置方法

你可能感兴趣的:(以太坊,区块链)