docker_setting_asp_net_core
Docker - 设置 ASP.NET Core 应用程序
Section titled “Docker - 设置 ASP.NET Core 应用程序”ASP.NET Core 是 Microsoft 现代、开源、跨平台的 Web 应用程序和服务框架。它是早期仅限于 Windows 的 ASP.NET 框架的重新设计版本。Docker 容器提供了一种极佳的方式,可以一致地打包、部署和运行 ASP.NET Core 应用程序,无论是在开发环境还是生产环境。
本教程将指导您使用 Docker 将一个简单的 ASP.NET Core 应用程序容器化,重点关注当前的最佳实践。
在开始之前,请确保您的系统上安装了以下软件:
- Docker Desktop: 在 Windows 或 macOS 上运行 Docker 的最简单方式。从官方 Docker 网站下载。在 Windows 安装过程中,请确保启用 WSL 2(Windows Subsystem for Linux,Linux 子系统版本 2)后端,这是运行 Linux 容器(ASP.NET Core 最常见)的推荐和默认选项。对于 Linux 发行版,请按照适用于您的操作系统的官方 Docker Engine 安装指南进行安装。
- .NET SDK: 您需要 .NET 软件开发工具包 (SDK) 来创建和构建 ASP.NET Core 应用程序。从官方 .NET 网站下载最新的长期支持 (LTS) 版本或更新的稳定版本。
通过打开终端或命令提示符并运行以下命令来验证您的安装:
docker --versiondotnet --version这些命令应分别输出安装的 Docker 和 .NET SDK 版本。
注意:虽然本指南重点介绍使用 Linux 容器的现代 ASP.NET Core,但 Docker 也可以使用 Windows 容器运行旧的 ASP.NET Framework 应用程序。这需要 Windows 10/11 Pro/Enterprise 或 Windows Server,启用“容器”Windows 功能,并将 Docker Desktop 切换到使用 Windows 容器。.NET Framework 的镜像(例如 mcr.microsoft.com/dotnet/framework/aspnet)与 .NET Core 镜像不同。
步骤 1:创建一个简单的 ASP.NET Core 应用程序
Section titled “步骤 1:创建一个简单的 ASP.NET Core 应用程序”让我们首先使用 .NET CLI 创建一个基本的 ASP.NET Core Web 应用程序。打开您的终端或命令提示符,导航到您想要创建项目的目录,然后运行以下命令:
# Create a new directory for your project# 为您的项目创建一个新目录mkdir MyAspCoreAppcd MyAspCoreApp
# Create a new ASP.NET Core Web App (e.g., Razor Pages)# 创建一个新的 ASP.NET Core Web 应用(例如 Razor Pages)dotnet new webapp -n MyWebApp
# Navigate into the created web app directory# 进入创建的 Web 应用目录cd MyWebApp这将在当前目录下创建一个名为 ‘MyWebApp’ 的简单 Web 应用程序。您可以通过运行 dotnet run 并在 Web 浏览器中导航到指定的 URL(通常是 https://localhost:port 或 http://localhost:port)来在本地测试它。
步骤 2:创建 Dockerfile
Section titled “步骤 2:创建 Dockerfile”Dockerfile 是一个文本文件,包含 Docker 用于构建容器镜像的指令。在 MyWebApp 项目目录(与包含 .csproj 文件的目录相同)中创建一个名为 Dockerfile(无扩展名)的文件,内容如下:
# Use the official .NET SDK image as the build environment# 使用官方 .NET SDK 镜像作为构建环境# Using 'latest' or specific version like '8.0'# 使用 'latest' 或特定版本,例如 '8.0'# Choose the SDK version matching your project's target framework# 选择与您的项目目标框架匹配的 SDK 版本FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-envWORKDIR /app
# Copy the project file and restore dependencies# 复制项目文件并还原依赖项COPY *.csproj ./RUN dotnet restore
# Copy the rest of the application code# 复制其余的应用程序代码COPY . .
# Publish the application# 发布应用程序# This compiles the application and prepares it for deployment# 这将编译应用程序并准备好进行部署RUN dotnet publish -c Release -o /app/publish
# Use the official ASP.NET Core runtime image for the final stage# 使用官方 ASP.NET Core 运行时镜像作为最终阶段# This results in a smaller final image size# 这会使最终镜像体积更小# Choose the runtime version matching your project's target framework# 选择与您的项目目标框架匹配的运行时版本FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /app
# Copy the published output from the build stage# 从构建阶段复制已发布输出COPY --from=build-env /app/publish .
# Expose port 8080 for the application# 为应用程序暴露端口 8080# ASP.NET Core apps often run on port 8080 or 80 within the container# ASP.NET Core 应用通常在容器内部运行在端口 8080 或 80# Check Properties/launchSettings.json for the port your app uses (or configure it)# 检查 Properties/launchSettings.json 查看您的应用使用的端口(或进行配置)EXPOSE 8080
# Define the entry point for the container# 定义容器的入口点# This command runs when the container starts# 这个命令在容器启动时运行ENTRYPOINT ["dotnet", "MyWebApp.dll"]Dockerfile 解释:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env: 使用 .NET SDK 镜像开始一个构建阶段(将8.0更改为与您的项目 .NET 版本匹配)。此镜像包含构建应用程序所需的所有工具。WORKDIR /app: 设置容器内的工作目录。COPY *.csproj ./: 复制项目文件(.csproj)。RUN dotnet restore: 下载项目依赖项。COPY . .: 复制应用程序的其余源代码。RUN dotnet publish ...: 以 Release 模式编译应用程序并将结果输出到/app/publish。FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime: 使用 ASP.NET Core 运行时镜像开始一个新的、更精简的阶段。此镜像仅包含运行应用程序所需的组件,使最终镜像体积更小。WORKDIR /app: 设置运行时阶段的工作目录。COPY --from=build-env /app/publish .: 从构建阶段 (build-env) 复制编译后的应用程序到运行时阶段。EXPOSE 8080: 通知 Docker 该容器将监听端口 8080。重要提示: ASP.NET Core Kestrel 服务器默认内部可能是端口 80 或 8080。检查您的应用程序配置(Properties/launchSettings.json或Program.cs)或显式配置(例如,使用ASPNETCORE_URLS环境变量)以监听暴露的端口(本例中为 8080)。ENTRYPOINT ["dotnet", "MyWebApp.dll"]: 指定容器启动时运行的命令,执行您的已编译应用程序。
这种多阶段构建模式是最佳实践。它通过排除构建工具和源代码,只包含必要的运行时和编译后的应用程序,从而保持最终镜像的小巧。
步骤 3:构建 Docker 镜像
Section titled “步骤 3:构建 Docker 镜像”现在,在您的终端中导航回包含 Dockerfile 的目录(即 MyWebApp 目录),然后运行 docker build 命令:
# Build the image and tag it as 'mywebapp-image'# 构建镜像并将其标记为 'mywebapp-image'# The '.' indicates the build context is the current directory# '.' 表示构建上下文是当前目录docker build -t mywebapp-image .Docker 将执行您 Dockerfile 中的指令,下载基础镜像(如果需要)并创建您的应用程序镜像。第一次构建可能需要几分钟。-t 标志为镜像指定一个易于记忆的名称(mywebapp-image)。
步骤 4:运行 Docker 容器
Section titled “步骤 4:运行 Docker 容器”镜像构建完成后,您可以将其作为容器运行:
# Run the container# 运行容器# -d: Run in detached mode (in the background)# -d: 在分离模式下运行(在后台)# -p 8081:8080: Map port 8081 on the host to port 8080 in the container# -p 8081:8080: 将主机上的端口 8081 映射到容器内部的端口 8080# --name my-running-app: Assign a name to the container# --name my-running-app: 为容器分配一个名称# mywebapp-image: The image to use# mywebapp-image: 要使用的镜像docker run -d -p 8081:8080 --name my-running-app mywebapp-image解释:
-d: 在后台运行容器。-p 8081:8080: 将您的本地机器(主机)上的端口 8081 映射到容器内部的端口 8080(我们暴露并期望应用程序监听的端口)。如果 8081 被占用,您可以选择不同的主机端口(例如,-p 5000:8080)。--name my-running-app: 为您的容器指定一个易于识别的名称。mywebapp-image: 指定您在上一步中构建的镜像。
您可以使用以下命令检查您的容器是否正在运行:
docker ps此命令列出所有正在运行的容器。