操作系统:。OSType: linux。体系结构: x86_64
我有一个ASP.NET核心网络应用程序运行在一个码头容器。下面是我的Dockerfile。
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 6002
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["AdvPersonApi.csproj", "AdvPersonApi/"]
RUN dotnet restore "AdvPersonApi/AdvPersonApi.csproj"
COPY . ./AdvPersonApi/
WORKDIR "/src/AdvPersonApi"
RUN dotnet build "AdvPersonApi.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "AdvPersonApi.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
EXPOSE 6002
ENTRYPOINT ["dotnet", "AdvPersonApi.dll"]该应用程序构建成功。我还可以创建Docker映像,并运行它。我希望该应用程序可以在本地主机:6002访问。我使用以下命令创建容器:
docker run -p 6002:6002 --name advpersonapicontainerv2 advpersonapi:v2我看到容器是创建并运行的。
以下是停靠者ps的结果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0484b184aeb8 advpersonapi:v2 "dotnet AdvPersonApi…" About a minute ago Up About a minute 0.0.0.0:6002->6002/tcp advpersonapicontainerv2问题是我无法访问容器端口6002的应用程序。以下命令拒绝连接:
docker exec 0484b184aeb8 curl http://localhost:6002/api/person/time
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (7) Failed to connect to localhost port 6002: Connection refused但是,如果我尝试
码头主管0484b184aeb8卷曲/api/person/time
我得到了回应。我是码头新来的。如何正确地将主机端口6002映射到容器端口6002?
发布于 2019-04-18 19:38:21
我弄明白了到底是怎么回事。我不得不强迫Kestrel听6002端口,方法是在appsettings.json中添加下面的内容。
"Kestrel": {
"EndPoints": {
"Http": {
"Url": "http://+:6002"
}
}
}归功于@在上述评论中提供的提示
发布于 2019-04-18 19:52:27
容器内的应用程序正在监听80,因此在Dockerfile中公开端口80而不是6002。
EXPOSE 80然后在运行容器时将主机端口6002映射到容器端口80:
docker run -p 6002:80 --name advpersonapicontainerv2 advpersonapi:v2最好让容器化的应用程序监听标准端口,比如80或8000。您不希望更新Dockerfile以使其侦听其他端口。这是主机级运行时映射的工作。
https://stackoverflow.com/questions/55699141
复制相似问题