首页/新闻资讯/正文详情

使用Docker部署.NET 6 Web API的完整指南

发布时间:2026/11/5 7:06:34 来源:云帆数科 栏目:资讯中心
使用Docker部署.NET 6 Web API的完整指南
1. 项目概述在上一篇文章中我们已经完成了Ubuntu服务器上Docker环境的安装和配置。本文将重点介绍如何将一个.NET 6 Web API应用程序部署到Docker容器中运行。通过容器化部署我们可以实现应用程序与运行环境的解耦提高部署效率和可移植性。对于.NET开发者来说将应用程序容器化是一个非常重要的技能。Docker提供了轻量级的虚拟化方案使得我们的应用程序可以在任何支持Docker的环境中运行无需担心环境差异带来的兼容性问题。2. 为项目添加Docker支持2.1 创建Dockerfile在Visual Studio中为.NET项目添加Docker支持非常简单。右键点击项目选择添加→Docker支持系统会自动生成一个Dockerfile文件。这个文件包含了构建Docker镜像所需的所有指令。注意如果你的解决方案中有多个项目请确保在API项目上右键添加Docker支持而不是在类库项目上。自动生成的Dockerfile通常包含多个构建阶段多阶段构建这对于生产环境部署很有帮助。但在开发阶段我们可以先简化这个文件专注于让应用程序能够正常运行。2.2 简化Dockerfile以下是经过简化后的Dockerfile示例# 使用官方.NET 6运行时镜像作为基础 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 # 复制发布文件到容器中 COPY . . ENTRYPOINT [dotnet, CityInvest.Api.dll]这个简化版的Dockerfile做了以下几件事基于官方的.NET 6运行时镜像设置工作目录为/app暴露80端口这是ASP.NET Core的默认端口将当前目录下的所有文件复制到容器的/app目录设置容器启动时执行的命令提示在生产环境中建议使用多阶段构建来减小最终镜像的体积。但在开发阶段简化版更容易调试。3. 发布项目3.1 配置发布选项在Visual Studio中发布项目时需要选择文件夹发布方式。在发布配置中确保选择Release配置和可移植的目标运行时。发布配置的几个关键点配置选择Release以获得优化后的代码目标框架选择net6.0部署模式选择框架依赖或独立通常选择框架依赖目标运行时选择可移植portable3.2 手动添加Dockerfile发布完成后检查发布文件夹中是否包含Dockerfile。如果没有需要手动将项目中的Dockerfile复制到发布文件夹中。这是非常重要的一步因为docker build命令需要这个文件来构建镜像。常见问题如果忘记复制Dockerfile构建时会收到unable to locate Dockerfile错误。4. 构建Docker镜像4.1 准备构建环境将发布文件夹上传到Ubuntu服务器。可以使用scp命令或任何你熟悉的文件传输工具。例如scp -r publish_folder userserver_ip:/path/to/destination4.2 执行构建命令在服务器上进入包含Dockerfile的目录执行以下命令构建镜像docker build -t cityinvest.api .这个命令的各个部分含义docker build: 构建Docker镜像的命令-t cityinvest.api: 为镜像指定名称和标签这里是默认的latest标签.: 表示使用当前目录中的Dockerfile构建过程可能需要几分钟具体时间取决于你的网络速度和项目大小。构建完成后可以使用以下命令查看所有本地镜像docker images5. 运行容器5.1 启动容器命令使用以下命令启动容器docker run -d -p 8080:8000 --name cityinvest-docker cityinvest.api参数说明-d: 以分离模式运行后台运行-p 8080:8000: 端口映射主机端口:容器端口--name cityinvest-docker: 为容器指定名称cityinvest.api: 使用的镜像名称5.2 验证容器运行状态使用以下命令查看正在运行的容器docker ps如果容器没有正常运行可以使用以下命令查看日志docker logs cityinvest-docker6. 测试API6.1 防火墙配置在测试API之前确保服务器的防火墙允许8080端口的入站连接。可以使用以下命令检查防火墙状态sudo ufw status如果需要开放端口sudo ufw allow 80806.2 使用Postman测试使用Postman或其他API测试工具向服务器的8080端口发送请求。例如http://your_server_ip:8080/api/values如果一切正常你应该能收到API的响应。7. 常见问题与解决方案7.1 依赖注入错误如果遇到类似以下的错误System.InvalidOperationException: Unable to resolve service for type ***.***.*** while attempting to activate ***.***.***这通常是因为依赖注入容器无法解析某些服务。解决方法确保所有需要的服务都在Startup.cs或Program.cs中正确注册检查发布配置确保选择了Release和可移植清理并重新构建解决方案7.2 端口冲突如果指定的端口已被占用docker run命令会失败。解决方法更改主机端口如-p 8081:8000停止占用端口的其他服务使用以下命令查找占用端口的进程sudo netstat -tulnp | grep :80808. 常用Docker命令参考8.1 容器管理# 查看运行中的容器 docker ps # 查看所有容器包括停止的 docker ps -a # 停止容器 docker stop container_name_or_id # 启动已停止的容器 docker start container_name_or_id # 重启容器 docker restart container_name_or_id # 删除容器必须先停止 docker rm container_name_or_id8.2 镜像管理# 列出所有本地镜像 docker images # 删除镜像 docker rmi image_name # 强制删除镜像即使有容器使用 docker rmi -f image_name8.3 日志与调试# 查看容器日志 docker logs container_name_or_id # 实时查看日志 docker logs -f container_name_or_id # 进入容器内部 docker exec -it container_name_or_id /bin/bash9. 性能优化建议9.1 镜像大小优化使用多阶段构建在最终镜像中只包含运行时必要的文件使用.dockerignore文件排除不必要的文件如bin, obj文件夹选择更小的基础镜像如mcr.microsoft.com/dotnet/aspnet:6.0-alpine9.2 容器资源限制在生产环境中建议为容器设置资源限制docker run -d -p 8080:8000 --name cityinvest-docker \ --memory512m --cpus1 \ cityinvest.api10. 后续步骤成功将.NET API部署到Docker容器后你可以考虑以下进阶主题使用Docker Compose管理多个容器配置容器健康检查设置容器自动重启策略学习Kubernetes进行容器编排在实际项目中我发现在开发阶段保持Dockerfile简单明了有助于快速迭代。当应用程序稳定后再考虑优化镜像大小和性能。另外建议在CI/CD流水线中自动化构建和部署过程这可以显著提高团队的工作效率。

相关推荐

Linux vi编辑器使用指南:从入门到高效操作
Linux vi编辑器使用指南:从入门到高效操作

1. Linux vi编辑器概述vi编辑器是Linux系统中最经典的文本编辑器之一,它诞生于1976年,由Bill Joy在BSD Unix系统中开发。作为一款纯键盘操作的编辑器,vi的设计哲学是"键盘即效率"——通过精心设计的快捷键组合,让熟练用… · 2026/11/5 7:06:34

学术研究中的AI工具:提升效率与规范性的五大神器
学术研究中的AI工具:提升效率与规范性的五大神器

1. 学术研究工具现状与AI技术融合趋势2025届的学术研究者正面临前所未有的技术变革窗口期。过去三年间,超过73%的顶尖学术期刊论文的作者团队使用了至少一种AI辅助工具。我在指导研究生论文过程中发现,合理运用AI工具的研究生,文献综述效率平… · 2026/11/5 7:06:34

京东云主机三年期购买指南与配置优化
京东云主机三年期购买指南与配置优化

1. 京东云主机三年期购买与配置解析京东云确实提供三年期的云主机购买选项,这种长期租赁方式在云计算领域被称为"预留实例"。与按年或按月付费相比,选择三年期通常能获得30%-50%的价格优惠,特别适合有长期稳定业务需求的企业用户。… · 2026/11/5 7:06:34

如何用一个仓库补齐你的 Android 技术栈?android-tech-frontier 译文库完全指南
如何用一个仓库补齐你的 Android 技术栈?android-tech-frontier 译文库完全指南

如何用一个仓库补齐你的 Android 技术栈?android-tech-frontier 译文库完全指南 【免费下载链接】android-tech-frontier 【停止维护】一个定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章的开源项目 项目地址: https://gitcode.com/gh_mirrors… · 2026/11/5 8:46:35

【Java基础知识】方法与注释
【Java基础知识】方法与注释

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 8:43:30

【Java基础知识】进制转换
【Java基础知识】进制转换

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 8:43:30

【Java基础知识】字面量与变量
【Java基础知识】字面量与变量

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 8:43:30

kafka--基础知识点--0
kafka--基础知识点--0

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 8:43:30

如何用AI新闻雷达Horizon打造你的专属信息过滤系统
如何用AI新闻雷达Horizon打造你的专属信息过滤系统

如何用AI新闻雷达Horizon打造你的专属信息过滤系统 【免费下载链接】Horizon 📡 Your own AI-powered news radar. Generates daily briefings in English & Chinese. | 用 AI 构建你专属的新闻雷达 项目地址: https://gitcode.com/GitHub_Trending/horizon39… · 2026/11/5 8:41:27

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码