Skip to content

docker_setting_asp

ASP.NET Core 是 Microsoft 现代的、跨平台的框架,用于构建 Web 应用程序和服务。Docker 提供了一种极好的方式,可以在不同环境中一致地打包、部署和运行这些应用程序。

本教程将指导你如何使用 Docker 将一个简单的 ASP.NET Core 应用程序容器化,遵循当前的最佳实践。

开始之前,请确保你已安装以下内容:

  • Docker Desktop:适用于 Windows 和 macOS 用户。它处理底层虚拟化,并提供 Docker 引擎和 CLI 工具。从 官方 Docker 网站 下载。
  • Docker Engine:适用于 Linux 用户。请遵循特定发行版的 官方安装指南。
  • .NET SDK:你需要 .NET Software Development Kit (SDK) 来创建和构建 ASP.NET Core 应用程序。选择最新的稳定版本(例如 .NET 6、.NET 7、.NET 8 或更高版本)。从 官方 .NET 网站 下载。

通过打开终端或命令提示符并运行以下命令来验证你的 Docker 安装:

docker --version

并通过运行以下命令来验证你的 .NET SDK 安装:

dotnet --version

我们首先使用 .NET CLI 创建一个基本的 ASP.NET Core Web 应用程序。

步骤 1:打开你的终端或命令提示符。

步骤 2:为你的项目创建一个新目录并进入该目录。

mkdir MyWebApp
cd MyWebApp

步骤 3:使用 dotnet new 命令创建一个新的 ASP.NET Core Web 应用。

dotnet new webapp

此命令在当前目录中创建一个简单的 Web 应用程序项目,包括示例页面和配置。

Dockerfile 是一个包含构建 Docker 镜像指令的文本文件。我们将使用多阶段构建(multi-stage build)方法为我们的 ASP.NET Core 应用程序创建一个 Dockerfile,这是优化镜像大小和安全性的最佳实践。

步骤 1:在 MyWebApp 目录的根目录(.csproj 文件所在的位置)中,创建一个名为 Dockerfile(无扩展名)的新文件。

步骤 2:将以下内容添加到 Dockerfile 中。如果你使用了不同的 SDK 版本,请调整 .NET 版本(例如,8.0)。

# Stage 1: Build the application
# Use the official .NET SDK image as the base image for building
# Choose the SDK version matching your project's target framework
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /app
# Copy the project file and restore dependencies
COPY *.csproj ./
RUN dotnet restore
# Copy the rest of the application code
COPY . .
# Publish the application, ensuring it's optimized for release
# Use a specific runtime identifier if needed, e.g., linux-x64
RUN dotnet publish -c Release -o out
# Stage 2: Create the runtime image
# Use the official ASP.NET Core runtime image as the base
# Choose the runtime version matching your project's target framework
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
# Copy the published output from the build stage
COPY --from=build-env /app/out .
# Expose the port the application will run on (default is 8080 for .NET 8+)
# Check Properties/launchSettings.json or appsettings.json if unsure
EXPOSE 8080
# Set the entry point for the container
ENTRYPOINT ["dotnet", "MyWebApp.dll"]

Dockerfile 说明:

  • 多阶段构建(Multi-Stage Build):我们使用两个 FROM 指令。第一阶段(build-env)使用完整的 .NET SDK 来构建应用程序。第二阶段使用更精简的 ASP.NET Core 运行时镜像,只复制必需的已发布工件。这显著减小了最终镜像的大小。
  • FROM ... AS build-env:定义使用 .NET SDK 镜像的构建阶段。
  • WORKDIR /app:设置容器内部的工作目录。
  • COPY *.csproj ./ 和 RUN dotnet restore:首先复制项目文件并还原依赖项。这有效利用了 Docker 的层缓存。
  • COPY . .:复制其余的源代码。
  • RUN dotnet publish -c Release -o out:构建应用程序并将其发布到 out 目录,使用 Release 配置。
  • FROM mcr.microsoft.com/dotnet/aspnet...:定义使用 ASP.NET 运行时镜像的最终运行时阶段。
  • COPY --from=build-env /app/out .:仅从构建阶段复制已发布的应用程序。
  • EXPOSE 8080:通知 Docker 容器监听的端口是 8080(注意:在 .NET 8+ 中,Kestrel 的默认端口更改为 8080。对于 .NET 6/7,可能是 80)。它不发布端口;它只是文档说明。
  • ENTRYPOINT ["dotnet", "MyWebApp.dll"]:指定容器启动时要运行的命令。

步骤 3:(可选但推荐)在与 Dockerfile 相同的目录中创建一个 .dockerignore 文件。此文件告诉 Docker 在构建上下文中排除哪些文件和目录,从而加快构建速度并减小镜像大小。添加以下行:

bin/
obj/
Dockerfile
.dockerignore
*.vs
*.vscode
.git
README.md

现在,我们使用 Dockerfile 构建 Docker 镜像。

步骤 1:确保你位于终端中的 MyWebApp 目录。

步骤 2:运行 docker build 命令:

# The -t flag tags the image with a name (e.g., my-aspnet-app)
# The . indicates the build context (the current directory)
docker build -t my-aspnet-app .

Docker 将执行 Dockerfile 中的指令,如果需要,下载基础镜像,并创建你的应用程序镜像。第一次执行时可能需要几分钟。

镜像构建完成后,我们现在可以将其作为容器运行。

步骤 1:运行 docker run 命令:

# -d: Run the container in detached mode (in the background)
# -p 8081:8080: Map port 8081 on the host to port 8080 in the container
# (Use the port exposed in your Dockerfile, e.g., 8080 for .NET 8+)
# --name my-running-app: Assign a name to the container for easy reference
# my-aspnet-app: The name of the image to use
docker run -d -p 8081:8080 --name my-running-app my-aspnet-app

你可以使用 docker ps 命令检查容器是否正在运行:

docker ps

此命令将列出所有正在运行的容器,包括 my-running-app。

由于我们将容器的 8080 端口映射到了宿主机的 8081 端口(-p 8081:8080),你可以通过打开 Web 浏览器并访问以下地址来访问你正在运行的 ASP.NET Core 应用程序:

http://localhost:8081

你应该会看到默认的 ASP.NET Core 欢迎页。

停止容器:

docker stop my-running-app

移除已停止的容器:

docker rm my-running-app

本教程涵盖了将 ASP.NET Core 应用程序容器化的基础知识。以下是一些可以进一步探索的领域:

  • 配置:学习如何使用环境变量(docker run 命令中的 -e 标志)或卷挂载来传递配置到你的应用程序。
  • HTTPS:配置你的应用程序和 Docker 设置来处理 HTTPS 流量,通常涉及反向代理。
  • Docker Compose:使用 Docker Compose 来定义和运行多容器应用程序(例如,你的 Web 应用加上数据库)。
  • Windows Containers:如果你需要运行基于完整 .NET Framework 的较旧 ASP.NET 应用程序,你需要使用 Windows Containers,这需要 Windows 宿主机和不同的基础镜像(例如,mcr.microsoft.com/dotnet/framework/aspnet)。
  • 容器注册表:将你的自定义镜像推送到注册表,例如 Docker Hub 或 Azure Container Registry (ACR),以便共享和部署它们。
  • 官方文档:参考 Docker 和 .NET 官方文档以获取更深入的信息。