如何访问我的docker asp.net核心应用程序?

问题描述 投票:0回答:1

我有一个ASP.NET核心2.2./PostgreSQL组成的docker解决方案似乎在容器中工作正常。

我跟随官方Quickstart: Compose and ASP.NET Core with SQL ServerQuickstart: Compose and Django的混合,提供了将node.js添加到混合中的解决方案。

为了简洁起见,我在这篇文章中省略了实际的DockerfileDockerfile应该是非常标准的:

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
COPY . /app
WORKDIR /app

RUN curl -sL https://deb.nodesource.com/setup_10.x |  bash -
RUN apt-get install -y nodejs

RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 80/tcp
EXPOSE 5001/tcp
RUN chmod +x ./entrypoint.sh
CMD /bin/bash ./entrypoint.sh

其中entrypoint.sh实际启动Web服务器并迁移EF迁移,如下所示:

#!/bin/bash

set -e
run_cmd="dotnet run"

until dotnet ef database update; do
>&2 echo "PostgreSQL Server is starting up"
sleep 1
done

>&2 echo "PostgreSQL Server is up - executing command"
exec $run_cmd

最后我的docker-compose.yml看起来像这样:

version: '3.4'

networks:
  aspnetpostgresql:
    driver: bridge

services:
  db:
    image: postgres
    restart: always
    networks: 
      - aspnetpostgresql
  web:
    build: .
    ports:
        - "5001:5001"
        - "5000:5000"
    depends_on:
        - db
    networks: 
      - aspnetpostgresql

ASP.NET Core映像基于mcr.microsoft.com/dotnet/core/sdk:2.2。我只想说,我有两个容器,my_web_app_db_1(PostgreSQL)和my_web_app_web_1(ASP.NET Core 2.2.React Web App)。我已登录my_web_app_web_1-container并确定Web服务器正在https://localhost:5001上运行:

root@0123456780:/app# wget -p --no-check-certificate https://localhost:5001
--2019-04-17 19:46:29--  https://localhost:5001/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:5001... connected.
WARNING: The certificate of 'localhost' is not trusted.
WARNING: The certificate of 'localhost' hasn't got a known issuer.
HTTP request sent, awaiting response... 200 OK
Length: 1673 (1.6K) [text/html]
Saving to: 'localhost:5001/index.html'

localhost:5001/index.html                100%[==================================================================================>]   1.63K  --.-KB/s    in 0s      

# .... yada yada yada

FINISHED --2019-04-17 19:46:30--
Total wall clock time: 0.4s
Downloaded: 4 files, 3.2M in 0.1s (23.3 MB/s)

换句话说,Web服务器端的一切似乎都很好。

ABCDE-MacBook-Pro:MyWebApp MY_USER$ docker-compose ps
      Name                    Command               State                           Ports                         
------------------------------------------------------------------------------------------------------------------
my_web_app_db_1    docker-entrypoint.sh postgres    Up      5432/tcp                                              
my_web_app_web_1   /bin/sh -c /bin/bash ./ent ...   Up      0.0.0.0:5000->5000/tcp, 0.0.0.0:5001->5001/tcp, 80/tcp

请注意:5001端口也暴露给主机,通过向右滚动可以看到。

但是,所有与https://localhost:5001连接的尝试均未成功。例如。从主机运行相同的wget操作

ABCDE-MacBook-Pro:MyWebApp MY_USER$ wget -p --no-check-certificate https://localhost:5001
--2019-04-17 23:00:05--  https://localhost:5001/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:5001... connected.
Unable to establish SSL connection.

curl操作同样不成功:

ABCDE-MacBook-Pro:MyWebApp MY_USER$ curl -k https://localhost:5001curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to localhost:5001 

最后,我知道aspnetcore-image固有地绑定到80端口:

此映像将ASPNETCORE_URLS环境变量设置为http://+:80,这意味着如果您没有明确地在应用程序中设置URL,例如通过Program.cs中的app.UseUrl,那么您的应用程序将在容器内的端口80上进行侦听。

然而,对我来说似乎并非如此,因为我能够wget移植到5001。这不适用于SDK映像,或者文档不是最新的。

问题是,如何从主机访问https://localhost:5001我需要做什么?

更新:

我设置的目标是根据db实体框架迁移来创建和播种数据库。最终的docker设置旨在供早期测试人员使用,因此不适用大规模的生产考虑因素。

当涉及到确切的数据库启动机制时,我非常不可知,但只要开发还远未完成,我的要求就是模式易于维护并且迁移很容易部署。因此,如果我可以运行它将会很方便

dotnet ef database update

命令,因为这与我在开发环境中完全相同。在进一步调查我最初尝试将我的项目停靠后,我决定退后一步,从ASP.NET Core项目本身运行实际的迁移。这可能不是最干净的解决方案,但它解决了我的实际情况:即让docker设置复制我的开发环境。对于那些感兴趣的人,我的Dockerfile现在看起来像这样:

FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /app

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt-get install -y nodejs

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=build-env /app/out . 

EXPOSE 80/tcp

ENTRYPOINT ["dotnet", "MyWebApp.dll"]

DbContext看起来像这样:

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
        Database.Migrate();
    }

    // ...

}

docker-compose.yml和以前差不多(尽管我删除了网络配置)。现在我可以从主机访问http://localhost:8000了。

asp.net docker asp.net-core docker-compose
1个回答
0
投票

由于你没有发布Dockerfile,我不能肯定地说,但你的Dockerfile中有“EXPOSE 5001”吗?也许如果缺少它会导致这种行为。

© www.soinside.com 2019 - 2024. All rights reserved.