使用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流水线中自动化构建和部署过程这可以显著提高团队的工作效率。