2. 启动支持Docker_VM的链

2.1. 通过管理台启动启用Docker虚拟机的链

2.1.1. 登录

  • 私有化部署本平台时会生成的对应的admin账号,默认密码为a123456

2.1.1.1. 新增组织证书

  • 填写组织ID和组织名称

  • 组织和和组织名称不能重复

  • 支持申请国密和非国密两种证书。

2.1.1.2. 新增节点证书

  • 目前节点证书角色分为共识节点和同步节点两种。

  • 通过填写节点名称、组织信息,节点角色,申请节点证书。

  • 支持申请国密和非国密两种证书。

2.1.1.3. 新增用户证书

  • 目前用户证书角色分为admin、client和light三种。

  • 通过填写用户名称、组织信息,用户角色申请用户证书。

  • 支持申请国密和非国密两种证书。

  • 合约部署需要对应的管理员证书,所以需要申请对应的管理员用户

2.1.1.4. 新建区块链

  • 选择证书模式

  • 链配置文件参数设定

    • 此处用于新增链配置文件,目前支持自定义链的id、名称、区块最大容量,出块间隔、交易过期时长,以及共识配置。

    • 目前支持配置TBFT、RAFT、SOLO、MAXBFT共识。

    • 申请链配置文件前,请先确保,所需的组织和节点证书已经申请/导入本管理平台。

    • 此处需要勾选Docker_VM

    • 支持单机部署和多机部署,请正确填写所要之后要部署区块链节点的机器所在的ip,并确保端口不冲突。

2.1.1.5. 下载部署链

  • 如图所示需要先下载安装Docker_VM的环境依赖,然后再部署区块链。

  • 部署区块链

    • 下载链配置以zip包为准,zip包包含对应的链配置文件和部署脚本

    • 将下载的包移动的需要部署的机器上去(可以使用scp进行移动)

    • 执行unzip解压成release包,进入release包执行start.sh进行启动

2.1.1.6. 快速订阅链

  • 链部署成功之后在管理台进行快速订阅

2.1.1.7. 部署/调用合约验证链是否正常

订阅成功后,可进行部署/调用示例合约,以检查链功能是否正常。部署合约的使用教程可详见:部署示例合约

2.2. 通过命令行启动启用Docker虚拟机的链

2.2.1. 环境依赖

操作系统

DockerVM依赖于cgroup v1,目前仅支持在Linux系统下部署和运行DockerVM。

注:检查系统cgroup版本的方法如下,v2的输出为cgroup2fs,v1的输出为tmpfs(ubuntu22.04版本开始默认为v2)。

stat -fc %T /sys/fs/cgroup/

软件依赖

docker,7zip

依赖软件下载:

拉取官方Docker虚拟机镜像:

# docker go image
docker pull chainmakerofficial/chainmaker-vm-engine:v3.0.1

# docker java image
docker pull chainmakerofficial/chainmaker-vm-engine-java:v3.0.0

2.2.2. 生成证书并初始化配置

启用Docker VM

Docker VM目前支持go和java两种语言来编写合约,在chainmaker中启用Docker VM有两种方式。

方式一:

通过命令行工具启动链,在执行prepare.shprepare_pk.shprepare_pwk.sh时,enable docker go vm 选择 YES,或者enable docker java vm 选择 YES。可以同时启用docker go 和docker java。

enable docker go vm (YES|NO(default))
enable docker java vm (YES|NO(default))
  • 进入chainmaker-go/scripts目录,执行prepare.sh脚本生成单链4节点集群配置,存于路径chainmaker-go/build中

  • prepare_pk.sh脚本支持生成4/7/10/13/16节点公私钥和配置

# 进入脚本目录
$ cd ../scripts
# 查看脚本帮助
$ ./prepare.sh -h
Usage:  
    prepare.sh node_cnt(1/4/7/10/13/16) chain_cnt(1-4)
               p2p_port(default:11301) rpc_port(default:12301)
               docker_vm_runtime_port(default:32351) docker_go_engine_port(default:22351)
               docker_java_engine_port(default:23351)
               -c consense-type: 1-TBFT,3-MAXBFT,4-RAFT 
               -l log-level: DEBUG,INFO,WARN,ERROR
               -v docker-vm-enable: true,false
                  --vlog vm go log level: DEBUG,INFO,WARN,ERROR
               -j docker-java-enable: true,false
                  --jlog vm go log level: DEBUG,INFO,WARN,ERROR
               -h show help
    eg1: prepare.sh 4 1
    eg2: prepare.sh 4 1 11301 12301
    eg2: prepare.sh 4 1 11301 12301 32351 22351 23351
    eg2: prepare.sh 4 1 11301 12301 32351 22351 23351 -c 1 -l INFO -v true   -j true  --vlog=INFO --jlog=INFO
    eg2: prepare.sh 4 1 11301 12301 32351 22351 23351 -c 1 -l INFO -v false  -j false --vlog=INFO --jlog=INFO

# 生成单链4节点集群的证书和配置
./prepare.sh 4 1
begin check params...
param P2P_PORT 11301
param RPC_PORT 12301
param DOCKER_VM_RUNTIME_PORT 32351
param DOCKER_GO_ENGINE_PORT 22351
param DOCKER_JAVA_ENGINE_PORT 23351
input consensus type (1-TBFT(default),3-MAXBFT,4-RAFT,6-ABFT): 
param CONSENSUS_TYPE 1
input log level (DEBUG|INFO(default)|WARN|ERROR): 
param LOG_LEVEL INFO
enable vm go (YES|NO(default))YES
input vm go log level (DEBUG|INFO(default)|WARN|ERROR): 
param DOCKER_GO_LOG_LEVEL INFO
param ENABLE_VM_GO true
enable vm java (YES|NO(default))YES
input vm java log level (DEBUG|INFO(default)|WARN|ERROR): 
param DOCKER_JAVA_LOG_LEVEL INFO
param ENABLE_VM_JAVA true
config node total 4
begin generate node1 config...
begin node1 chain1 cert config...
begin node1 trust config...
begin generate node2 config...
begin node2 chain1 cert config...
begin node2 trust config...
begin generate node3 config...
begin node3 chain1 cert config...
begin node3 trust config...
begin generate node4 config...
begin node4 chain1 cert config...
begin node4 trust config...

# 查看生成好的节点证书和配置
$ tree -L 3 ../build/
../build/
├── backup
│   ├── backup_certs
│      └── crypto-config_20230828153411
│   ├── backup_config
│      └── config_20230828153422
│   └── backup_release
│       └── release_20230828172931
├── config
│   ├── node1
│      ├── certs
│      ├── chainconfig
│      ├── chainmaker.yml
│      └── log.yml
│   ├── node2
│      ├── certs
│      ├── chainconfig
│      ├── chainmaker.yml
│      └── log.yml
│   ├── node3
│      ├── certs
│      ├── chainconfig
│      ├── chainmaker.yml
│      └── log.yml
│   └── node4
│       ├── certs
│       ├── chainconfig
│       ├── chainmaker.yml
│       └── log.yml
├── crypto-config
│   ├── wx-org1.chainmaker.org
│      ├── ca
│      ├── node
│      └── user
│   ├── wx-org2.chainmaker.org
│      ├── ca
│      ├── node
│      └── user
│   ├── wx-org3.chainmaker.org
│      ├── ca
│      ├── node
│      └── user
│   └── wx-org4.chainmaker.org
│       ├── ca
│       ├── node
│       └── user
├── crypto_config.yml
├── release
│   ├── chainmaker-v3.0.0-wx-org1.chainmaker.org-20230828172923-x86_64.tar.gz
│   ├── chainmaker-v3.0.0-wx-org2.chainmaker.org-20230828172923-x86_64.tar.gz
│   ├── chainmaker-v3.0.0-wx-org3.chainmaker.org-20230828172923-x86_64.tar.gz
│   ├── chainmaker-v3.0.0-wx-org4.chainmaker.org-20230828172923-x86_64.tar.gz
│   └── crypto-config-20230828172923.tar.gz
└── test_keys.yml

方式二

修改节点配置目录下的chainmaker.yml文件,根据需要配置不同的虚拟机是否启用(enable设置为truefalse):

vm:
  go:
    # 是否启用新版Golang容器
    enable: true

  java:
    # 是否启用新版Java容器
    enable: true

2.2.3. DockerVM配置

配置信息说明

chainmaker.yml 文件相关配置如下:

vm:
  common:
    # 与虚拟机引擎grpc通信的最大消息发送大小, 默认100MB
    max_send_msg_size: 100
    # 与虚拟机引擎grpc通信的最大消息接收大小, 默认100MB
    max_recv_msg_size: 100
    # 与虚拟机引擎grpc通信的最大连接超时时间, 默认10s
    dial_timeout: 10

    # 运行时服务器配置 (与合约实例进程交互,进行信息交换)
    runtime_server:
      # 端口号,默认为 32351
      port: 32351

  go:
    # 是否启用新版Golang容器
    enable: true
    # 数据挂载路径, 包括合约、sock文件(uds)
    data_mount_path: ../data/wx-org1.chainmaker.org/go
    # 日志挂载路径
    log_mount_path: ../log/wx-org1.chainmaker.org/go

    # 如果需要自定义高级配置,请将vm.yml文件放入dockervm_config_path中,优先级:chainmaker.yml > vm.yml > 默认配置
    # dockervm_config_path: /config_path/vm.yml
    # 是否在控制台打印日志
    log_in_console: false
    # docker合约引擎的日志级别
    log_level: DEBUG


    # 合约引擎最多启用的原始合约进程数,默认为20(跨合约调用会额外拉起新的进程)
    max_concurrency: 20

    # 合约引擎服务器配置 (与chainmaker交互,进行交易请求、合约请求等交互)
    contract_engine:
      # 合约引擎服务器ip, 默认为 127.0.0.1
      host: 127.0.0.1
      # 端口号,默认为 22351
      port: 22351
      # 与合约引擎服务器的最大连接数
      max_connection: 5

  java:
    # 是否启用Java容器
    enable: true
    # 数据挂载路径, 包括合约、sock文件(uds)
    data_mount_path: ../data/wx-org1.chainmaker.org/java
    # 日志挂载路径
    log_mount_path: ../log/wx-org1.chainmaker.org/java

    # 如果需要自定义高级配置,请将vm.yml文件放入dockervm_config_path中,优先级:chainmaker.yml > vm.yml > 默认配置
    # dockervm_config_path: /config_path/vm.yml
    # 是否在控制台打印日志
    log_in_console: false
    # docker合约引擎的日志级别
    log_level: DEBUG


    # 合约引擎最多启用的原始合约进程数,默认为20(跨合约调用会额外拉起新的进程)
    max_concurrency: 20

    # 合约引擎服务器配置 (与chainmaker交互,进行交易请求、合约请求等交互)
    contract_engine:
      # 合约引擎服务器ip, 默认为 127.0.0.1
      host: 127.0.0.1
      # 端口号,默认为 23351
      port: 23351
      # 与合约引擎服务器的最大连接数
      max_connection: 5

高级配置

如果希望使用合约引擎高级配置,需要配置vm:godockervm_config_path中配置文件,配置文件模板如下:

########### RPC ###########
rpc:
  chain_rpc_protocol: 1 # chain rpc protocol, 0 for unix domain socket, 1 for tcp(default)
  chain_host: 127.0.0.1 # chain tcp host
  chain_rpc_port: 22351 # chain rpc port, valid when protocol is tcp
  sandbox_rpc_port: 32351 # sandbox rpc port, valid when protocol is tcp
  max_send_msg_size: 100 # max send msg size(MiB)
  max_recv_msg_size: 100 # max recv msg size(MiB)
  server_min_interval: 60s # server min interval
  connection_timeout: 5s # connection timeout time
  server_keep_alive_time: 60s # idle duration before server ping
  server_keep_alive_timeout: 20s # ping timeout

########### Process ###########
process:
  # max original process num,
  # max_call_contract_process_num = max_original_process_num * max_contract_depth (defined in protocol)
  # max_total_process_num = max_call_contract_process_num + max_original_process_num
  max_original_process_num: 20
  exec_tx_timeout: 8s # process timeout while busy
  waiting_tx_time: 200ms # process timeout while tx completed (busy -> idle)
  release_rate: 30 # percentage of idle processes released periodically in total processes (0-100)
  release_period: 10m # period of idle processes released periodically in total processes

########### Log ###########
log:
  contract_engine:
    level: "info"
    console: true
  sandbox:
    level: "info"
    console: true

########### Pprof ###########
pprof:
  contract_engine:
    enable: false
    port: 21215
  sandbox:
    enable: false
    port: 21522

########### Contract ###########
contract:
  max_file_size: 20480 # contract size(MiB)

⚠️注意:

在容器启动脚本中,max_concurrency(最大启用的进程数量)默认为20(跨合约调用会额外拉起新的进程)。

如果是在生产环境下,建议根据cpu核数配置这三个参数。

8C CPU 16C CPU 32C CPU
max_concurrency 20 100 1500

如果有较多跨合约调用交易,请根据跨合约调用的深度按比例减少max_concurrency的值,例如32核系统下,如果有较多两层跨合约调用,则max_concurrency值建议设为750(1500/2)

如果使用脚本启动,请按需修改脚本里的参数配置。

2.2.4. 编译和安装包制作

  • 生成证书(prepare.sh脚本)后执行build_release.sh脚本,将编译chainmaker-go模块,并打包生成安装,存于路径chainmaker-go/build/release中

$ ./build_release.sh
$ tree ../build/release/
../build/release/
├── chainmaker-v3.0.0-wx-org1.chainmaker.org-20220823193812-x86_64.tar.gz
├── chainmaker-v3.0.0-wx-org2.chainmaker.org-20220823193812-x86_64.tar.gz
├── chainmaker-v3.0.0-wx-org3.chainmaker.org-20220823193812-x86_64.tar.gz
├── chainmaker-v3.0.0-wx-org4.chainmaker.org-20220823193812-x86_64.tar.gz
└── crypto-config-20220823193812.tar.gz

2.2.5. 同时启动链和DockerVM

启动

  • 执行cluster_quick_start.sh脚本,会解压各个安装包,调用bin目录中的start.sh脚本,启动chainmaker节点,并拉起节点需要的DockerVM容器

$ ./cluster_quick_start.sh normal

查看节点是否存在

  • 查看进程

root      998263       1  1 17:38 pts/0    00:00:00 ./chainmaker start -c ../config/wx-org1.chainmaker.org/chainmaker.yml name-20230828172931
root     1000785       1  1 17:38 pts/0    00:00:00 ./chainmaker start -c ../config/wx-org2.chainmaker.org/chainmaker.yml name-20230828172931
root     1003164       1  1 17:38 pts/0    00:00:00 ./chainmaker start -c ../config/wx-org3.chainmaker.org/chainmaker.yml name-20230828172932
root     1005601       1  1 17:38 pts/0    00:00:00 ./chainmaker start -c ../config/wx-org4.chainmaker.org/chainmaker.yml name-20230828172932
  • 查看端口

$ netstat -lptn | grep 1230
tcp6       0      0 :::12301                :::*                    LISTEN      2058348/./chainmake
tcp6       0      0 :::12302                :::*                    LISTEN      2059604/./chainmake
tcp6       0      0 :::12303                :::*                    LISTEN      2060801/./chainmake
tcp6       0      0 :::12304                :::*                    LISTEN      2062057/./chainmake
  • 查看DockerVM容器

$ docker ps | grep "chainmakerofficial/chainmaker-vm-engine:v3.0.1"
CONTAINER ID   IMAGE                                                 COMMAND               CREATED          STATUS          PORTS     NAMES
e54dfe966bfb   chainmakerofficial/chainmaker-vm-engine-java:v3.0.0   "/bin/startvm java"   14 seconds ago   Up 14 seconds             VM-JAVA-wx-org4.chainmaker.org-name-20230828172932
cc600c451936   chainmakerofficial/chainmaker-vm-engine:v3.0.1        "/bin/startvm go"     17 seconds ago   Up 17 seconds             VM-GO-wx-org4.chainmaker.org-name-20230828172932
09875f597d28   chainmakerofficial/chainmaker-vm-engine-java:v3.0.0   "/bin/startvm java"   21 seconds ago   Up 20 seconds             VM-JAVA-wx-org3.chainmaker.org-name-20230828172932
eaf720547cdd   chainmakerofficial/chainmaker-vm-engine:v3.0.1        "/bin/startvm go"     24 seconds ago   Up 23 seconds             VM-GO-wx-org3.chainmaker.org-name-20230828172932
a2d164c0cac2   chainmakerofficial/chainmaker-vm-engine-java:v3.0.0   "/bin/startvm java"   27 seconds ago   Up 27 seconds             VM-JAVA-wx-org2.chainmaker.org-name-20230828172931
3739454d774e   chainmakerofficial/chainmaker-vm-engine:v3.0.1        "/bin/startvm go"     30 seconds ago   Up 30 seconds             VM-GO-wx-org2.chainmaker.org-name-20230828172931
a06e195a17d6   chainmakerofficial/chainmaker-vm-engine-java:v3.0.0   "/bin/startvm java"   34 seconds ago   Up 33 seconds             VM-JAVA-wx-org1.chainmaker.org-name-20230828172931
bc5a9e5b40bd   chainmakerofficial/chainmaker-vm-engine:v3.0.1        "/bin/startvm go"     37 seconds ago   Up 36 seconds             VM-GO-wx-org1.chainmaker.org-name-20230828172931
  • 查看日志

$ cat ../build/release/*/bin/panic.log
$ cat ../build/release/*/log/system.log
$ cat ../build/release/*/log/system.log |grep "ERROR\|put block\|all necessary"

2.2.6. 独立部署DockerVM虚拟机

首先去./build/release路径下解压各个节点证书及配置的jar包:

tar -zxvf chainmaker-v3.0.0-wx-org4.chainmaker.org-20220824115035-x86_64.tar.gz

启动节点1需要的DockerVM

  • 使用docker-vm-standalone-start.sh脚本启动Docker Go VM

$ ./docker-vm-standalone-start.sh
input path to cache contract files(must be absolute path, default:'./docker-go'): /home/data/wx-org1.chainmaker.org/go
contracts path does not exist, create it or not(y|n): y
input log path(must be absolute path, default:'./log'): /home/log/wx-org1.chainmaker.org/go
log path does not exist, create it or not(y|n): y
input log level(DEBUG|INFO(default)|WARN|ERROR): DEBUG
input expose port(default 22351): 22351
input runtime port(default 32351): 32351
input container name(default 'chainmaker-docker-vm'): VM-GO-wx-org1.chainmaker.org
# 不使用配置文件启动DockerVM,忽略该项
input vm config file path(use default config(default)):
docker-vm config is nil, use default config
start docker vm container
  • 使用docker-vm-standalone-start.sh脚本启动Docker Java VM

$ ./docker-vm-standalone-start.sh java
input path to cache contract files(must be absolute path, default:'./docker-go'): /home/data/wx-org1.chainmaker.org/java
contracts path does not exist, create it or not(y|n): y
input log path(must be absolute path, default:'./log'): /home/log/wx-org1.chainmaker.org/java
log path does not exist, create it or not(y|n): y
input log level(DEBUG|INFO(default)|WARN|ERROR): DEBUG
input expose port(default 22351): 22351
input runtime port(default 32351): 32351
input container name(default 'chainmaker-docker-vm'): VM-JAVA-wx-org1.chainmaker.org
# 不使用配置文件启动DockerVM,忽略该项
input vm config file path(use default config(default)):
docker-vm config is nil, use default config
start docker vm container
  • 使用Docker命令启动

启动Docker Go 虚拟机

$ docker run -itd \
--net=host \
-v "/home/data/wx-org1.chainmaker.org/go":/mount \
-v "/home/log/wx-org1.chainmaker.org/go":/log \
-e CHAIN_RPC_PROTOCOL="1" \
-e CHAIN_RPC_PORT="22351" \
-e SANDBOX_RPC_PORT="32351" \
-e MAX_SEND_MSG_SIZE="100" \
-e MAX_RECV_MSG_SIZE="100" \
-e MAX_CONN_TIMEOUT="10" \
-e MAX_ORIGINAL_PROCESS_NUM="20" \
-e DOCKERVM_CONTRACT_ENGINE_LOG_LEVEL="DEBUG" \
-e DOCKERVM_SANDBOX_LOG_LEVEL="DEBUG" \
-e DOCKERVM_LOG_IN_CONSOLE="false" \
--name VM-GO-wx-org1.chainmaker.org \
--privileged chainmakerofficial/chainmaker-vm-engine:v3.0.1 \
> /dev/null

启动Docker Java 虚拟机

$ docker run -itd \
--net=host \
-v "/home/data/wx-org1.chainmaker.org/go":/mount \
-v "/home/log/wx-org1.chainmaker.org/go":/log \
-e CHAIN_RPC_PROTOCOL="1" \
-e CHAIN_RPC_PORT="22351" \
-e SANDBOX_RPC_PORT="32351" \
-e MAX_SEND_MSG_SIZE="100" \
-e MAX_RECV_MSG_SIZE="100" \
-e MAX_CONN_TIMEOUT="10" \
-e MAX_ORIGINAL_PROCESS_NUM="20" \
-e DOCKERVM_CONTRACT_ENGINE_LOG_LEVEL="DEBUG" \
-e DOCKERVM_SANDBOX_LOG_LEVEL="DEBUG" \
-e DOCKERVM_LOG_IN_CONSOLE="false" \
--name VM-JAVA-wx-org1.chainmaker.org \
--privileged chainmakerofficial/chainmaker-vm-engine-java:v3.0.0 \
> /dev/null

然后启动节点1

$ ./start.sh -f alone

查看节点和容器是否已经建立链接

$ cat /home/log/wx-org1.chainmaker.org/go/go.log |grep "Chain RPC Service"

按照上述步骤依次启动剩余节点。

2.2.7. 使用高级配置独立部署DockerVM

高级配置

如果希望使用合约引擎高级配置,需要配置vm:godockervm_config_path高级配置文件路径,这里我们把节点1的DockerVM高级配置文件vm.yml放置在/home/config_path/wx-org1.chainmaker.org,在chainmaker.yml中对应的配置如下:

# Contract Virtual Machine(VM) configs
vm:
  # Golang runtime in docker container
  go:
    ...
    # If use a customized VM configuration file, supplement it; else, do not configure
    # Priority: chainmaker.yml > vm.yml > default settings
    dockervm_config_path: /home/config_path/wx-org1.chainmaker.org/vm.yml
   	...

配置文件模板如下:

########### RPC ###########
rpc:
  chain_rpc_protocol: 1 # chain rpc protocol, 0 for unix domain socket, 1 for tcp(default)
  chain_host: 127.0.0.1 # chain tcp host
  chain_rpc_port: 22351 # chain rpc port, valid when protocol is tcp
  sandbox_rpc_port: 32351 # sandbox rpc port, valid when protocol is tcp
  max_send_msg_size: 100 # max send msg size(MiB)
  max_recv_msg_size: 100 # max recv msg size(MiB)
  server_min_interval: 60s # server min interval
  connection_timeout: 5s # connection timeout time
  server_keep_alive_time: 60s # idle duration before server ping
  server_keep_alive_timeout: 20s # ping timeout

########### Process ###########
process:
  # max original process num,
  # max_call_contract_process_num = max_original_process_num * max_contract_depth (defined in protocol)
  # max_total_process_num = max_call_contract_process_num + max_original_process_num
  max_original_process_num: 20
  exec_tx_timeout: 8s # process timeout while busy
  waiting_tx_time: 200ms # process timeout while tx completed (busy -> idle)
  release_rate: 30 # percentage of idle processes released periodically in total processes (0-100)
  release_period: 10m # period of idle processes released periodically in total processes

########### Log ###########
log:
  contract_engine:
    level: "info"
    console: true
  sandbox:
    level: "info"
    console: true

########### Pprof ###########
pprof:
  contract_engine:
    enable: false
    port: 21215
  sandbox:
    enable: false
    port: 21522

########### Contract ###########
contract:
  max_file_size: 20480 # contract size(MiB)

使用高级配置启动节点需要的DockerVM

  • 使用docker-vm-standalone-start.sh脚本启动DockerVM

$ ./docker-vm-standalone-start.sh
input path to cache contract files(must be absolute path, default:'./docker-go'): /home/data/wx-org1.chainmaker.org/go
contracts path does not exist, create it or not(y|n): y
input log path(must be absolute path, default:'./log'): /home/log/wx-org1.chainmaker.org/go
log path does not exist, create it or not(y|n): y
## 使用配置文件,忽略该项
input log level(DEBUG|INFO(default)|WARN|ERROR):
## 使用配置文件,忽略该项
input expose port(default 22351):
## 使用配置文件,忽略该项
input runtime port(default 32351):
input container name(default 'chainmaker-docker-vm'): VM-GO-wx-org1.chainmaker.org
input vm config file path(use default config(default)): /home/config_path/wx-org1.chainmaker.org/vm.yml
start docker vm container
  • 使用Docker命令启动DockerVM

$ docker run -itd \
--net=host \
-v "/home/data/wx-org1.chainmaker.org/go":/mount \
-v "/home/log/wx-org1.chainmaker.org/go":/log \
--name VM-GO-wx-org1.chainmaker.org \
--privileged chainmakerofficial/chainmaker-vm-engine:v3.0.1 \
> /dev/null

启动节点

$ ./start.sh -f alone

查看节点是否和DockerVM已经建立连接

$ cat /home/log/wx-org1.chainmaker.org/go/go.log |grep "Chain RPC Service"

按照上述步骤依次启动剩余节点。

2.2.8. 本地部署的停止

如果是通过./cluster_quick_start.sh同时启动的节点和虚拟机,可以通过对应的stop脚本同时停止链和DockerVM容器:

$ ./cluster_quick_stop.sh

如果同时需要清除所有链数据可以使用:

$ ./cluster_quick_stop.sh clean

由于DockerVM内使用容器内的root用户启动虚拟机服务,因此日志和缓存文件也属于root用户(uid=0)。如果以非root用户启动的程序,清除数据时可能会报错提示缺少文件访问的权限,需要以root权限删除数据,或者使用userns-remap的功能将容器里用户映射成普通用户。

2.2.9. 独立部署的停止

首先关闭链节点

$ ./stop.sh alone

然后关闭该节点对应的虚拟机

$ docker stop VM-GO-wx-org1.chainmaker.org
$ docker stop VM-JAVA-wx-org1.chainmaker.org

2.3. 使用docker部署支持docker-vm的链

“长安链·ChainMaker”支持Docker-go合约开发,Docker-go合约运行在独立Docker VM容器中,本文将介绍长安链使用docker方式部署时,与Docker-vm通信的几种部署方式。

2.3.1. 使用docker方式部署ChainMaker:

cd chainmaker-go
# 清空旧的构建数据
rm -rf build
make docker-build
docker images

2.3.2. 准备链需要的配置文件

参考 在工作目录下 使用脚本搭建,使用脚本生成docker需要的节点配置文件

cd chainmaker-go/scripts
./prepare_pk.sh 4 1
./build_release.sh
./cluster_quick_start.sh
./cluster_quick_stop.sh

2.3.3. 复制配置文件到chainmaker docker能读取的位置

docker启动时,默认加载如下路径的配置:chainmaker-go/scripts/docker/config/four-nodes

cd chainmaker-go/scripts/docker/config/four-nodes
cp -r ../../../../build/release/chainmaker-v2.2.1-wx-org1.chainmaker.org/config/wx-org1.chainmaker.org ./
cp -r ../../../../build/release/chainmaker-v2.2.1-wx-org2.chainmaker.org/config/wx-org2.chainmaker.org ./
cp -r ../../../../build/release/chainmaker-v2.2.1-wx-org3.chainmaker.org/config/wx-org3.chainmaker.org ./
cp -r ../../../../build/release/chainmaker-v2.2.1-wx-org4.chainmaker.org/config/wx-org4.chainmaker.org ./

2.3.4. 修改节点ip地址:

  • 场景一:一台host启动4个chainmaker docker node 需要将配置文件中的ip换成docker容器的ip

    • 分别打开四个节点的chainmaker文件:

    # 查看容器ip ipv4_address: 
    chainmaker-go/scripts/docker] vim four-nodes.docker-compose.yml
    # 修改chainmaker.yml的配置
    chainmaker-go/scripts/docker/config/four-nodes/wx-org1.chainmaker.org] vim chainmaker.yml
    
    • 找到如chainmaker.yml的如下位置

    seeds:
      - "/ip4/127.0.0.1/tcp/11301/p2p/XXX"
      - "/ip4/127.0.0.1/tcp/11302/p2p/XXX"
      - "/ip4/127.0.0.1/tcp/11303/p2p/XXX"
      - "/ip4/127.0.0.1/tcp/11304/p2p/XXX"
    
    • 两种修改方式任选其一

    第一种:使用four-nodes.docker-compose.yml中配置的容器ip

    seeds:
        - "/ip4/172.48.1.11/tcp/11301/p2p/XXX"
        - "/ip4/172.48.1.12/tcp/11302/p2p/XXX"
        - "/ip4/172.48.1.13/tcp/11303/p2p/XXX"
        - "/ip4/172.48.1.14/tcp/11304/p2p/XXX"
    

    第二种:使用four-nodes.docker-compose.yml中配置的容器名

    seeds:
        - "/dns/cm-node1/tcp/11301/p2p/XXX"
        - "/dns/cm-node2/tcp/11302/p2p/XXX"
        - "/dns/cm-node3/tcp/11303/p2p/XXX"
        - "/dns/cm-node4/tcp/11304/p2p/XXX"
    
  • 场景二:四台host启动4个chainmaker docker node

    参考如上修改方式,ip修改为四台host的ip

2.3.5. 修改docker-vm相关配置

“长安链·ChainMaker”V2.2.1之后,在节点配置文件chainmaker.yml中关于docker的两种连接方式对应的配置为:

第一种:本地的socket文件

uds_open: true

第二种:tcp , 当chainmaker使用docker方式部署时,推荐使用这种配置

uds_open: false
  • 场景一:chainmaker以【docker】方式部署,docker-vm与chainmaker-vm部署在【不同的】host :

    假设:A(192.168.0.9)机器上启动了chainmaker 的docker容器, B(192.168.0.78)机器上启动了对应的docker-vm

      uds_open: false
      docker_vm_host: 192.168.0.78
      docker_vm_port: 22351
    
  • 场景二:chainmaker以【docker】方式部署,docker-vm与chainmaker-vm部署在【同一台】host:

    假设:A机器上启动了chainmaker的docker容器,同时启动对应的docker-vm 由于docker-vm和chainmaker在同一台host下,需要保证两个docker环境在使用同一个网桥的情况下ip在同一网段,即处在同一局域网内,例如使用如下命令启动docker-vm

    docker run -d -p22351:22359 --network docker_localnet --ip 172.48.1.21 --privileged chainmakerofficial/chainmaker-vm-docker-go:v2.2.1
    

    配置文件修改时,注意端口号为-p22351:22359中的后者, 并且ip 为上面指定的ip

    uds_open: false
      docker_vm_host: 172.48.1.21
      docker_vm_port: 22359
    
  • 场景三:chainmaker以【进程方式】部署,docker-vm与chainmaker部署在【不同的】host:

    uds_open: false
      docker_vm_host: 192.168.0.78
      docker_vm_port: 22351
    
  • 场景四:chainmaker以进程方式部署, ocker-vm与chainmaker部署在【同一台】host:

    uds_open: false
      docker_vm_host: 127.0.0.1
      docker_vm_port: 22351
    

2.4. 合约的安装与调用

合约的安装与调用请参考:使用Golang进行智能合约开发 合约的安装与调用请参考:使用Java进行智能合约开发