AWS-ECS - Связь между контейнерами - Неизвестная ошибка хоста
У меня есть два контейнера Docker.
- TestWeb (Expose: 80)
- TestAPI (Expose: 80)
Контейнер Testweb вызывает контейнер TestApi. Хост может связываться с контейнером TestWeb через порт 8080. Хост может связываться с TestApi с использованием 8081.
Я могу заставить TestWeb вызывать TestApi в моем окне разработки (Windows 10), но при развертывании кода в AWS (ECS) я получаю исключение "неизвестный хост". Оба контейнера работают отлично, и я могу назвать их индивидуально. Но когда я вызываю метод, который внутренне делает вызов Rest с помощью HttpClient для метода в Container2, он выдает ошибку:
Произошла ошибка при отправке запроса. ---> System.Net.Http.CurlException: не удалось разрешить имя хоста.
Код:
using (var client = new HttpClient())
{
try
{
string url = "http://testapi/api/Tenant/?i=" + id;
var response = client.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
var responseContent = response.Content;
string responseString = responseContent.ReadAsStringAsync().Result;
return responseString;
}
return response.StatusCode.ToString();
}
catch (HttpRequestException httpRequestException)
{
return httpRequestException.Message;
}
}
Вот что я пробовал:
Два контейнера (TestWeb, TestAPI) находятся в одном определении задачи в AWS ECS. Когда я проверяю контейнеры, я получаю IP-адрес каждого из контейнеров. Я могу пропинговать container2 из container1 по их IP-адресу. Но я не могу пинговать, используя имя контейнера2. Это дает мне ошибку "неизвестный хост".
1 ответ
Похоже, ECS не использует законные docker-compose
однако их реализация поддерживает функцию " ссылок" Compose V2.
Вот часть моего составного файла, который я только что запустил на ECS, который нуждался в той же функциональности и имел ту же ошибку "не удалось решить хост", которую вы получали. "Ссылки", которые я добавил, исправили проблему с разрешением имени моего хоста в Elastic Container Service!
version: '3'
services:
appserver:
links:
- database:database
- socks-proxy:socks-proxy
Это позволило моему appserver общаться с database
а также socks-proxy
имена хостов. Формат - "СЕРВИС: АЛИАС", и можно оставить их одинаковыми с правилами по умолчанию.
В вашем примере это будет:
version: '3'
services:
testapi:
links:
- testweb:testweb
testweb:
links:
- testapi:testapi
AWS не использует Docker compose, но предоставляет интерфейс для добавления определений задач. Контейнеры, которые должны взаимодействовать друг с другом, могут быть помещены в одно и то же определение Задачи. Затем мы также можем указать в разделе ссылок контейнеры, которые будут вызываться из текущего контейнера. Каждому контейнеру может быть присвоено имя контейнера в разделе "Хост" определения задачи. После того как я добавил имя контейнера в поле "Хост", Container1 (TestWeb) смог связаться с Container2 (TestAPI).