2

我有两个 Docker 容器。

  1. 测试网(曝光:80)
  2. 测试API(公开:80)

Testweb 容器调用 TestApi 容器。Host 可以通过 8080 端口与 TestWeb 容器通信。Host 可以使用 8081 与 TestApi 通信。

我可以让 TestWeb 在我的开发箱(Windows 10)中调用 TestApi,但是当我将代码部署到 AWS(ECS)时,我得到“未知主机”异常。这两个容器都工作得很好,我可以单独调用它们。但是当我调用一个内部使用 HttpClient 对 Container2 中的方法进行 Rest 调用的方法时,它会给出错误:

发送请求时出错。---> 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 地址。我可以用他们的 IP 地址从 container1 ping container2。但我无法使用 container2 名称 ping。它给了我“未知主机”错误。

4

2 回答 2

3

看起来ECS 并没有在后台使用合法的docker-compose,但是,它们的实现确实支持 Compose V2“链接”功能。

这是我刚刚在 ECS 上运行的撰写文件的一部分,它需要相同的功能,并且遇到了相同的“无法解析主机”错误。我添加的“链接”修复了我在弹性容器服务上的主机名解析问题!

version: '3'
services:
  appserver:
    links:
      - database:database
      - socks-proxy:socks-proxy

这允许我的应用服务器databasesocks-proxy主机名通信。格式为“SERVICE:ALIAS”,可以将它们保持为默认做法。

在您的示例中,它将是:

version: '3'
services:
  testapi:
    links:
      - testweb:testweb
  testweb:
    links:
      - testapi:testapi
于 2019-02-13T04:30:26.153 回答
0

AWS 不使用 Docker compose,但提供了一个接口来添加任务定义。需要一起通信的容器可以放在同一个Task定义上。然后我们还可以在链接部分指定将从当前容器调用的容器。每个容器都可以在任务定义的“主机”部分指定其容器名称。一旦我将容器名称添加到“主机”字段,Container1 (TestWeb) 就能够与 Container2 (TestAPI) 进行通信。

于 2017-11-01T14:02:40.760 回答