使用 Docker Compose 通过 HTTPS 托管 ASP.NET Core 映像

ASP.NET Core 默认使用 HTTPSHTTPS 依赖于信任、标识和加密的证书

本文档介绍如何通过 HTTPS 运行预生成的容器映像。

有关开发方案,请参阅使用 Docker 通过 HTTPS 开发 ASP.NET Core 应用程序

此示例需要 Docker 17.06 或更高版本的 Docker 客户端

先决条件

本文档中的某些说明需要 .NET Core 2.2 SDK 或更高版本。

证书

域的生产托管需要来自证书颁发机构的证书。 Let's Encrypt 是提供免费证书的证书颁发机构。

本文档使用自签名开发证书localhost 上托管预生成的映像。 说明类似于使用生产证书。

对于生产证书:

  • dotnet dev-certs 工具不是必需的。
  • 无需将证书存储在说明中使用的位置。 将证书存储在站点目录之外的任何位置。

以下部分中包含的说明使用 docker-compose.yml 中的 volumes 属性将证书卷安装到容器中。可以使用 Dockerfile 中的 COPY 命令将证书添加到容器映像中,但不建议这样做。 不建议将证书复制到映像中,原因如下:

  • 使用开发人员证书进行测试时,很难使用相同的映像。
  • 使用生产证书进行托管时,很难使用相同的映像。
  • 证书泄露的风险很大。

使用 docker compose 启动支持 https 的容器

使用以下说明进行操作系统配置。

使用 Linux 容器的 Windows

生成证书并配置本地计算机:

dotnet dev-certs https -ep "$env:USERPROFILE\.aspnet\https\aspnetapp.pfx"  -p $CREDENTIAL_PLACEHOLDER$
dotnet dev-certs https --trust

使用 .NET CLI 的上一个命令:

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p $CREDENTIAL_PLACEHOLDER$
dotnet dev-certs https --trust

在上述命令中,将 $CREDENTIAL_PLACEHOLDER$ 替换为密码。

创建包含以下内容的 docker-compose.debug.yml 文件:

version: '3.4'

services:
  webapp:
    image: mcr.microsoft.com/dotnet/samples:aspnetapp
    ports:
      - 80
      - 443
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_Kestrel__Certificates__Default__Password=password
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
    volumes:
      - ~/.aspnet/https:/https:ro

docker compose 文件中指定的密码必须与证书使用的密码匹配。

使用为 HTTPS 配置的 ASP.NET Core 启动容器:

docker-compose -f "docker-compose.debug.yml" up -d

macOS 或 Linux

生成证书并配置本地计算机:

dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p $CREDENTIAL_PLACEHOLDER$
dotnet dev-certs https --trust

仅 macOS 和 Windows 上支持 dotnet dev-certs https --trust。 你需要以发行版支持的方式信任 Linux 上的证书。 你可能需要信任浏览器中的证书。

在上述命令中,将 $CREDENTIAL_PLACEHOLDER$ 替换为密码。

创建包含以下内容的 docker-compose.debug.yml 文件:

version: '3.4'

services:
  webapp:
    image: mcr.microsoft.com/dotnet/samples:aspnetapp
    ports:
      - 80
      - 443
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_Kestrel__Certificates__Default__Password=password
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
    volumes:
      - ~/.aspnet/https:/https:ro

docker compose 文件中指定的密码必须与证书使用的密码匹配。

使用为 HTTPS 配置的 ASP.NET Core 启动容器:

docker-compose -f "docker-compose.debug.yml" up -d

使用 Windows 容器的 windows

生成证书并配置本地计算机:

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p $CREDENTIAL_PLACEHOLDER$
dotnet dev-certs https --trust

在上述命令中,将 $CREDENTIAL_PLACEHOLDER$ 替换为密码。

创建包含以下内容的 docker-compose.debug.yml 文件:

version: '3.4'

services:
  webapp:
    image: mcr.microsoft.com/dotnet/samples:aspnetapp
    ports:
      - 80
      - 443
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_Kestrel__Certificates__Default__Password=password
      - ASPNETCORE_Kestrel__Certificates__Default__Path=C:\https\aspnetapp.pfx
    volumes:
      - ${USERPROFILE}\.aspnet\https:C:\https:ro

docker compose 文件中指定的密码必须与证书使用的密码匹配。

使用为 HTTPS 配置的 ASP.NET Core 启动容器:

docker-compose -f "docker-compose.debug.yml" up -d

另请参阅