我正在使用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
答案 0 :(得分:2)
正如他们所提到的,您的容器似乎在端口80上运行。因此,无论出于何种原因,该端口都是暴露的。
也许EXPOSE $PORT
没有按您的预期返回8081?
运行容器时,除非您指定其映射位置,否则它仅在容器IP的裸露端口(在您的情况下为80)下可用。通过运行docker inspect <container_id>
通过执行docker run -p 8080:80 yourimage
之类的操作来测试您的图像。您会看到,除了图像公开的端口80外,它还被映射到本地端口8080,因此http://localhost:8080
应该可以访问。
请参见this,以防您
答案 1 :(得分:0)
它正在尝试在网络接口上使用IPv6协议。禁用IPv6并重新启动docker。看起来您可能两个应用程序都试图使用端口80。您只能在具有给定接口/ IP的给定端口上提供一个项目。尝试将API设置为使用其他端口号,例如8080。
答案 2 :(得分:0)
基础 dotnet 图像会覆盖默认的 kestrel 端口。为什么,我不知道。将环境声明添加到我的 docker 文件中为我解决了这个问题。