У меня есть приложение .NET API и база данных Couchbase. База данных Couchbase работает как Docker-контейнер и имеет конфигурацию с одним хостом и несколькими узлами. Мое приложение dotnet находится за пределами среды Docker и внешнего клиента Couchbase Docker Container. Конфигурация Docker-compose приведена ниже, и я могу получить доступ к веб-консолям Couchbase с URL-адресами http://localhost:8091 и http://localhost:8094. Я попытался подключиться из приложения .net со строками подключения Couchbase://localhost, Couchbase://localhost:8091,localhost:8094, Couchbase://172.20.0.2,172.20.0.3, Couchbase://172.20.0.2:8094 ,172.20.0.3:8091, Couchbase://192.168.65.0 (IP-адрес хоста Docker по умолчанию) и т. д., но не удается подключиться. Но когда я настраиваю 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 Container.
Клиентам Couchbase необходим доступ к каждому узлу Couchbase. Насколько я знаю, вы не можете запустить несколько узлов внутри хоста Docker и получить доступ ко всем из них, потому что вы можете предоставить определенный порт только для одного узла внутри Docker. (например, вы можете предоставить порт 8091 для узла A, внешнего по отношению к хосту Docker, но тогда узлы B и C не смогут быть доступны через один и тот же порт).
Предполагая, что вы делаете это для локальной разработки, я бы порекомендовал вот что:
Может быть другое решение для кого-то, кто является ниндзя Docker/сетевого сообщества (этот человек не я), но я его не видел.
Планируете ли вы развернуть производство в докере?
Да, все сервисы закреплены в производственной среде моей компании.
В производстве я бы определенно рекомендовал многоузловой кластер Couchbase.
Я ценю ваши советы
спасибо за вашу ценную информацию. Мне нужно запустить приложение .net за пределами Docker из-за зависимости от библиотеки. Так что первый вариант мне подходит. Но из-за интенсивного сетевого трафика другим вариантом является решение с несколькими узлами. Если бы вы были на моем месте, что бы вы сделали?