更改Docker容器中的dotnet核心端口

时间:2020-10-07 16:35:22

标签: docker .net-core dockerfile

我是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:无法分配请求的地址。 现在,我被封锁了,在这里需要帮助和建议。

1 个答案:

答案 0 :(得分:1)

首先了解您的Docker:

码头工人EXPOSE 50仅以码头工人而闻名,dotnet对码头工人一无所知。因此,在您的DockerTest.dll中,您还必须指定监听端口。

不要使用端口50,它太低。低于1024的任何端口都被视为众所周知的端口或系统端口,因此不应该使用它们。 dotnet通常在端口5000上侦听-不在80/443时。

关于您访问​​主机的第二个信息:

在docker容器中使用localhost时,它将不会到达主机,而只会到达容器本身。因此,您必须使用Host LAN IP,即192.168。或其他...