在http:// [::]:80

时间:2018-06-25 23:37:03

标签: docker asp.net-core .net-core docker-compose dockerfile

我正在使用Windows版Docker设置两个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网址。任何想法都将不胜感激,因为我是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     

3 个答案:

答案 0 :(得分:2)

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

运行容器时,除非您指定其映射位置,否则它仅在容器IP的裸露端口(在您的情况下为80)下可用。通过运行docker inspect <container_id>

轻松找出该容器Ip

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

请参见this,以防您

答案 1 :(得分:0)

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

答案 2 :(得分:0)

this answer.

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