Docker容器端口6002连接被拒绝

时间:2019-04-16 01:00:24

标签: docker dockerfile

操作系统:适用于Windows的Docker。 OSType:Linux。 架构:x86_64

我有一个在Docker容器中运行的ASP.NET核心Web应用程序。以下是我的Dockerfile。

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

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["AdvPersonApi.csproj", "AdvPersonApi/"]
RUN dotnet restore "AdvPersonApi/AdvPersonApi.csproj"
COPY . ./AdvPersonApi/
WORKDIR "/src/AdvPersonApi"
RUN dotnet build "AdvPersonApi.csproj" -c Release -o /app

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

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

该应用程序成功构建。我还能够创建Docker映像并运行它。我希望可以在localhost:6002上访问该应用程序。我使用以下命令创建了容器:

docker run -p 6002:6002 --name advpersonapicontainerv2 advpersonapi:v2

我看到容器已创建并正在运行。

以下是docker ps的结果:

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
0484b184aeb8        advpersonapi:v2     "dotnet AdvPersonApi…"   About a minute ago   Up About a minute   0.0.0.0:6002->6002/tcp   advpersonapicontainerv2

问题是我无法在Container端口6002上访问该应用。以下命令拒绝连接:

    docker exec 0484b184aeb8 curl http://localhost:6002/api/person/time
     % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (7) Failed to connect to localhost port 6002: Connection refused

但是,如果我尝试

  

docker exec 0484b184aeb8 curl http:// localhost:80 / api / person / time

,我得到答复。我是Docker的新手。如何将主机端口6002正确映射到容器端口6002?

2 个答案:

答案 0 :(得分:-1)

我知道发生了什么事。通过将以下内容添加到appsettings.json中,我不得不强迫Kestrel监听端口6002。

 "Kestrel": {
    "EndPoints": {
      "Http": {
        "Url": "http://+:6002"
      }
    }
  }

记下@Timothy John Laird在上述评论中提供的提示

答案 1 :(得分:-1)

容器中的应用正在侦听80,因此在Dockerfile中公开端口80而不是6002。

EXPOSE 80

然后在运行容器时将主机端口6002映射到容器端口80:

docker run -p 6002:80 --name advpersonapicontainerv2 advpersonapi:v2

最好让容器化的应用程序在标准端口(例如80或8000)上侦听。您不想更新Dockerfile使其监听其他端口。这就是主机级别的运行时映射的工作。