ASP.NET Core 部署进化史:从 Windows IIS 到 Docker,再到国产 Linux 容器化实践
背景
过去十多年,国内大部分企业的核心系统都跑在 Windows Server + IIS + .NET Framework 这套组合上。它稳定、成熟、文档齐全,但问题也很明显:
授权成本高(Windows Server + SQL Server 许可证不是小钱);平台绑定死(离开 Windows 就跑不动);部署靠手工(每次上线都要配 IIS、改权限、清缓存);无法直接迁移到 Linux 或国产系统。
随着国家“信创”政策推进,越来越多企业被要求逐步用 国产 Linux 系统(如统信 UOS、银河麒麟、中标麒麟) 替代 Windows,并支持 国产 CPU 架构(鲲鹏、龙芯、兆芯等)。
这不仅是合规要求,更是 IT 架构现代化的契机。而 ASP.NET Core 的跨平台特性,正好成为企业迁移的重要支撑——它让“一次编写,处处运行”从口号变成现实。
第一阶段:传统的 Windows + IIS 部署
部署模式
- 系统:Windows Server
- 宿主:IIS
- 发布方式:Visual Studio 发布 → IIS 手动配置
特点
- 图形化配置简单,适合运维人员上手
- 生态成熟,工具链完整
- 但环境依赖极强,不同服务器配置不一致 → “本地能跑,线上炸锅”
局限性
| 问题 | 说明 |
|---|---|
| 环境不一致 | 不同服务器 IIS 版本、运行时、配置文件差异大 |
| 自动化困难 | 发布流程无法脚本化,全靠人工操作 |
| 可移植性差 | 应用只能跑在 Windows 上 |
| 运维成本高 | 补丁、升级、回滚复杂,出错率高 |
✅ 这种方式在单机时代尚可,但在多地部署或信创替代场景下几乎无法适应。
第二阶段:Windows Docker —— 容器化的第一步
ASP.NET Core 的跨平台设计,让容器化成为可能。
微软推出了 Windows 容器,让企业可以在不离开 Windows 的情况下,先体验容器化带来的好处。
示例 Dockerfile
1 | FROM mcr.microsoft.com/dotnet/aspnet:6.0-nanoserver-ltsc2022 |
运行命令
1 | docker build -t imagesname:latest . |

结果会提示成功信息:

1 | docker run -d -p 8080:80 yourapp:latest |
优势
- 实现环境一致性(“开发环境怎么配,生产环境就怎么跑”)
- 可结合 CI/CD,实现自动化发布
- 是通往 Linux Docker 的过渡方案
局限
- 镜像体积大(Windows 基础镜像动辄 1GB+)
- 性能开销高(Windows 容器比 Linux 容器慢)
- 不支持国产 Linux
- 生态相对薄弱(很多工具不支持 Windows 容器)
- Docker Windows 版本在一定条件下会收费
★
💡 一句话总结:这是“安全区内的第一步”,让你熟悉容器,为下一步做准备。
第三阶段:Linux Docker —— 全面跨平台与国产化支持
进入这一阶段,企业逐步完成从 Windows 容器 → Linux 容器 的迁移,
部署环境从 IIS 彻底转向 Docker + ASP.NET Core 的跨平台运行。
构建标准 Linux 镜像(多阶段构建)
1 | # 构建阶段 |
推荐环境
| 类型 | 推荐 |
|---|---|
| 操作系统 | 统信UOS / 中标麒麟 / 银河麒麟 |
| 容器引擎 | Docker CE / Podman / iSula |
| 镜像仓库 | Harbor / 私有Registry |
| 编排系统 | Kubernetes / K3s / Docker Compose |
优点
✅ 完全脱离 Windows
✅ 支持国产 CPU(ARM64、LoongArch)
✅ 镜像轻量(Alpine 基础镜像仅 5MB)
✅ DevOps 友好,CI/CD 一键发布
✅ 支持多地部署与快速恢复
第四阶段:云原生与多地部署
容器化完成后,企业可以进一步演进为 云原生架构:
- 使用 Kubernetes 管理应用生命周期
- 用 Helm / Kustomize 管理配置
- 接入 Prometheus + Grafana + Loki 实现监控日志
- 在国产云平台上运行(如麒麟云、移动云、华为云 Stack 等)
- 实现“一次构建,随处运行”的目标。
单机部署与镜像分发:国产环境下的实战方案
很多企业环境暂时无法连公网,也没有私有仓库,
此时“单机离线部署镜像”成为最关键的问题。
场景
- 开发机上构建好镜像;
- 需要拷贝到另一台生产机运行;
- 两台机器之间无公网,只能通过 U盘 / 局域网共享传输。
✅ 方法一:使用 docker save / docker load
导出镜像:
1 | docker save -o myapp.tar myapp:latest |
拷贝镜像文件:
1 | scp myapp.tar [email protected]:/home/user/ |
目标机导入:
1 | docker load -i myapp.tar |
查看结果:
1 | docker images |
✅ 方法二:批量导出多个镜像
1 | docker save -o all-images.tar myapp:latest redis:7 nginx:1.25 |
✅ 方法三:导出压缩包(推荐)
1 | docker save myapp:latest | gzip > myapp.tar.gz |
✅ 方法四:临时搭建本地镜像仓库
当有多台设备时,建议搭建一个局域网私有仓库:
1 | docker run -d -p 5000:5000 --name registry registry:2 |
推送镜像:
1 | docker tag myapp:latest 192.168.1.100:5000/myapp:latest |
其他机器拉取:
1 | docker pull 192.168.1.100:5000/myapp:latest |
⚠️ 若使用 HTTP 仓库,请配置:
1 | // /etc/docker/daemon.json |
✅ 方法五:国产系统(UOS、麒麟)兼容命令
1 | podman save -o myapp.tar myapp:latest |
如需支持不同 CPU 架构:
1 | docker buildx build --platform=linux/arm64,linux/amd64 -t myapp:latest . |
七、迁移路线图与落地建议
| 阶段 | 平台 | 部署方式 | 迁移难度 | 特点 |
|---|---|---|---|---|
| 阶段1 | Windows + IIS | 手工部署 | 低 | 传统方式 |
| 阶段2 | Windows + Docker | 容器部署 | 中 | 平滑过渡 |
| 阶段3 | Linux + Docker | 容器部署 | 中高 | 实现国产化 |
1 |
实施建议
统一使用 .NET 8 / ASP.NET Core,优先容器化,再迁移到 Linux,自建或使用国产化镜像仓库,引入 CI/CD 实现持续交付,对多地单机节点用离线导入方案,建立配置中心与日志监控体系。
八、结语
从 Windows IIS 到 Linux Docker,
ASP.NET Core 的部署方式经历了从图形化手工到自动化容器化的深刻变革。
在信创和国产化的时代背景下,这不只是技术选择,更是企业 IT 架构重塑的必经之路。