如何在不使用Docker Swarm或Kubernetes的情况下,通过Docker Compose复制容器并配置不同端口实现服务高可用?
解决Docker Compose复制Fabric CA服务的配置错误
你遇到的这个错误原因很明确——你把新的ca1服务定义放在了services节点外面,而Docker Compose v2及以上版本要求所有服务必须嵌套在services这个顶级键下面,不能直接作为顶级配置项存在。
下面是修正后的完整docker-compose-ca.yaml配置,我把ca1服务正确放到了services节点内部,和ca0同级:
version: '2' networks: byfn: services: ca0: image: hyperledger/fabric-ca:$IMAGE_TAG environment: - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server - FABRIC_CA_SERVER_CA_NAME=ca-org1 - FABRIC_CA_SERVER_TLS_ENABLED=true - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/key.pem - FABRIC_CA_SERVER_PORT=7054 ports: - "7054:7054" command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/key.pem -b admin:adminpw -d' volumes: - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config container_name: ca0_peerOrg1 networks: - byfn # 复制的CA服务,正确嵌套在services节点内 ca1: image: hyperledger/fabric-ca:$IMAGE_TAG environment: - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server - FABRIC_CA_SERVER_CA_NAME=ca-org1 - FABRIC_CA_SERVER_TLS_ENABLED=true - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/key.pem - FABRIC_CA_SERVER_PORT=8054 ports: - "8054:8054" command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/key.pem -b admin:adminpw -d' volumes: - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config container_name: ca1_peerOrg1 networks: - byfn
关键注意点:
- 所有服务定义必须在
services节点下,这是Compose v2+版本的核心结构要求,也是你之前报错的根本原因 - 两个CA服务共享相同的证书和密钥文件,这样它们才能作为同一个CA的高可用实例对外提供服务,客户端可以任意连接其中一个
- 分别设置了不同的
FABRIC_CA_SERVER_PORT环境变量和宿主机端口映射,避免端口冲突 - 保持一致的
FABRIC_CA_SERVER_CA_NAME,确保服务逻辑上属于同一个CA
现在你再运行原来的启动命令:
docker-compose -f docker-compose-ca.yaml up
就可以正常启动两个CA服务了,它们会分别监听7054和8054端口,实现你需要的高可用效果。
内容的提问来源于stack exchange,提问作者Gopal Ojha
相关产品推荐
相关产品推荐

