Запрос 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 работает на вашем локальном компьютере).
Я надеюсь, что это помогает