如何从外部.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
相关产品推荐
相关产品推荐

