docker_setting_asp
Docker - 将 ASP.NET Core 应用容器化
Section titled “Docker - 将 ASP.NET Core 应用容器化”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创建一个示例 ASP.NET Core 应用
Section titled “创建一个示例 ASP.NET Core 应用”我们首先使用 .NET CLI 创建一个基本的 ASP.NET Core Web 应用程序。
步骤 1:打开你的终端或命令提示符。
步骤 2:为你的项目创建一个新目录并进入该目录。
mkdir MyWebAppcd MyWebApp步骤 3:使用 dotnet new 命令创建一个新的 ASP.NET Core Web 应用。
dotnet new webapp此命令在当前目录中创建一个简单的 Web 应用程序项目,包括示例页面和配置。
添加 Dockerfile
Section titled “添加 Dockerfile”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 frameworkFROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-envWORKDIR /app
# Copy the project file and restore dependenciesCOPY *.csproj ./RUN dotnet restore
# Copy the rest of the application codeCOPY . .
# Publish the application, ensuring it's optimized for release# Use a specific runtime identifier if needed, e.g., linux-x64RUN 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 frameworkFROM mcr.microsoft.com/dotnet/aspnet:8.0WORKDIR /app
# Copy the published output from the build stageCOPY --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 unsureEXPOSE 8080
# Set the entry point for the containerENTRYPOINT ["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.gitREADME.md构建 Docker 镜像
Section titled “构建 Docker 镜像”现在,我们使用 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 中的指令,如果需要,下载基础镜像,并创建你的应用程序镜像。第一次执行时可能需要几分钟。
运行 Docker 容器
Section titled “运行 Docker 容器”镜像构建完成后,我们现在可以将其作为容器运行。
步骤 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 usedocker 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 欢迎页。
停止并移除容器
Section titled “停止并移除容器”停止容器:
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 官方文档以获取更深入的信息。