我是docker的新手,真的想体验它的功能。
在这里,我想在docker中(使用docker run
运行(托管)一个简单的Asp.net核心Web api,而不是使用IIS
运行它。
这很简单,因为它完全是默认的自动生成ASP.NET核心Web API项目,只有一个名为ValuesController
的控制器。通常,在使用IISExpress进行调试时,以下URI应该响应一个值数组:
http://localhost:[some_port]/api/values
现在,我为项目添加了docker支持(使用Windows容器)。构建docker之后,我有一个图像,可以使用docker images
列出它。
现在,我像这样运行docker来托管我的Web API:
docker run -t -rm -p 80:50633 hellodocker:dev
运行正常,我可以使用docker ps
进行检查。
但是,为了测试它是否确实有效,我尝试在浏览器中键入以下地址:
http://localhost/api/values
它不起作用,什么也没显示,看起来就像一个不存在的站点。
当我尝试以下命令docker exec [container_id] netstat
时,有时会显示一条状态为TIME_WAIT
的记录,几乎没有时间。尽管我不确定这是否与外界聆听有关。
这是dockerfile的内容:
FROM microsoft/dotnet:2.2-aspnetcore-runtime-nanoserver-1803 AS base
WORKDIR /app
EXPOSE 50633
EXPOSE 44322
FROM microsoft/dotnet:2.2-sdk-nanoserver-1803 AS build
WORKDIR /src
COPY HelloDocker/HelloDocker.csproj HelloDocker/
RUN dotnet restore HelloDocker/HelloDocker.csproj
COPY . .
WORKDIR /src/HelloDocker
RUN dotnet build HelloDocker.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish HelloDocker.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "HelloDocker.dll"]
我真的很坚持。一个hello-world应用程序可能只打印出一个简单的字符串,但是此hellodocker
应该托管在docker中,并像在IIS中托管它一样处理所有HTTP请求。
您可能没有解决方案,但请给我一些建议以帮助诊断此问题。谢谢!
更新:
尝试删除已构建的映像并重新构建另一个映像之后。使用上面相同的docker run
命令运行后,看起来似乎有所不同:
Hosting environment: Production
Content root path: C:\app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
和以前一样,什么都没有显示,并且提示根路径变为C:\app
。
因此,这次看起来更明显是在侦听请求。但是,它仍然不起作用:(
答案 0 :(得分:1)
在您的ENTRYPOINT语句之前,尝试添加
ENV ASPNETCORE_URLS=http://+:50633 DOTNET_RUNNING_IN_CONTAINER=true
所以看起来像这样:
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENV ASPNETCORE_URLS=http://+:50633 DOTNET_RUNNING_IN_CONTAINER=true
ENTRYPOINT ["dotnet", "HelloDocker.dll"]
有帮助吗?
答案 1 :(得分:0)
看起来我应该已经在所有Docker专家都更感兴趣的Docker论坛中发布了这个问题(与本领域的SO相比)。
不确定为什么我无法从Docker论坛中搜索解决方案,但是尝试搜索Now listening on: http://[::]:80
之后,它导致我在https://forums.docker.com/t/unable-to-launch-the-net-core-website-in-docker/48129的docker论坛中找到了一个非常相似的问题的高层链接。 / p>
因此,我尝试使用一种解决方案,首先使用docker inspect [container_id]
查找容器的IP,然后使用该IP成功访问Web API:)
可以在Networks
部分中找到容器的IP:
"Networks": {
"nat": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "e336becc4500435f7338ebd8f84fef47ec2fc247f77bc82b6dbf49553f68afd5",
"EndpointID": "a8ede68e3f4bb02392c295901f65d50f0ee014c114f564768d9c82a4644b0218",
"Gateway": "172.30.240.1",
"IPAddress": "172.30.242.85",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "00:15:5d:5a:29:8d",
"DriverOpts": null
}
}
我现在用来测试Web api的正确地址是:
http://172.30.242.85/api/values
更新:
我假设EXPOSE 50633
意味着Docker将通过端口50633
公开Web api,因此我运行命令docker run -t -p 80:50633 hellodocker:dev
。
但是实际上它在这里公开的端口仍然是默认的80
(不确定原因)。但这至少是有道理的。因此,要映射docker和主机之间的端口,我们使用命令docker run -t -p:80:80 hellodocker:dev
。
我已经尝试过了,它非常适合http://localhost/api/values
。
我认为docker run -t -p:80:50633 hellodocker:dev
之前使用的命令具有无用的端口映射(至少用于测试来自主机的Web api),因为如果码头工人实际运行Web api来监听,http://172.30.242.85/api/values
应该可以工作在默认端口80
上。