You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:17:48