如何在Docker容器运行的IIS中为Web应用配置子目录
解决方案
完全可以通过官方带IIS的Windows基础镜像实现和本地一致的子应用部署,你之前的配置不生效核心原因有两个:
- 你把WCF服务和MVC前端拆成了两个独立容器,每个容器运行独立的操作系统和独立的IIS实例,文件系统完全隔离,不可能共享同一个IIS站点的目录结构
- 你只通过
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
相关产品推荐
相关产品推荐

