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

如何从外部.NET应用连接多节点Docker部署的Couchbase集群

问题描述

我拥有一个.NET API应用和Couchbase数据库,Couchbase以Docker容器单主机多节点配置运行。.NET应用位于Docker环境之外,作为Couchbase容器的外部客户端。我可以通过http://localhost:8091和http://localhost:8094访问Couchbase的Web控制台,但尝试使用couchbase://localhost、couchbase://localhost:8091,localhost:8094、couchbase://172.20.0.2,172.20.0.3等多种连接字符串从.NET应用连接时均失败。不过当Couchbase配置为单主机单节点时,可以正常连接。已按下方docker-compose.yaml发布端口但无变化,寻求网络配置相关的解决方法。

原docker-compose.yaml配置:

version: "3.0"
services:
 
  couchbase-node1:
    image: couchbase/server:community-7.6.1
    container_name: couchbase-node1-container
    ports:
      - "8091:8091"  # Couchbase Web Console
      - "8092:8092"  # Couchbase Query Service
      - "8093:8093"  # Couchbase Index Service
      - "11210:11210"  # Couchbase Data Service
    environment:
      - CLUSTER_INIT_USERNAME=Administrator
      - CLUSTER_INIT_PASSWORD=couchbase2024*
      - SERVICES=data,index,query,fts
      - USERNAME=Administrator # Couchbase Server Default Username, custom usernames is not accepted!
      - PASSWORD=couchbase2024*
    networks:
      couchbase-net:
        ipv4_address: 172.20.0.3
        aliases:
          - couchbase-node1
    volumes:
      - node1_data:/opt/couchbase/var
  couchbase-node2:
    image: couchbase/server:community-7.6.1
    container_name: couchbase-node2-container 
    ports:
      - "8094:8091"  # Couchbase Web Console
      - "8095:8092"  # Couchbase Query Service
      - "8096:8093"  # Couchbase Index Service
      - "11211:11210"  # Couchbase Data Service
    environment:
      - CLUSTER_JOIN=couchbase-node1
      - USERNAME=Administrator
      - PASSWORD=couchbase2024*
    networks:
      couchbase-net:
        ipv4_address: 172.20.0.2
        aliases:
          - couchbase-node2
    volumes:
      - node2_data:/opt/couchbase/var
    depends_on:
      - couchbase-node1
volumes:
  local_pgdata:
  pgadmin-data:
  es-data:
  node1_data:
  node2_data:
networks:
  es-net:
    driver: bridge
  couchbase-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/24
问题根源

Couchbase集群的节点会向客户端通告自身的内部通信地址(即容器内的172.20.0.2/3),但外部的.NET应用无法直接访问Docker内部网络的IP。同时,当前配置缺少部分关键服务端口的映射,且未指定节点对外暴露的通告地址,导致客户端无法正确与所有节点建立连接。

解决方案

1. 配置节点的外部通告地址

在每个节点的环境变量中添加对外暴露的主机地址,让节点向外部客户端返回可访问的地址:

  • 节点1添加CLUSTER_INIT_ADVERTISED_HOSTNAME=localhost
  • 节点2添加CLUSTER_ADVERTISED_HOSTNAME=localhost

2. 补全所有必要的端口映射

Couchbase需要暴露更多服务端口,确保每个节点的对应端口映射到主机的不同端口,避免冲突。新增以下端口映射:

  • 11211:KV备用端口
  • 18091:HTTPS控制台
  • 18092:HTTPS查询服务
  • 18093:HTTPS索引服务
  • 18094:HTTPS搜索服务

3. 修改后的完整docker-compose.yaml

version: "3.0"
services:
 
  couchbase-node1:
    image: couchbase/server:community-7.6.1
    container_name: couchbase-node1-container
    ports:
      - "8091:8091"  # Web Console
      - "8092:8092"  # Query Service
      - "8093:8093"  # Index Service
      - "8094:8094"  # Search Service
      - "11210:11210" # KV Service
      - "11211:11211" # KV备用端口
      - "18091:18091" # HTTPS Console
      - "18092:18092" # HTTPS Query
      - "18093:18093" # HTTPS Index
      - "18094:18094" # HTTPS Search
    environment:
      - CLUSTER_INIT_USERNAME=Administrator
      - CLUSTER_INIT_PASSWORD=couchbase2024*
      - SERVICES=data,index,query,fts
      - CLUSTER_INIT_ADVERTISED_HOSTNAME=localhost
      - USERNAME=Administrator
      - PASSWORD=couchbase2024*
    networks:
      couchbase-net:
        ipv4_address: 172.20.0.3
        aliases:
          - couchbase-node1
    volumes:
      - node1_data:/opt/couchbase/var
  couchbase-node2:
    image: couchbase/server:community-7.6.1
    container_name: couchbase-node2-container 
    ports:
      - "9091:8091"  # Web Console
      - "9092:8092"  # Query Service
      - "9093:8093"  # Index Service
      - "9094:8094"  # Search Service
      - "12210:11210" # KV Service
      - "12211:11211" # KV备用端口
      - "19091:18091" # HTTPS Console
      - "19092:18092" # HTTPS Query
      - "19093:18093" # HTTPS Index
      - "19094:18094" # HTTPS Search
    environment:
      - CLUSTER_JOIN=couchbase-node1
      - CLUSTER_ADVERTISED_HOSTNAME=localhost
      - USERNAME=Administrator
      - PASSWORD=couchbase2024*
    networks:
      couchbase-net:
        ipv4_address: 172.20.0.2
        aliases:
          - couchbase-node2
    volumes:
      - node2_data:/opt/couchbase/var
    depends_on:
      - couchbase-node1
volumes:
  local_pgdata:
  pgadmin-data:
  es-data:
  node1_data:
  node2_data:
networks:
  es-net:
    driver: bridge
  couchbase-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/24

4. 调整.NET应用的连接字符串

使用包含两个节点控制台端口的连接字符串:

var cluster = await Cluster.ConnectAsync("couchbase://localhost:8091,localhost:9091", "Administrator", "couchbase2024*");
注意事项
  • 确保Couchbase .NET SDK版本与服务器版本(7.6.1)兼容,建议使用最新稳定版SDK
  • 如果主机不是localhost(比如远程机器),需要将CLUSTER_INIT_ADVERTISED_HOSTNAME和CLUSTER_ADVERTISED_HOSTNAME设置为主机的公网/局域网IP

内容的提问来源于stack exchange,提问作者mkartal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:17:50