Docker容器监听http://[::]:80端口。

10
我正在使用Docker for Windows设置两个Docker容器。一个是基于Node的简单Web应用程序,另一个是基于.NET Core的API应用程序。我使用"docker-compose up"启动这两个容器。Node应用程序可以完美地启动,并且可以访问公开的URL,但是.NET应用程序似乎无法正常工作。
以下是"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网址。由于我对Docker还很陌生,所以希望您能提供任何想法。


更新1:Compose 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     
4个回答

4

根据他们提到的信息,似乎您的容器正在80端口上运行。因此无论出于什么原因,这是被暴露的端口。 也许EXPOSE $PORT没有返回预期的8081?

当您运行容器时,除非指定要映射到哪里,否则它只能在容器的IP和暴露的端口(在您的情况下为80)处使用。通过运行docker inspect <container_id>轻松找出此容器IP。

通过执行类似docker run -p 8080:80 yourimage的操作测试您的镜像。您会发现,除了镜像暴露的80端口外,它还被映射到本地端口8080,以便可以到达http://localhost:8080

如果有帮助,请参见此页面


1

请查看这个答案

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


0

如果您正在运行一个.NET应用程序,请尝试验证以下几点:

1)

    Class Program
    { ...
            // Configure the HTTP request pipeline.
            //if (app.Environment.IsDevelopment())
            //{
                app.UseSwagger();
                app.UseSwaggerUI();
            //}

像我一样,对你的代码进行注释。

  1. 验证是否正在使用端口绑定,例如
 -p 8088:80 -p 8043:443
  • 打开你的浏览器,例如 localhost:PORT

  • -1

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


    我不确定如何为此容器禁用IPv6。至于端口,我认为我已经在使用我在上面编辑问题时发布的compose yml中设置了分别为8080和8081的端口。谢谢您的回复。 - Kyle Johnson
    @KyleJohnson 现在侦听的端口为:http://[::]:80 告诉我它正在尝试使用80端口。 - Joel Coehoorn

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接