我有一个 .NET API 应用程序和 Couchbase 数据库。 Couchbase 数据库作为 Docker 容器运行,并具有一台主机多节点配置。我的 dotnet 应用程序位于 docker 环境和 Couchbase Docker 容器的外部客户端之外。 Docker-compose 配置如下,我可以使用 URL http://localhost:8091 和 http://localhost:8094 访问 Couchbase 的 Web 控制台。我尝试使用连接字符串 couchbase://localhost、couchbase://localhost:8091、localhost:8094、couchbase://172.20.0.2,172.20.0.3、couchbase://172.20.0.2:8094 从 .net 应用程序进行连接,172.20.0.3:8091,couchbase://192.168.65.0(Docker主机默认IP地址)等但无法连接。但是当我将 Couchbase 配置为单个主机上的单个节点时,我可以从 .net 应用程序进行连接。看起来好像缺少一些网络配置,我发布了如下所述的端口,但没有任何改变。任何帮助我的人,我将不胜感激。
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
这里有几个潜在的问题。首先,您使用 8094-8096 作为外部端口,这可能不是问题(见下文),但 8091-8097 的所有端口都用于 Couchbase 网络流量,因此通过重新分配它们,您可能会阻止或至少让客户感到困惑。
但是,根据经验,我认为主要问题是:
我的 dotnet 应用程序位于 docker 环境和 Couchbase Docker 容器的外部客户端之外
Couchbase 客户端需要访问 Couchbase 的每个节点。据我所知,您无法在 Docker 主机内运行多个节点并访问所有这些节点,因为您只能为 Docker 内的单个节点公开给定端口。 (例如,您可以将节点 A 的端口 8091 公开到 Docker 主机外部,但节点 B 和 C 不能通过同一端口公开)。
假设您这样做是为了本地开发,我的建议如下:
对于 Docker/网络忍者(那个人不是我)来说可能还有另一种解决方案,但我还没有看到。