asp.net - 如何访问我的 docker asp.net 核心应用程序?
问题描述
我有一个由 ASP.NET Core 2.2./PostgreSQL 组成的 docker 解决方案,它似乎在容器中运行良好。
我遵循了官方快速入门:Compose 和 ASP.NET Core 与 SQL Server和快速入门:Compose 和 Django的混合,以及将 node.js 添加到组合中的解决方案。
为了简洁起见,我Dockerfile
在这篇文章中省略了实际内容。Dockerfile
应该很标准:
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
命令,因为这与我在开发环境中所做的完全相同。在进一步调查了我最初对项目进行 docker 化的尝试之后,我决定退后一步,从 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
从主机访问。
解决方案
由于您没有发布 Dockerfile,我不能肯定地说,但是您的 Dockerfile 中有“EXPOSE 5001”吗?也许如果缺少它会导致这种行为。
推荐阅读
- flutter - 在嵌套小部件中使用 GetxController 的最佳方式
- python - 如何使用地图或循环来解码变压器数据集?
- c - 如何在 C 中使用嵌套结构?
- python - (逐步)将“DeprecationWarnings”变成 Python 中的致命错误
- python - p==q 时的 RSA 加密
- python - Flask - 在函数中调用函数
- apache - Fathom lite 分析 - 为什么我收到“POST /api/session HTTP/1.1”401 32”?
- ubuntu - 如何使用 apt 在 Ubuntu 18 上将仪表安装为软件包?
- python - 我如何在 python 中使用 science-parse-api?
- python - 如何在 Python 中处理 html 元素中的 nbsp?