无法从 Docker 容器外部访问我的应用程序,但在容器内一切正常

Unable to reach my application from outside Docker container but everything works inside the container

我正尝试在 docker 容器中 运行 Rhino Compute,但遇到了一个奇怪的问题。我使用下面的 Dockerfile 构建了一个图像,当我在本地 运行 时,没有任何问题。

# escape=`

# see https://discourse.mcneel.com/t/docker-support/89322 for troubleshooting

# NOTE: use 'process' isolation to build image (otherwise rhino fails to install)

### builder image
FROM mcr.microsoft.com/dotnet/sdk:5.0 as builder

# copy everything, restore nuget packages and build app
COPY src/ ./src/
RUN dotnet publish -c Release -r win10-x64 --self-contained true src/compute.sln

### main image
# tag must match windows host for build (and run, if running with process isolation)
# e.g. 1903 for Windows 10 version 1903 host
FROM mcr.microsoft.com/windows:1809

#Copy the fonts and font install script
COPY fonts/* fonts/
COPY InstallFont.ps1 .

#Run font install scriptin powershell
RUN powershell -ExecutionPolicy Bypass -Command .\InstallFont.ps1

# install .net 4.8 if you're using the 1809 base image (see https://git.io/JUYio)
# comment this out for 1903 and newer
RUN curl -fSLo dotnet-framework-installer.exe https://download.visualstudio.microsoft.com/download/pr/7afca223-55d2-470a-8edc-6a1739ae3252/abd170b4b0ec15ad0222a809b761a036/ndp48-x86-x64-allos-enu.exe `
    && .\dotnet-framework-installer.exe /q `
    && del .\dotnet-framework-installer.exe `
    && powershell Remove-Item -Force -Recurse ${Env:TEMP}\*

# install rhino (with “-package -quiet” args)
# NOTE: edit this if you use a different version of rhino!
# the url below will always redirect to the latest rhino 7 (email required)
# https://www.rhino3d.com/download/rhino-for-windows/7/latest/direct?email=EMAIL
RUN curl -fSLo rhino_installer.exe https://www.rhino3d.com/download/rhino-for-windows/7/latest/direct?email=<myemail> `
    && .\rhino_installer.exe -package -quiet `
    && del .\rhino_installer.exe

# (optional) use the package manager to install plug-ins
# RUN ""C:\Program Files\Rhino 7\System\Yak.exe"" install jswan

# copy compute app to image
COPY --from=builder ["/src/dist", "/app"]
WORKDIR /app

# bind rhino.compute to port 5000

EXPOSE 5000

# uncomment to build core-hour billing credentials into image (not recommended)
# see https://developer.rhino3d.com/guides/compute/core-hour-billing/
#ENV RHINO_TOKEN=

CMD ["rhino.compute/rhino.compute.exe"]

申请代码在这里:https://github.com/mcneel/compute.rhino3d

如前所述,当我卷曲 localhost:5000 时,容器内部一切正常,没有任何问题。但是,当我尝试从主机 curl 时(在 运行ning docker run -p nodeport:containerport imagename 之后),我无法得到任何响应。我不确定它是否与防火墙有关或 Dockerfile 中的任何配置不正确。

感谢任何帮助。

默认情况下,EXPOSE 指令不会公开容器的端口以供主机访问。换句话说,它只使规定的端口可用于容器间交互。 例如,假设您有一个 Node.js 应用程序和一个部署在同一 Docker 网络上的 Redis 服务器。为确保 Node.js 应用程序与 Redis 服务器通信,Redis 容器应公开一个端口。 如果您查看官方 Redis 映像的 Docker 文件,会看到一行内容为 EXPOSE 6379。这就是允许两个容器相互通信的原因。 因此,当您的 Node.js 应用程序连接到 Redis 容器的 6379 端口时,EXPOSE 指令可确保发生容器间通信。

您无法通过 Docker 文件将端口发布到您的主机。您应该通过 docker-compose.yml 文件或通过命令行执行此操作。 使用 Docker 文件构建映像后,您可以使用以下命令将容器的端口 5000 发布到主机的端口 5000。

docker run -it image:tag -p 5000:5000

我怀疑问题可能出在“本地主机”上,因为它只从内部响应本地主机,而不会从其他任何地方响应。我们向 Dockerfile 添加了 .NET 变量 ASPNETCORE_URLS

# bind rhino.compute to port 5000
ENV ASPNETCORE_URLS="http://*:5000"
EXPOSE 5000

这将确保应用程序正在监听接口,而不仅仅是本地主机并解决了问题