Docker部署CouchDB实例间数据复制失败问题求助
解决CouchDB Docker实例间复制失败问题
核心问题分析
你遇到的两个错误本质上都是网络连通性和地址解析问题:
invalid_json:大概率是因为URL中直接携带认证信息的格式不符合CouchDB的JSON序列化要求,同时后续的连接失败也会间接导致JSON解析报错。replication_auth_error/econnrefused:当你调用localhost:5984/_replicate时,复制操作是由couchdb1容器内部执行的。容器内的localhost指向容器自身,而非宿主机,因此couchdb1无法通过localhost:5985访问到宿主机上映射的couchdb2实例,导致连接拒绝。
解决方案1:使用Docker Compose内部服务名访问(推荐)
同一Docker Compose网络下的服务可直接通过服务名互相访问,无需依赖宿主机端口映射。修改复制请求如下:
const replicateTest = async () => { try { const { data } = await axios.post( "http://admin:admin@localhost:5984/_replicate", { source: "test_1", // 源数据库在本地,直接写名称即可 target: { url: "http://couchdb2:5984/test_1", // 使用compose服务名+容器内部端口 auth: { basic: { username: "admin", password: "admin" } } }, create_target: true }, { headers: { "Content-Type": "application/json", Accept: "application/json" } } ); console.log(data); } catch (err) { console.error(err.response?.data || err.message); } };
关键说明:
- 源数据库
test_1在couchdb1本地,无需写完整URL,直接填数据库名即可。 - target使用Docker Compose服务名
couchdb2,容器内部端口为5984(而非宿主机的5985),同一compose网络内服务可直接通过该地址访问。 - 单独配置认证信息,避免URL中带账号密码导致的JSON序列化问题。
解决方案2:使用宿主机IP访问(非compose网络场景适用)
如果需要通过宿主机IP访问,可使用Docker提供的特殊域名或宿主机实际IP:
const replicateTest = async () => { try { const { data } = await axios.post( "http://admin:admin@localhost:5984/_replicate", { source: "test_1", target: { url: "http://host.docker.internal:5985/test_1", // Docker Desktop指向宿主机的域名 auth: { basic: { username: "admin", password: "admin" } } }, create_target: true }, { headers: { "Content-Type": "application/json", Accept: "application/json" } } ); console.log(data); } catch (err) { console.error(err.response?.data || err.message); } };
Linux环境补充配置:
如果是Linux系统,需要在docker-compose.yaml的couchdb1服务中添加extra_hosts:
couchdb1: # 其他配置不变 extra_hosts: - "host.docker.internal:host-gateway"
验证步骤
- 进入couchdb1容器,执行以下命令验证连通性:
若能返回数据库列表,说明网络连通正常。docker exec -it my-couchdb1 curl http://admin:admin@couchdb2:5984/_all_dbs - 运行修改后的复制代码,检查是否成功。
内容的提问来源于stack exchange,提问作者InonBr
相关产品推荐
相关产品推荐

