docker_setting_asp_dotnet_core
Docker - 容器化现代 ASP.NET Core 应用
Section titled “Docker - 容器化现代 ASP.NET Core 应用”ASP.NET Core 是微软的现代化、跨平台、高性能框架,用于构建 Web 应用和服务。Docker 提供了一种极好的方式,可以在不同环境中一致地打包、部署和运行 ASP.NET Core 应用。
本教程将指导您按照当前最佳实践设置 Docker 并容器化一个简单的 ASP.NET Core 应用。
开始之前,请确保您已安装以下软件:
- Docker Desktop:这是在 Windows 或 macOS 上运行 Docker 最简单的方式。它处理底层虚拟化(Windows 上的 WSL 2,Mac 上的 Hypervisor framework),并提供了 Docker Engine、CLI 和其他工具。请从 Docker 官方网站下载。确保您的系统满足安装要求(例如,Windows 10/11 64 位:专业版、企业版或教育版;家庭版需要 WSL 2)。对于 Linux,请遵循官方说明安装 Docker Engine。
- .NET SDK:您需要 .NET 软件开发工具包(SDK)来创建和构建 ASP.NET Core 应用。本教程将使用 .NET 8.0(或最新的 LTS 版本)。您可以从 .NET 官方网站下载。
通过打开终端或命令提示符并运行以下命令来验证您的安装:
docker --versiondotnet --version您应该看到 Docker 和 .NET SDK 的已安装版本被打印出来,且没有错误。
创建示例 ASP.NET Core 应用
Section titled “创建示例 ASP.NET Core 应用”让我们使用 .NET CLI 创建一个简单的 Web 应用。
步骤 1:打开您的终端或命令提示符。
步骤 2:导航到您希望创建项目的目录(例如,cd C:\projects 或 cd ~/projects)。
步骤 3:运行以下命令创建一个新的 ASP.NET Core Razor Pages 应用:
dotnet new webapp -n MyWebApp --use-program-main此命令将创建一个名为 MyWebApp 的新目录,其中包含项目文件。--use-program-main 标志确保它使用类似于旧版本 .NET 的结构,这有时对初学者来说更简单。
步骤 4:导航到新创建的项目目录:
cd MyWebApp现在您有了一个基本的 ASP.NET Core 应用,可以进行容器化了。
创建 Dockerfile
Section titled “创建 Dockerfile”Dockerfile 是一个文本文件,包含用于构建 Docker 镜像的指令。我们将创建一个多阶段 Dockerfile,这是 .NET 应用的最佳实践。通过将构建环境与运行时环境分离,有助于保持最终镜像的大小较小且更安全。
步骤 1:在您的 MyWebApp 项目的根目录(.csproj 文件所在的位置)中,创建一个名为 Dockerfile(无扩展名)的新文件。
步骤 2:将以下内容添加到 Dockerfile 中:
# 使用官方的 .NET SDK 镜像作为构建环境# 使用 AS 将此阶段命名为 'build'FROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /app
# 复制项目文件并还原依赖项COPY *.csproj ./RUN dotnet restore
# 复制剩余的源代码COPY . ./
# 发布应用RUN dotnet publish -c Release -o /app/publish
# 使用官方的 ASP.NET Core 运行时镜像作为最终阶段# 使用 AS 将此阶段命名为 'final'FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS finalWORKDIR /app
# 从构建阶段复制已发布的应用产物COPY --from=build /app/publish .
# 暴露应用所需的端口 8080# 容器内的 ASP.NET Core 默认端口可能是 80,但 8080 也常用。# 如有需要,请检查您的应用的配置 (Properties/launchSettings.json 或 Program.cs)。# 在运行容器时,我们将映射到此端口。EXPOSE 8080
# 设置容器的入口点ENTRYPOINT ["dotnet", "MyWebApp.dll"]Dockerfile 解释:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build:使用 .NET 8 SDK 镜像启动第一个阶段,命名为build。此镜像包含构建应用所需的所有工具。WORKDIR /app:设置容器内部的工作目录。COPY *.csproj ./:复制项目文件。RUN dotnet restore:还原 NuGet 包。COPY . ./:复制应用的其余源代码。RUN dotnet publish ...:以 Release 模式构建应用,并将其发布到/app/publish目录。FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final:使用更小的 ASP.NET Core 运行时镜像启动第二个阶段,命名为final。此镜像仅包含运行应用所需的必要组件。WORKDIR /app:设置最终阶段的工作目录。COPY --from=build /app/publish .:仅从build阶段复制已发布的应用产物。EXPOSE 8080:通知 Docker 容器将监听端口 8080。注意:ASP.NET Core 运行时镜像通常默认监听端口 80。如果您的应用监听端口 80,则应EXPOSE 80。然而,新模板中的 Kestrel 配置可能会默认使用 8080 作为 HTTP 端口。我们在此使用 8080,假设这是常见配置,如果您的应用不同,请调整。您可以通过ASPNETCORE_URLS环境变量配置端口。ENTRYPOINT ["dotnet", "MyWebApp.dll"]:指定容器启动时要运行的命令。
这种多阶段方法确保最终镜像不包含 .NET SDK 或您的源代码,从而生成更小、更安全的镜像。
构建 Docker 镜像
Section titled “构建 Docker 镜像”现在,让我们使用 Dockerfile 构建 Docker 镜像。
步骤 1:确保您在终端中处于 MyWebApp 目录(即包含 Dockerfile 的目录)。
步骤 2:运行以下命令:
docker build -t mywebapp-image .解释:
docker build:用于构建镜像的命令。-t mywebapp-image:使用名称mywebapp-image标记镜像。标记使得以后更容易引用该镜像。.:指定构建上下文(构建所需的文件,包括 Dockerfile)是当前目录。
Docker 将执行 Dockerfile 中定义的步骤。第一次执行时可能需要几分钟,因为 Docker 需要下载基础镜像(sdk 和 aspnet)。由于缓存,后续构建会更快。
您可以通过运行 docker images 来验证镜像是否已创建。
运行 Docker 容器
Section titled “运行 Docker 容器”镜像构建完成后,让我们将其作为容器运行。
步骤 1:在您的终端中运行以下命令:
docker run -d -p 8080:8080 --name mywebapp-container mywebapp-image解释:
docker run:用于从镜像运行容器的命令。-d:在分离模式下运行容器(在后台运行)。-p 8080:8080:将您的主机上的端口 8080 映射到容器内部的端口 8080(主机端口:容器端口)。如果您因为应用监听端口 80 而在 Dockerfile 中暴露了端口 80,则应该使用-p 8080:80。--name mywebapp-container:为正在运行的容器分配一个名称,以便于管理。mywebapp-image:要使用的镜像名称。
步骤 2:验证容器是否正在运行:
docker ps您应该看到 mywebapp-container 被列出。
打开您的网页浏览器,访问 http://localhost:8080。
您应该能看到由您的 Docker 容器提供的默认 ASP.NET Core 欢迎页面!
常见问题提示:如果网站无法加载,请仔细检查端口映射(-p 选项)是否与 EXPOSE 暴露的端口以及您的应用实际在容器内部监听的端口匹配(检查 ASPNETCORE_URLS 环境变量默认值或设置)。
停止和删除容器
Section titled “停止和删除容器”要停止容器:
docker stop mywebapp-container要删除已停止的容器:
docker rm mywebapp-container深入学习与后续步骤
Section titled “深入学习与后续步骤”您已成功容器化了一个基本的 ASP.NET Core 应用。以下是一些可以接下来探索的领域:
- 数据卷挂载 (Volume Mounting):将数据持久化到容器外部(例如,数据库、日志)。
- Docker Compose:定义和运行多容器应用(例如,Web 应用 + 数据库)。
- 环境变量 (Environment Variables):使用环境变量在容器内部配置您的应用(例如,数据库连接字符串、API 密钥)。通过
docker run命令的-e标志或在 Docker Compose 文件中设置它们。 - 容器内的 HTTPS:配置 ASP.NET Core 在容器内部使用 HTTPS,管理开发证书。
- 容器注册表 (Container Registries):将您的镜像推送到注册表,如 Docker Hub 或 Azure Container Registry (ACR),以共享和部署它们。
- Windows 容器 (Windows Containers):如果您需要运行遗留的 .NET Framework 应用或具有特定 Windows 依赖项的应用,请探索构建和运行 Windows 容器(需要 Windows 主机并将 Docker Desktop 切换到 Windows 容器模式)。
资源:
- Docker 概述:https://docs.docker.com/get-started/overview/
- .NET Docker 文档:https://docs.microsoft.com/en-us/dotnet/core/docker/introduction
- ASP.NET Core Docker 示例:https://github.com/dotnet/dotnet-docker/tree/main/samples/aspnetapp