docker部署 asp.net程序

把ASP.NET程序部署到Docker里,现在主要有两种主流方法。一种是通过Visual Studio这种IDE工具"一键部署",另一种是手写Dockerfile然后用命令行操作。前者适合快速上手和开发测试,后者更灵活,是生产环境和自动化流程(CI/CD)的标配。

为了方便你根据实际情况选择,我把这两种方式的核心流程整理成了一个对比表格:

特性 🚀 方式一:Visual Studio 集成部署 ⌨️ 方式二:手动 Dockerfile 部署
核心思路 利用IDE自动生成配置并打包上传,适合快速验证和初学者。 通过编写配置文件,精细控制镜像构建过程,是生产环境的标准做法。
依赖文件 由Visual Studio在创建项目或添加Docker支持时自动生成 Dockerfile 开发者需要在项目根目录手动创建 并编写Dockerfile
基础镜像 可在项目设置中选择,通常为mcr.microsoft.com/dotnet/aspnet系列。 Dockerfile中通过FROM指令精确指定,如mcr.microsoft.com/dotnet/aspnet:8.0
主要步骤 1. 项目右键 -> "发布"。 2. 选择目标(如Docker容器注册表、Azure等)。 3. 按向导配置并完成部署。 1. 编写Dockerfile。 2. 执行docker build -t 镜像名 .构建镜像。 3. 执行docker run -d -p 外部端口:80 镜像名运行容器。
适用场景 本地开发测试、快速上手、与Azure深度集成的部署。 任何场景,特别是需要版本控制、自动化构建(CI/CD)、精细控制镜像内容的场合。

下面,我来详细拆解一下这两种方式。

🚀 方式一:使用 Visual Studio 一键部署(适合快速上手)

如果你正在使用Visual Studio开发,并且想快速把程序部署到容器里(比如用于测试或发布到Azure),这种方式是最便捷的。

  1. 准备工作 :确保你的开发机上已经安装并运行了Docker Desktop,并且Visual Studio中安装了"ASP.NET和Web开发"工作负载。
  2. 项目开启Docker支持 :在创建新ASP.NET项目时,或者对现有项目右键 -> "添加" -> "Docker支持"。你可以选择目标操作系统(Linux或Windows)。Visual Studio会自动为项目生成一个Dockerfile
  3. 一键发布:右键点击项目,选择"发布"。在目标中选择"Docker容器注册表"(可以发布到本地的Docker Hub、Azure容器注册表等)。按照向导的提示一步步操作,Visual Studio会负责构建镜像、推送镜像的整个流程。

⌨️ 方式二:手动编写 Dockerfile 部署(适合生产环境)

这是更通用、更可控的方式,也是你后续学习自动化部署(CI/CD)的基础。整个过程的核心就是写好Dockerfile,然后用几条docker命令搞定。

第一步:创建并编写 Dockerfile

在你的ASP.NET Core项目根目录下(通常是包含.csproj文件的目录),创建一个名为Dockerfile(没有后缀名)的文件。一个标准的、优化的Dockerfile通常采用多阶段构建,这样能有效减小最终镜像的体积。下面是一个针对.NET 8的示例:

dockerfile 复制代码
# Dockerfile

# Stage 1: 构建阶段 ------ 使用包含完整SDK的镜像来编译和发布应用
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src

# 复制项目文件并还原依赖 (利用Docker缓存,提高构建速度)
COPY ["YourProjectName.csproj", "."]
RUN dotnet restore

# 复制所有源代码并发布应用
COPY . .
RUN dotnet publish "YourProjectName.csproj" -c Release -o /app/publish

# Stage 2: 运行阶段 ------ 使用仅包含运行时的小镜像来运行应用
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app

# 从构建阶段将发布好的文件复制到当前运行阶段的工作目录
COPY --from=build /app/publish .

# 告诉Docker容器该应用将监听80端口
EXPOSE 80

# 设置容器启动时要执行的命令
ENTRYPOINT ["dotnet", "YourProjectName.dll"]

请务必将 YourProjectName 替换为你实际的项目名。

第二步:构建 Docker 镜像

打开命令行(终端),切换到包含Dockerfile的项目根目录,执行以下命令:

bash 复制代码
# -t 用于给镜像打标签,格式通常是 镜像名:标签,标签常用版本号或latest
docker build -t my-asp-a.0 .

这个命令会根据Dockerfile的指令,一步一步构建出名为my-aspnet-app、标签为1.0的镜像。命令最后的.表示构建上下文就是当前目录。

第三步:运行 Docker 容器

镜像构建成功后,就可以用它来创建并运行容器了:

bash 复制代码
# -d 表示后台运行,-p 8080:80 将宿主机的8080端口映射到容器的80端口
docker run -d -p 8080:80 --name my-running-app my-asp-a.0

这条命令会启动一个名为my-running-app的容器。现在,打开浏览器访问 http://localhost:8080,你应该就能看到你的ASP.NET程序运行界面了。

💡 一些核心要点

  • 关于基础镜像 :微软的镜像都托管在mcr.microsoft.com上。sdk镜像包含了编译和发布应用所需的全部工具,体积较大,用于构建阶段;aspnet镜像是专门用于运行ASP.NET Core应用的运行时镜像,体积小巧,适合作为最终运行的基础镜像。
  • 关于端口ASP.NET Core应用默认监听的端口是80(HTTP)。在Dockerfile中使用EXPOSE 80是一种声明,告诉使用者这个容器内的应用在使用80端口。而真正让外部能访问到,是靠docker run -p命令做的端口映射。
  • 关于新特性如果你在使用.NET 8或更高版本,还有一个非常酷的特性:支持无Dockerfile构建 。你可以直接在项目文件(.csproj)中添加一些配置,然后使用 dotnet publish 命令直接构建出Docker镜像。这为某些场景提供了更简洁的选项。

表格里提到用 docker run -d -p 外部端口:80 来启动容器

相关推荐
菜萝卜子2 小时前
【k8s】K8s网络打通:CalicoBGP模式对接OpenWrt/FRR实战
网络·容器·kubernetes
lpfasd1232 小时前
Kubernetes (K8s) 入门指南:从容器混乱到云原生秩序
云原生·容器·kubernetes
~莫子2 小时前
Docker镜像构建
运维·docker·容器
吹牛不交税3 小时前
vue3项目部署到阿里云Alibaba Cloud Linux3系统的docker
docker·容器·.netcore
火车叼位12 小时前
Docker Compose 网络原理与实战:同一 Compose 服务间如何稳定通信
运维·docker·容器
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ14 小时前
ubuntu 安装部署docker教程
linux·ubuntu·docker
D愿你归来仍是少年16 小时前
Kubernetes(K8s)系统学习指南
容器·kubernetes
D愿你归来仍是少年16 小时前
Docker 深入学习指南
docker·容器
馨谙18 小时前
Kubernetes 核心技术之 Namespace:资源隔离与环境管理全解析
容器·kubernetes