AWS-ECS - Связь между контейнерами - Неизвестная ошибка хоста

У меня есть два контейнера Docker.

  1. TestWeb (Expose: 80)
  2. 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).

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