首页 > 解决方案 > Docker 容器监听 http://[::]:80

问题描述

我正在使用 Docker for Windows 设置两个 Docker 容器。一个简单的基于节点的 Web 应用程序和一个 dotnet 核心 API 应用程序。我正在使用“docker-compose up”启动这两个容器。节点应用程序完美启动,我可以点击暴露的 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     

标签: dockerasp.net-core.net-coredocker-composedockerfile

解决方案


正如他们所提到的,您的容器似乎在端口 80 上运行。因此,无论出于何种原因,该端口都被暴露了。也许EXPOSE $PORT没有像您期望的那样返回 8081 ?

当您运行容器时,除非您指定映射它的位置,否则它将仅在暴露端口(在您的情况下为 80)的容器 IP 上可用。通过运行轻松找出这个容器IPdocker inspect <container_id>

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

看看这个以防它帮助你


推荐阅读