Ресурс временно недоступен в контейнере Docker при подключении к конечной точке grpc

Я пытаюсь подключиться к моей службе 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, я получаю, что ресурс временно недоступен, но я вижу, что служба раскручивается в докере.

Разве вы не должны также подключаться к localhost: 3000? Или там, где работает хост-докер?

Ralf 18.11.2022 16:31

@Ralf Когда я пытаюсь использовать локальный хост внутри контейнера, он говорит: «Невозможно назначить запрошенный адрес».

TheProgrammer 18.11.2022 16:38

Сначала вы сказали, что клиент, поэтому я ожидал, что ваш вызов будет из-за пределов докера в докер. Итак, ваш вызов grpc выполняется между образами докеров, работающими в одной сети докеров? Вы просто показываете один сервис из файла docker-compose, но их несколько?

Ralf 18.11.2022 16:58

Они определены в одних и тех же docker-compose.yaml файлах? т.е. они работают в одной сети?

Artur 18.11.2022 17:00

@Artur Извините, мне трудно объяснить это, поскольку это ново для меня, у меня есть контейнер, который я загружаю. Внутри этого контейнера я запускаю несколько тестов, включающих приведенный выше код C#. Служба grpc, к которой я пытаюсь обратиться, существует в другом файле docker-compose, код которого приведен выше. Итак, я полагаю, что ответ на ваш вопрос: нет, они не работают в одной сети, потому что они существуют в двух разных файлах для создания докеров?

TheProgrammer 18.11.2022 19:07

Да, разные файлы docker-compose запускают службы в разных сетях, поэтому вы не можете связаться с другой службой, используя ее имя. Вам необходимо явно указать сеть для обеих служб и использовать одно и то же сетевое имя. docs.docker.com/compose/compose-file/…

Artur 18.11.2022 19:15
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
6
160
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я отметил в комментариях, проблема заключается в запуске сервисов в разных сетях. Одним из возможных решений было бы создание сети вручную.

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

Спасибо! Мне также нужно указать имя сети под самой службой? Или, поскольку это значение по умолчанию, служба должна автоматически использовать это?

TheProgrammer 18.11.2022 19:39

Нет, так как было указано как default.

Artur 18.11.2022 19:40

Другие вопросы по теме