单主机部署双Docker CouchDB实例异常:一个启动一个几秒后退出求助
我之前在单主机上部署多个Fabric Peer对应的CouchDB实例时也踩过类似的坑,给你分享几个高概率的排查和解决方向:
1. 优先查看退出容器的日志(最关键)
先别着急改配置,先搞清楚容器为啥退出。执行以下命令获取退出容器的日志:
docker logs <退出容器的ID或名称>
日志里通常会明确给出错误原因——比如端口冲突、节点名称重复、数据目录权限问题或者证书错误,这是最快定位问题的方式。
2. 排查端口冲突问题
CouchDB默认会用到三个核心端口:5984(HTTP API)、4369(EPMD,Erlang端口映射器)、9100(集群通信)。单主机上部署多个实例时,宿主机的端口映射必须唯一,不能重复占用。
比如第一个CouchDB实例的端口映射可以是:
ports: - "5984:5984" - "4369:4369" - "9100:9100"
第二个实例必须修改宿主机侧的端口:
ports: - "5985:5984" - "4370:4369" - "9101:9100"
如果日志里出现类似address already in use的报错,那基本就是端口冲突导致的。
3. 检查CouchDB节点名称唯一性
CouchDB是基于Erlang集群的,每个节点的名称必须全局唯一。在docker-compose的环境变量里,COUCHDB_NODE_NAME不能重复:
- 第一个实例:
COUCHDB_NODE_NAME=couchdb@couchdb0.org1.example.com - 第二个实例:
COUCHDB_NODE_NAME=couchdb@couchdb1.org1.example.com
如果节点名称重复,CouchDB启动时会因为集群节点冲突直接退出。
4. 确认存储卷不冲突
每个CouchDB实例的 data 目录必须单独挂载,不能多个实例共用同一个宿主机目录:
- 第一个实例:
./couchdb0/data:/opt/couchdb/data - 第二个实例:
./couchdb1/data:/opt/couchdb/data
共用存储卷会导致数据文件锁冲突,进而引发容器退出。同时还要确保宿主机的这些目录权限正确,比如给目录设置777权限(测试环境):
chmod -R 777 ./couchdb0/data ./couchdb1/data
5. 验证证书与hosts配置
- 确保每个CouchDB实例挂载的是对应Peer的TLS证书,比如peer1的CouchDB要挂载
crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls目录,不能用peer0的证书。 - 检查宿主机
/etc/hosts文件,是否添加了两个CouchDB实例的主机名映射:
127.0.0.1 couchdb0.org1.example.com couchdb1.org1.example.com
容器内部需要能正确解析这些主机名,否则可能出现证书验证失败的问题。
6. 检查Fabric Peer与CouchDB的关联配置
确保每个Peer的docker-compose配置里,CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS指向了对应CouchDB实例的地址,比如:
- peer0:
CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0.org1.example.com:5984 - peer1:
CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb1.org1.example.com:5984
如果Peer指向了错误的CouchDB地址,也可能间接导致CouchDB实例启动异常。
先从查看日志入手,定位具体错误后再针对性修改配置,一般都能解决问题。
内容的提问来源于stack exchange,提问作者Roy

