You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker容器运行的IIS中为Web应用配置子目录

解决方案

完全可以通过官方带IIS的Windows基础镜像实现和本地一致的子应用部署,你之前的配置不生效核心原因有两个:

  1. 你把WCF服务和MVC前端拆成了两个独立容器,每个容器运行独立的操作系统和独立的IIS实例,文件系统完全隔离,不可能共享同一个IIS站点的目录结构
  2. 你只通过WORKDIR修改了容器内的命令执行路径,既没有把两个应用的文件放到同一个IIS站点的目录下,也没有在IIS中把子目录注册为独立应用程序,IIS不会自动识别子目录下的Web应用配置。

正确实现步骤

不要拆分两个独立服务,将两个应用部署到同一个IIS容器中,根路径托管WCF服务,/FormulaBuilder路径托管MVC前端,和你本地IIS结构完全一致。

1. 调整项目目录结构

将所有构建相关文件放到解决方案根目录下,结构参考如下:

你的解决方案根目录/
├─ docker-compose.yml
├─ iis/
│  └─ Dockerfile
├─ FBSVC/                     # WCF服务项目目录
│  └─ bin/app.publish/        # WCF项目发布输出目录
└─ FormulaBuilder/            # MVC前端项目目录
   └─ bin/app.publish/        # MVC项目发布输出目录

2. 编写统一部署的Dockerfile

在iis/Dockerfile中写入以下配置,选用WCF 4.8基础镜像即可,该镜像默认已集成ASP.NET 4.8和所有需要的IIS组件:

FROM mcr.microsoft.com/dotnet/framework/wcf:4.8

# 创建子应用对应的物理目录
RUN New-Item -Path 'C:\inetpub\wwwroot\FormulaBuilder' -ItemType Directory -Force

# 拷贝WCF发布文件到IIS默认站点根目录
COPY FBSVC/bin/app.publish/ /inetpub/wwwroot/

# 拷贝MVC发布文件到子应用物理目录
COPY FormulaBuilder/bin/app.publish/ /inetpub/wwwroot/FormulaBuilder/

# 核心配置:通过IIS自带的appcmd工具将子目录注册为独立IIS应用
RUN C:\Windows\System32\inetsrv\appcmd.exe add app `
    /site.name:"Default Web Site" `
    /path:/FormulaBuilder `
    /physicalPath:"C:\inetpub\wwwroot\FormulaBuilder" `
    /applicationPool:"DefaultAppPool"

# 授予IIS应用池目录访问权限,避免403/500权限错误
RUN icacls "C:\inetpub\wwwroot" /grant "IIS AppPool\DefaultAppPool:(OI)(CI)RX" /T

EXPOSE 80

3. 简化Docker Compose配置

因为现在只有一个容器承载所有应用,不需要映射多个端口,修改docker-compose.yml如下:

version: "3"
services:
  dotnet-app:
    build:
      context: .
      dockerfile: ./iis/Dockerfile
    container_name: "Dotnet-IIS-App"
    ports:
      - "5000:80"

关键注意点

  • 部署完成后访问http://localhost:5000即可打开WCF服务,访问http://localhost:5000/FormulaBuilder即可打开前端页面,和你本地IIS的访问路径完全一致,更新Service Reference时不需要额外处理端口映射问题
  • 单纯把文件拷贝到wwwroot子目录但不执行appcmd add app注册的话,IIS只会把子目录当成普通静态文件目录,不会加载子目录下的web.config,也不会初始化独立的应用域,就会出现你之前遇到的配置解析报错
  • 如果两个应用需要隔离运行,可以单独给MVC子应用创建独立应用池,只需要在Dockerfile中新增以下命令即可:
# 新建独立应用池,配置.NET 4.0集成管道模式
RUN C:\Windows\System32\inetsrv\appcmd.exe add apppool `
    /name:"FormulaBuilderPool" `
    /managedRuntimeVersion:"v4.0" `
    /managedPipelineMode:"Integrated"

# 注册子应用时替换为新建的应用池即可
RUN C:\Windows\System32\inetsrv\appcmd.exe set app `
    "Default Web Site/FormulaBuilder" `
    /applicationPool:"FormulaBuilderPool"

内容的提问来源于stack exchange,提问作者jdistro07

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:18:19