当前位置: 首页 > 知识库问答 >
问题:

无法在两个兄弟容器之间通信

元英朗
2023-03-14

我有两个项目,一个是aspnet核心API项目,另一个是xUnit e2e项目,两者都部署在两个不同的容器中。

一旦两个容器都启动并运行,e2e容器就会尝试在url上访问Web API项目的APIhttps://web-api-container:5010/.但e2e项目无法实现API项目。似乎无法使用其主机名访问API项目(http://web-api-container:5010/). 我的cli中出现以下错误:

|错误消息:|System.Net.Http。HttpRequestException:连接被拒绝|---System.Net.Sockets。SocketException:连接被拒绝|堆栈跟踪:|,位于System.Net.Http.ConnectHelper。在System.Threading.Tasks.ValueTask1.get_Result()|和System.Net.Http.HttpConnectionPool上的ConnectAsync(字符串主机、Int32端口、取消令牌和取消令牌)。在System.Threading.Tasks.ValueTask1.get_

即使我尝试访问我的Web API url(http://web-api-container:5010/)直接从我的主机浏览器,我得到的网站无法访问错误。但如果我导航到http://localhost:5010/通过我的web浏览器,我可以从API获得响应。

/来源/WebAPI/Dockerfile:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY Source/WebAPI/WebAPI.csproj Source/WebAPI/
COPY Tests/WebAPI.UnitTests/WebAPI.UnitTests.csproj Tests/WebAPI.UnitTests/

RUN dotnet restore Tests/WebAPI.UnitTests/WebAPI.UnitTests.csproj
RUN dotnet restore Source/WebAPI/WebAPI.csproj

COPY . .

WORKDIR /src/Tests/WebAPI.UnitTests/
RUN dotnet build && dotnet test -c Release /p:CollectCoverage=true /p:CoverletOutputFormat=json /p:CoverletOutput=./TestResults/Coverage/


WORKDIR /src/Source/WebAPI
RUN dotnet build WebAPI.csproj -c Release -o /app



FROM build AS publish
RUN dotnet publish WebAPI.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebAPI.dll"]

. /Tests/WebAPI.EndToEndTests/Dockerfile:

#pull from microsoft/dotnet
FROM microsoft/dotnet:2.1.301-sdk AS build

WORKDIR /src

# copying
COPY Tests/WebAPI.EndToEndTests/WebAPI.EndToEndTests.csproj Tests/WebAPI.EndToEndTests/

#restore 
RUN dotnet restore Tests/WebAPI.EndToEndTests/WebAPI.EndToEndTests.csproj

#copy rest
COPY . .

#build
WORKDIR /src/Tests/WebAPI.EndToEndTests
RUN dotnet build
CMD ["sh", "-c", "sleep 1m && dotnet test --logger trx"]

./docker-compose.yml:

version: '3.4'

services:
  webapi:
    container_name: web-api-container
    image: web-api-image
    build:
      context: .
      dockerfile: Source/WebAPI/Dockerfile
    ports:
      - 5010:80
      - 5001:443
    networks: 
      - my-network

  webapiendtoend:
    container_name: e2e-test-container
    image: Web-api-endtoend-test-image
    build:
      context: .
      dockerfile: Tests/WebAPI.EndToEndTests/Dockerfile
    networks:  
      - my-network

  rabbitmq:
    container_name: rabbitmq-container
    image: "rabbitmq:3.7-management"
    ports:
      - 5672:5672
      - 15672:15672
    tty: true
    networks:  
      - my-network
    volumes:
      - ./Source/WebAPI/RabbitMQConfig/rabbitmq.config:/etc/rabbitmq/rabbitmq.config:ro
      - ./Source/WebAPI/RabbitMQConfig/definitions.json:/etc/rabbitmq/definitions.json:ro

networks:
  my-network:

测试\WebAPI.EndToEndTests\appsettings.json:

{
  "MessageQueueApi": {
    "Url": "http://web-api-container:5010/"
  }
}

. /Tests/WebAPI.EndToEndTests/Test/BaseTest.cs:

public class BaseTest : IDisposable
    {
        public BaseTest()
        {
            var appSettings = AppSettings.Current;
            var httpClientHandler = new HttpClientHandler()
            {
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
            };
            this.HttpClient = new HttpClient(httpClientHandler)
            {
                BaseAddress = appSettings.MessageQueueApi.Url,

            };
            Console.WriteLine("<---API URL is --->" + appSettings.MessageQueueApi.Url);

            Console.WriteLine("---Base address");
            Console.WriteLine(this.HttpClient.BaseAddress);
        }

        public HttpClient HttpClient { get; set; }

        public List<string> AllValues { get; set; }

        public void Dispose() => this.HttpClient.Dispose();

        protected async Task GetAllValues()
        {
            Console.WriteLine("----in get all values---");
            var response  = await this.HttpClient.GetAsync("api/values");
            response.StatusCode.ShouldBe(HttpStatusCode.OK);         
        }


        protected Task<HttpResponseMessage> ClearCache() =>
            this.HttpClient.PostAsJsonAsync("cache/clear", string.Empty);
    }

共有1个答案

堵鸿光
2023-03-14

5010是暴露于主机的端口。您可以使用容器中的容器端口进行通信。使用端口80而不是使用5010

http://web-api-container:80

这将完成这项工作。

 类似资料:
  • 问题内容: 有两个Java文件,Server.java和Client.java。两者都放在单独的容器中。 DOCKER FILES: 我用于服务器的dockerfile(位于名为“ Server”的文件夹中)为: 客户端的dockerfile(位于名为``Client’‘的文件夹中)为: 构建容器: 使用以下容器构建容器 运行容器: 我使用命令运行图像。然后我首先运行serverimage。 我得

  • 问题内容: 我正在macOS 10.12上使用Docker 1.12.5,并且正在使用我设置一个开发环境,其中包含一个 应用程序 映像和一个共享的 Redis 映像,其中包含一些预先填充的配置变量。 即使遵循了一些教程(并阅读了Mac上不可用的知识),我仍在努力连接两个容器。 我使用以下命令开始我的图像: 在我的图像中,我有: 而 从我的Mac 我可以通过连接成功命令没有问题。 但是,当我开始一个

  • 我有三个集装箱: 前(vuejs) 服务器(nodejs) mongo(mongodb) http://server:3000/MyGetRoute 注意:此路由可以从我的浏览器通过 http://localhost:3000/mygetroute

  • 我有2个Docker容器:App 应用程序-包含php应用程序代码的简单容器。它仅用于存储代码并将代码传递到远程Docker主机。 应用映像Dockerfile: Web服务容器,由PHP-FPM Nginx组成。 Web image Dockerfile: 我的问题:是否可以通过套接字链接Web容器和App容器? 主要原因是使用应用程序容器将更新的代码部署到远程Docker主机。使用卷/命名卷在

  • 我遇到了一个有趣的场景,我需要让Child1调用Child2的方法。 我试图创建一个Child2的实例,并将其方法作为道具传递给Child1。我不确定这是否是正确的做法。

  • 基本上是新的反应,我有点困惑如何正确地传递组件之间的状态。我发现一个类似的问题已经出现了——将表单元素状态传递给兄弟/父元素的正确方法是什么?但是我想知道你能否给我一个关于下面代码的具体答案。 目前应用的结构包括: 父组件- 2个孩子:和 目标是对我的Meteor收藏进行异步搜索,并仅显示与搜索词匹配的