我是Docker的新手,我一直在阅读文档并进行一些实验,但是我没有得到什么。 案例是我有两个应用程序,一个是dotnet core Web应用程序,另一个是dotnetcore web Api。我正在容器内运行dotnet核心Web应用程序。以下是docker文件:
WORKDIR /source
COPY . ./DockerTest/
WORKDIR /source/DockerTest
RUN dotnet publish -c release -o /app
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
EXPOSE 50/TCP
EXPOSE 50/UDP
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "DockerTest.dll","--environment=development"]
我执行以运行该映像的命令是:docker run -d -p 90:50 myapp
现在在这里,我尝试将50个dotnetcore应用程序应在其上运行的端口映射到主机上的端口90。但是不幸的是,我在EXPOSE中输入的端口始终在容器内的端口80上运行,我想知道为什么会这样以及如何更改它。第二件事是从容器中尝试访问运行在主机上的Web API:
public async Task<string> GetData()
{
var data = "";
var request = new HttpRequestMessage(HttpMethod.Get,
"http://localhost:51468/weatherforecast");
using (var context = ClientFactory.CreateClient()){
var response = await context.GetAsync(request.RequestUri);
if (response.IsSuccessStatusCode)
{
data = await response.Content.ReadAsStringAsync();
}
else
{
data = "error happen";
}
}
return data;
}
这是我尝试将请求发送到容器外部的api的方式,但它给出此错误:HttpRequestException:无法分配请求的地址。 现在,我被封锁了,在这里需要帮助和建议。
答案 0 :(得分:1)
首先了解您的Docker:
码头工人EXPOSE 50
仅以码头工人而闻名,dotnet对码头工人一无所知。因此,在您的DockerTest.dll
中,您还必须指定监听端口。
不要使用端口50,它太低。低于1024的任何端口都被视为众所周知的端口或系统端口,因此不应该使用它们。 dotnet通常在端口5000上侦听-不在80/443时。
关于您访问主机的第二个信息:
在docker容器中使用localhost
时,它将不会到达主机,而只会到达容器本身。因此,您必须使用Host LAN IP,即192.168。。或其他...