【问题标题】:Cannot open dockerized .net core api on custom port无法在自定义端口上打开 dockerized .net core api
【发布时间】:2019-08-07 14:31:03
【问题描述】:

docker-compose up myapp.sample.api

Creating network "myapp_frontend" with the default driver
myapp-sample-mssql-cnr is up-to-date
Creating myapp-sample-api-cnr ... done
Attaching to myapp-sample-api-cnr
myapp-sample-api-cnr       | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
myapp-sample-api-cnr       |       No XML encryptor configured. Key {daa358c7-8c64-4e3c-90ea-06f48de12ad4} may be persisted to storage in unencrypted form.
myapp-sample-api-cnr       | Hosting environment: Development
myapp-sample-api-cnr       | Content root path: /app
myapp-sample-api-cnr       | Now listening on: http://[::]:5000
myapp-sample-api-cnr       | Application started. Press Ctrl+C to shut down.

这里的问题是我无法在这个指定的端口上打开我的 web api 应用程序

http://localhost:5000 

返回无法得到邮递员的任何回复

在本地我可以通过 Visual Studio 调试打开这个应用程序。

docker-compose.yml

version: '3.4'

networks:
    frontend:
    backend:

services:
    myapi.sample.api:        
        build:
            context: .
            dockerfile: MyApi.Sample.API/Dockerfile
        image: myappsampleapi-img          
        container_name: myapp-sample-api-cnr    
        ports:
            - "5000:80"
        networks:
            - backend
            - frontend
        depends_on:
            - mssqlserver

    mssqlserver:
        image: "microsoft/mssql-server-linux:latest"
        ports:
            - "1445:1433"

        container_name: myapp-sample-mssql-cnr        
        networks:
            - backend

Dockerfile

FROM microsoft/dotnet:2.2-aspnetcore-runtime as base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ...
...
ENTRYPOINT ["dotnet", "MyApi.Sample.API.dll"]

我无法从 api 容器获取任何日志输出

docker logs -f myapp-sample-api-cnr

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {82dd75ea-8302-4859-a3e5-78eedf856e34} may be persisted to storage in unencrypted form.
Hosting environment: Development
Content root path: /app
Now listening on: http://[::]:5000
Application started. Press Ctrl+C to shut down.

编辑: 我试图更改 Dockerfile 以公开端口 5000 而不是 80

FROM microsoft/dotnet:2.2-aspnetcore-runtime as base
WORKDIR /app
EXPOSE 5000

在 docker ps -a 我得到了

CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS              PORTS                                                   NAMES
964724837d13         myappsampleapi-img                   "dotnet MyApi.S…"   45 seconds ago      Up 43 seconds       5000/tcp, 0.0.0.0:5000->80/tcp, 0.0.0.0:32788->80/tcp   myapp-sample-api-cnr

还是有同样的问题,无法从localhost:5000上的api得到响应

【问题讨论】:

  • 你能显示你的'myapi.sample.api'容器的日志吗?
  • 由于某种原因,我无法从容器中获取日志输出。在本地它可以工作。
  • 也许是个愚蠢的问题,但容器是否正在运行? (docker ps -a)

标签: .net docker .net-core


【解决方案1】:

在您的 docker-compose.yml 文件中,myapi.sample.api 服务运行一个提供以下日志的进程:

...
Now listening on: http://[::]:5000

这意味着您的进程正在侦听绑定到 容器 IP 地址的端口 5000

您还使用ports: 指令将容器内打开的端口发布到docker 主机 上打开的另一个端口上。请记住,每个容器都有自己的 IP 地址,该地址与您的 docker 主机不同。在 docker 世界中,发布一个端口意味着在 docker 主机上打开一个连接到容器端口的端口

ports: 指令语法为:

HOST:CONTAINER

或者换句话说:

<port to open on the docker host>:<port already opened within the container>

由于您似乎想通过连接到 docker 主机的端口 5000 来连接到容器的端口 5000,所以 ports: 指令应该是:

    ports:
      - 5000:5000

【讨论】:

    【解决方案2】:

    似乎你在作曲家文件中混合端口。

    不应该是 80:5000 吗?

    要么指定两个端口 (HOST:CONTAINER),要么只指定容器端口(选择一个临时主机端口)。

    https://docs.docker.com/compose/compose-file/

    【讨论】:

    • 我不确定这个原因,因为我可以使用相同的方法访问容器化端口 1445 上的 sql server。我仍然尝试切换到 80:5000,但仍然是同样的问题。
    • Dockerfile 应该暴露 5000,不是吗?
    • 尝试公开 5000 而不是 80,删除图像,再次重建它,但仍然是同样的问题。问题已更新。
    • 让它- "5000:5000"
    • @Thomasleveil 确实有效。您能否详细说明一下并作为答案发布我会接受的
    猜你喜欢
    • 2022-01-19
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多