在http://[:]:80上侦听的Docker容器

在http://[:]:80上侦听的Docker容器,docker,asp.net-core,.net-core,docker-compose,dockerfile,Docker,Asp.net Core,.net Core,Docker Compose,Dockerfile,我正在使用Docker for Windows设置两个Docker容器。一个简单的基于节点的web应用程序和dotnet核心API应用程序。我使用“docker compose up”启动这两个容器。node应用程序启动得很好,我可以点击暴露的URL,但是dotnet应用程序似乎不起作用 docker compose up命令的输出如下: application.client_1 | INFO: Accepting connections at http://localhost:8080 ap

我正在使用Docker for Windows设置两个Docker容器。一个简单的基于节点的web应用程序和dotnet核心API应用程序。我使用“docker compose up”启动这两个容器。node应用程序启动得很好,我可以点击暴露的URL,但是dotnet应用程序似乎不起作用

docker compose up命令的输出如下:

application.client_1  | INFO: Accepting connections at http://localhost:8080
application.api_1     | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
application.api_1     |       No XML encryptor configured. Key {cc83a8ac-e1de-4eb3-95ab-8c69a5961bf9} may be persisted to storage in unencrypted form.
application.api_1     | Hosting environment: Development
application.api_1     | Content root path: /app/application.Api
application.api_1     | Now listening on: http://[::]:80
application.api_1     | Application started. Press Ctrl+C to shut down.
Docker文件如下所示:

FROM microsoft/dotnet AS build
WORKDIR /app
ENV PORT=8081

COPY application.Api/application.Api.csproj application.Api/
COPY application.Business/application.Business.csproj application.Business/
COPY application.DataAccess/application.DataAccess.csproj application.DataAccess/
COPY application.DataModel/application.DataModel.csproj application.DataModel/
WORKDIR /app/application.Api
RUN dotnet restore

WORKDIR /app/
COPY application.Api/. ./application.Api/
COPY application.Business/. ./application.Business/
COPY application.DataAccess/. ./application.DataAccess/
COPY application.DataModel/. ./application.DataModel/
WORKDIR /app/application.Api
RUN dotnet publish -c Release -o out

FROM microsoft/dotnet AS runtime
WORKDIR /app/application.Api
COPY --from=build /app/application.Api/out .
ENTRYPOINT ["dotnet", "application.Api.dll" ]
EXPOSE $PORT
我无法获得IP,因此点击了API url。如果您有任何想法,我将不胜感激,因为我对Docker还很陌生


更新1:编写YML

version: '3.4'

services:
  tonquin.api:
    image: application.api
    ports: 
      - 8081:5000
    build:
      context: .
      dockerfile: Dockerfile

  tonquin.client:
    image: application.client
    ports: 
      - 8080:8080
    build:
      context: .
      dockerfile: ../application.Client/Dockerfile     

它试图在网络接口上使用IPv6协议。禁用IPv6并重新启动docker。看起来两个应用程序都在尝试使用端口80。您只能在具有给定接口/IP的给定端口上提供一个项目。尝试将API设置为使用不同的端口号,如8080。

如他们所述,您的容器似乎正在端口80上运行。所以不管出于什么原因,这就是暴露的端口。 可能
EXPOSE$PORT
没有像您预期的那样返回8081

当您运行容器时,除非您指定映射它的位置,否则它将仅在容器的IP公开端口(在您的情况下为80)处可用。通过运行
docker inspect

通过执行类似于docker run-p 8080:80 yourimage的操作来测试您的图像。您将看到,除了图像公开的端口80之外,它还被映射到本地端口8080,以便
http://localhost:8080
应该可以访问

请参见,以防它对您有所帮助

请参见


基本dotnet映像覆盖默认的kestrel端口。为什么,我不知道。将环境声明添加到docker文件中解决了我的问题。

我不完全确定如何禁用此容器的IPv6,因为对于端口,我想我已经在单独的端口8080和8081上设置了它们,使用我在编辑上述问题时发布的compose yml。谢谢您的回复。@KyleJohnson
正在收听:http://[:]:80
告诉我它正在尝试使用端口80。