docker - 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
解决方案
正如他们所提到的,您的容器似乎在端口 80 上运行。因此,无论出于何种原因,该端口都被暴露了。也许EXPOSE $PORT
没有像您期望的那样返回 8081 ?
当您运行容器时,除非您指定映射它的位置,否则它将仅在暴露端口(在您的情况下为 80)的容器 IP 上可用。通过运行轻松找出这个容器IPdocker inspect <container_id>
通过执行类似的操作来测试您的图像docker run -p 8080:80 yourimage
。您会看到,除了图像公开的端口 80 之外,它还被映射到您的本地端口 8080,因此http://localhost:8080
应该可以访问。
看看这个以防它帮助你
推荐阅读
- flutter - 颤振中的目录视图
- java - 添加到列表并使用该列表的子集来调用函数
- composer-php - 如何从作曲家插件中获取已安装的软件包?
- javascript - JS如何分组hh:mm - 小时数组没有分钟
- php - 尝试在空 Laravel/fortify 上读取属性“role_id”
- flutter - 用于获取 Flutter 应用程序的自动 Flutter 文档的包
- excel - 如何根据excel vba中的多个条件获取单元格位置?
- arm-template - Azure Policy 豁免引发模板错误
- webpack - webpack-dev-server hot reloved 未检测到 scss 中的更改
- amazon-web-services - Dynamodb 无权执行 dynamodb:PutItem