在Localstack Lambda和Docker容器之间发出HTTP请求时出现HttpRequestException

问题描述

我有两个作为docker-compose文件一部分运行的docker容器,ContainerA是localstack,我在其中运行一个lambda函数,该函数试图使用以下简化代码向ContainerB发出HTTP POST请求:>

var content = new StringContent("{ "content": "sample" }",Encoding.UTF8,"application/json");
var httpClient = new HttpClient();
var response = await HttpClient.PostAsync("http://ContainerB/Foo",content);

哪个引发以下异常:

请求失败-System.Net.Http.HttpRequestException:名称或服务未知

如果我从Container A的控制台发出相同的请求,则该请求成功,例如

curl http://ContainerB/Foo -H "Content-Type: application/json" -d "{ "content": "sample" }"

随着该请求从控制台成功执行,我非常有信心这不是我的Docker容器之间的网络问题。

解决方法

每次执行时,都会在新的Docker容器中创建Localstack lambda,该Continant位于docker-compose堆栈之外,因此不属于docker-compose默认网络。有关更多信息,请参见this GitHub问题。

要解决此问题,必须首先在docker中创建一个外部桥接网络:

docker network create -d bridge MyNetwork

然后在docker compose文件中将每个docker容器连接到该容器,并将其注册为外部网络:

services:
  localstack:
    networks:
      - MyNetwork
  ...
  ...

networks:
  MyNetwork:
    external: true