Запрос HttpClient на сетевой док-контейнер

Я новичок в Docker-контейнерах, и я столкнулся со следующей проблемой. Я разрабатываю веб-страницу, которая делает запросы к незащищенному API. Оба они публикуются в разных контейнерах, которые связаны через сеть. Это мой файл docker-compose.yml:

version: '2'

services:
  api:
    image: my/api
    networks:
      - api
    ports:
      - "8080:5000"    
    container_name: api  

  web:
    build:
      context: ./DockerWeb      
    networks:
      - api      
    ports:
      - "80:5000"    
    container_name: web

networks:    
  api:
    driver: bridge

Я заметил, что если я присоединяюсь к контейнеру, на котором запущена моя веб-страница, я могу без проблем пропинговать контейнер api, используя ping api

Проблема возникает при попытке сделать любой вызов веб-службы для контейнера API. Я пытаюсь инициализировать объект HttpClient, однако для свойства BaseAddress такого объекта должно быть установлено допустимое Uri.

_client = new HttpClient();
_client.BaseAddress = new Uri(config.ApiUrl); //config.ApiUrl = "api"

Это выдает следующую ошибку

UriFormatException: неверный URI: невозможно определить формат URI.

Есть ли способ либо: а) раскрыть имя контейнера другим способом, либо б) совершить вызов веб-службы без необходимости использования URI? Как я могу сделать это?

ОБНОВИТЬ

Я обновил ApiUrl, чтобы он содержал значение http:api:8080Однако теперь я получаю исключение при выполнении вызова

System.AggregateException: произошла одна или несколько ошибок. (Произошла ошибка при отправке запроса.) ---> System.Net.Http.HttpRequestException: Произошла ошибка при отправке запроса. ---> System.Net.Http.CurlException: не удалось подключиться к серверу

Я также попытался вызвать конечную точку API непосредственно из моего веб-контейнера с помощью wget

wget http://api:8080/ 

Однако я все еще получаю обратно ошибку:

Подключение к api (api)|172.24.0.4|:8080... не удалось: соединение отклонено

Может ли это быть ошибкой конфигурации API?

3 ответа

Решение

api это просто имя хоста. URI будет http://api:8080 (или же https://api:someotherport если вы установили SSL/TLS.)

Внутренний порт используется для соединений внутри сети докеров. Итак, в этом случае запрос должен перейти на http://api:5000

Здесь есть 2 вида общения:

Контейнерная сеть> Контейнер API

В этом случае, действительно, вы можете просто использовать имя хоста "api" для подключения к вашему API. Это то, что вам нужно сделать, если ваш HTML генерируется на стороне сервера.

Веб-клиент> Контейнер API

Здесь, однако, я предполагаю, что вы используете какое-то веб-приложение JavaScript (Angular или другое). В этом случае HTML (и вызов) сделан не из веб-контейнера, а непосредственно из вашего веб-браузера.

Поэтому в этом случае вы должны использовать http://localhost:8080/ (я полагаю, что Docker работает на вашем локальном компьютере).

Я надеюсь, что это помогает

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