Я пытаюсь подключиться к моей службе grpc в контейнере докеров, однако, когда мой код запускается для подключения, он выдает ошибку «Ресурс временно недоступен».
Docker-compose для контейнера разработки. Я раскручиваю это, используя: docker-compose -f .devcontainer/docker-compose.yml up
version: "3.8"
services:
app:
build:
context: .
dockerfile: Dockerfile
args:
# Update 'VARIANT' to pick a version of .NET: 3.1, 5.0, 6.0
VARIANT: "6.0"
# Optional version of Node.js
NODE_VERSION: "lts/*"
image: company/devcontainer:latest
environment:
- UNIT_TESTS=/workspace/test
- ACCEPTANCE=/workspace/acceptance
- DOCKER_HOSTNAME=host.docker.internal
# Attaches Host Docker Daemon to devcontainer and directories
volumes:
- ..:/workspace:cached
- /var/run/docker.sock:/var/run/docker.sock
Docker-compose для службы grpc
version: "3.8"
services:
my-app:
image: ${MY_APP_IMAGE_NAME:-company/my-app}
restart: on-failure
ports:
- '3000:3000'
extra_hosts:
- "host.docker.internal:host-gateway"
Код С# для подключения к моему приложению, которое является службой grpc
using var channel = GrpcChannel.ForAddress(
"http://my-app:3000",
channelOptions: new GrpcChannelOptions() {
Credentials = Grpc.Core.ChannelCredentials.Insecure
});
Когда я запускаю тест локально с визуальной студией, используя localhost: 3000, он работает нормально. Я раскручиваю все с помощью команды docker-compose up. Как только я пытаюсь использовать свой канал grpc, я получаю, что ресурс временно недоступен, но я вижу, что служба раскручивается в докере.
@Ralf Когда я пытаюсь использовать локальный хост внутри контейнера, он говорит: «Невозможно назначить запрошенный адрес».
Сначала вы сказали, что клиент, поэтому я ожидал, что ваш вызов будет из-за пределов докера в докер. Итак, ваш вызов grpc выполняется между образами докеров, работающими в одной сети докеров? Вы просто показываете один сервис из файла docker-compose, но их несколько?
Они определены в одних и тех же docker-compose.yaml файлах? т.е. они работают в одной сети?
@Artur Извините, мне трудно объяснить это, поскольку это ново для меня, у меня есть контейнер, который я загружаю. Внутри этого контейнера я запускаю несколько тестов, включающих приведенный выше код C#. Служба grpc, к которой я пытаюсь обратиться, существует в другом файле docker-compose, код которого приведен выше. Итак, я полагаю, что ответ на ваш вопрос: нет, они не работают в одной сети, потому что они существуют в двух разных файлах для создания докеров?
Да, разные файлы docker-compose запускают службы в разных сетях, поэтому вы не можете связаться с другой службой, используя ее имя. Вам необходимо явно указать сеть для обеих служб и использовать одно и то же сетевое имя. docs.docker.com/compose/compose-file/…
Как я отметил в комментариях, проблема заключается в запуске сервисов в разных сетях. Одним из возможных решений было бы создание сети вручную.
docker network create my-network
Затем установите внешнюю сеть по умолчанию в обоих файлах docker-compose.
networks:
default:
external: true
name: my-network
Для получения дополнительной информации: https://docs.docker.com/compose/compose-file/#networks-top-level-element
Спасибо! Мне также нужно указать имя сети под самой службой? Или, поскольку это значение по умолчанию, служба должна автоматически использовать это?
Нет, так как было указано как default.
Разве вы не должны также подключаться к localhost: 3000? Или там, где работает хост-докер?