fabric里peer启动chaincode容器如何回访peer
- peer如何启动chaincode
chaincode是在一个独立的container里面启动的;整个过程由peer来完成;分如下几步:
# core/container/dockercontroller/dockercontroller.go
# func (vm *DockerVM) Start(...)
vm.stopInternal(client, containerName, 0, false, false)
err = vm.createContainer(client, imageName, containerName, args, env, attachStdout)
if err == docker.ErrNoSuchImage {
reader, err := builder.Build()
err = vm.deployImage(client, ccid, reader)
err = vm.createContainer(client, imageName, containerName, args, env, attachStdout)
}
err = client.StartContainer(containerName, nil)
- 先发一个stop命令,不管原先是否存在,停止原来的container。
- 试图创建container,如果失败原因是image不存在(说明是第一个创建)
2.1 编译chaincode代码
2.2 生成chaincode的image
2.3 重新创建container - 启动container
- chaincode container的网络
peer创建一个chaincode container之后这个container所属的网络是配置项(NetworkMode)决定的。
例如在docker-compose.yaml里面如下定义:
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn
如果没有定义,那么缺省是"host"。 参见代码:
# core/container/dockercontroller/dockercontroller.go
# func getDockerHostConfig()
networkMode := viper.GetString(dockerKey("NetworkMode"))
if networkMode == "" {
networkMode = "host"
}
所以这里我们可以定义是否让chaincode和peer的container在同一个网络里面。假设已知peer的网络是net_byfn,那么只要把peer的环境变量CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE设成net_byfn,peer创建出来的chaincode的container的网络也是net_byfn了,设置成其他值(或者不设置),则表示不在同一个网络里面。
- chaincode如何回访访问peer
以golang的chaincode为例,container起来之后执行的命令行是:
chaincode -peer.address=saturn:7052
这个命令是由peer设置提供的,参数peer.address就是告诉chaincode启动之后连接的peer的地址;这个地址是由peer产生出来的,规则是按如下顺序:
- CORE_PEER_CHAINCODEADDRESS
- CORE_PEER_CHAINCODELISTENADDRESS
- peerAddr
参见:
# peer/node/start.go
# func computeChaincodeEndpoint(peerHostname string) (ccEndpoint string, err error)
- 添加主机域名
如果peer的地址(域名)在chaincode的container里面不可访问,那么需要通过环境变量传给chaincode container:
# CORE_VM_DOCKER_HOSTCONFIG_EXTRAHOSTS=<hostdomainname>:<ipaddress>
# For example
CORE_VM_DOCKER_HOSTCONFIG_EXTRAHOSTS=saturn:10.172.7.10
有疑问加站长微信联系(非本文作者)