1. 为什么要在Windows Server 2019上跑Docker作为长期在Windows Server环境部署应用的运维老兵我最初对Docker容器化技术是持怀疑态度的——直到亲眼见证某企业级应用迁移到容器后部署时间从4小时缩短到15分钟。Windows Server 2019作为微软首个原生支持Linux容器的服务器系统其容器化方案已经足够成熟到支撑生产环境。传统Windows服务部署最头疼的就是环境依赖问题。比如某次部署IIS应用时因为目标服务器缺少特定的VC运行时库整个部署流程卡了整整一天。而通过Docker容器打包应用及其所有依赖后在任何安装了Docker引擎的Windows Server 2019上都能实现秒级部署。更妙的是通过容器隔离机制同一台服务器上可以并行运行多个不同.NET Framework版本的应用彻底解决了DLL地狱问题。2. 环境准备与前置检查2.1 系统要求硬核解析在开始安装前需要确认服务器满足以下硬性条件操作系统版本Windows Server 2019 Standard/Datacenter build 1809或更高虚拟化支持需在BIOS中开启VT-x/AMD-V虚拟化技术可通过任务管理器→性能选项卡查看虚拟化是否启用内存配置至少4GB RAM实际生产环境建议8GB起步存储空间系统盘剩余空间不少于20GB容器镜像很占空间重要提示如果服务器已经安装过Hyper-V角色需要先卸载该角色再安装Docker否则会导致冲突。可通过PowerShell执行Remove-WindowsFeature -Name Hyper-V -Restart2.2 必备组件安装实录通过管理员身份运行PowerShell依次执行以下命令# 安装容器功能模块 Install-WindowsFeature -Name Containers # 安装包管理工具Chocolatey比原生包管理更强大 Set-ExecutionPolicy Bypass -Scope Process -Force [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 iex ((New-Object System.Net.WebClient).DownloadString(https://community.chocolatey.org/install.ps1)) # 重启服务器使更改生效 Restart-Computer -Force重启后建议再次检查Containers功能是否成功安装Get-WindowsFeature -Name Containers | Where-Object InstallState -eq Installed3. Docker引擎安装全流程3.1 官方推荐安装方案微软官方提供了两种Docker安装方式经过多次实测推荐采用Docker EE版本# 添加Docker官方源 choco source add -ndocker-offcial -shttps://download.docker.com/components/engine/windows-server/index.json # 安装Docker引擎 choco install docker-ee -y # 设置Docker服务开机自启 Set-Service -Name docker -StartupType Automatic Start-Service docker安装完成后验证版本信息docker version正常输出应包含Client和Server两部分信息特别注意Server的OS/Arch显示应为windows/amd64。3.2 国内环境加速配置对于国内服务器必须配置镜像加速器才能正常拉取镜像。编辑C:\ProgramData\docker\config\daemon.json不存在则新建{ registry-mirrors: [ https://registry.docker-cn.com, https://docker.mirrors.ustc.edu.cn ], exec-opts: [isolationprocess] }然后重启Docker服务Restart-Service docker4. 容器实战运行第一个Windows容器4.1 基础镜像选择策略Windows容器镜像有不同基础类型根据应用需求选择microsoft/windowsservercore完整Windows Server Core约5GBmicrosoft/nanoserver精简版约250MBmcr.microsoft.com/windows/servercore:ltsc2019特定版本标签建议首次测试使用NanoServerdocker pull mcr.microsoft.com/windows/nanoserver:18094.2 交互式容器初体验运行一个交互式容器并进入PowerShelldocker run -it mcr.microsoft.com/windows/nanoserver:1809 powershell在容器内执行基本命令验证Get-Process hostname [System.Environment]::OSVersion.Version退出容器时不要直接关闭窗口应先输入exit命令否则会导致容器进程异常终止。5. 生产级容器部署示范5.1 IIS网站容器化实战构建包含IIS的ASP.NET应用容器准备DockerfileFROM mcr.microsoft.com/windows/servercore:ltsc2019 RUN powershell -Command Add-WindowsFeature Web-Server COPY ./webapp /inetpub/wwwroot EXPOSE 80 CMD [ping, -t, localhost]构建镜像docker build -t my-iis-app .运行容器并映射端口docker run -d -p 8080:80 --name myweb my-iis-app5.2 容器网络高级配置Windows容器支持多种网络模式# 查看现有网络 docker network ls # 创建自定义网络 docker network create -d nat mynet # 运行容器时指定网络 docker run -d --networkmynet --nameapp1 my-iis-app6. 避坑指南与性能优化6.1 常见报错解决方案问题1docker pull时报no matching manifest错误原因镜像标签与系统版本不匹配解决确认系统版本与镜像标签一致如1809对应ltsc2019问题2容器启动后立即退出排查查看容器日志docker logs 容器ID典型修复确保CMD命令是持久化进程如用ping -t替代直接运行exe6.2 存储驱动优化建议Windows容器默认使用windowsfilter存储驱动对于频繁创建销毁容器的场景建议定期清理无用镜像docker system prune -f修改镜像存储路径需修改注册表Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Containers -Name DockerRoot -Value D:\docker7. 监控与维护实战技巧7.1 容器监控三板斧实时查看容器资源占用docker stats查看容器详细配置docker inspect 容器ID | Select-String -Pattern IPAddress性能计数器监控需预先安装Install-WindowsFeature -Name Containers | Out-Null Get-Counter -Counter \Container(*)\* -SampleInterval 2 -MaxSamples 57.2 日志收集方案将容器日志输出到外部系统docker run -d --log-driverjson-file --log-opt max-size50m --log-opt max-file3 my-iis-app推荐使用ELK栈集中管理日志安装Filebeat收集docker日志配置日志解析规则在Kibana中创建监控看板8. 企业级部署进阶路线当单个容器无法满足需求时可以考虑8.1 Docker Swarm集群部署初始化Swarm集群docker swarm init --advertise-addr 本机IP部署服务示例docker service create --name web --replicas 3 -p 8080:80 my-iis-app8.2 Kubernetes on Windows虽然Windows节点在K8s中仍是二等公民但2019后已有显著改进安装kubeadm、kubelet和kubectl初始化控制平面kubeadm init --pod-network-cidr10.244.0.0/16安装Flannel网络插件生产环境建议Windows节点仅运行Windows容器Linux节点运行控制平面9. 安全加固最佳实践9.1 容器安全基线启用内容信任$env:DOCKER_CONTENT_TRUST1限制容器权限docker run --read-only -v C:\temp:C:\temp:ro my-iis-app定期扫描镜像漏洞docker scan my-iis-app9.2 证书管理方案为Docker Daemon配置TLS认证生成CA证书创建服务器证书配置daemon.json{ tls: true, tlscacert: C:\\certs\\ca.pem, tlscert: C:\\certs\\server-cert.pem, tlskey: C:\\certs\\server-key.pem }10. 从容器到生产完整CI/CD流水线示例10.1 Azure DevOps自动化流程构建阶段steps: - task: Docker2 inputs: containerRegistry: myRegistry repository: myApp command: buildAndPush Dockerfile: **/Dockerfile tags: $(Build.BuildId)发布阶段steps: - task: Docker2 inputs: containerRegistry: myRegistry repository: myApp command: login - script: | docker stack deploy -c docker-compose.yml myapp10.2 本地开发到生产的全链路开发环境使用Docker Desktop for Windows开发镜像通过docker-compose.yml定义多容器应用测试环境推送镜像到私有Registry自动触发Jenkins部署任务生产环境使用蓝绿部署策略通过Traefik实现流量切换
Windows Server 2019 Docker容器化部署实战指南
1. 为什么要在Windows Server 2019上跑Docker作为长期在Windows Server环境部署应用的运维老兵我最初对Docker容器化技术是持怀疑态度的——直到亲眼见证某企业级应用迁移到容器后部署时间从4小时缩短到15分钟。Windows Server 2019作为微软首个原生支持Linux容器的服务器系统其容器化方案已经足够成熟到支撑生产环境。传统Windows服务部署最头疼的就是环境依赖问题。比如某次部署IIS应用时因为目标服务器缺少特定的VC运行时库整个部署流程卡了整整一天。而通过Docker容器打包应用及其所有依赖后在任何安装了Docker引擎的Windows Server 2019上都能实现秒级部署。更妙的是通过容器隔离机制同一台服务器上可以并行运行多个不同.NET Framework版本的应用彻底解决了DLL地狱问题。2. 环境准备与前置检查2.1 系统要求硬核解析在开始安装前需要确认服务器满足以下硬性条件操作系统版本Windows Server 2019 Standard/Datacenter build 1809或更高虚拟化支持需在BIOS中开启VT-x/AMD-V虚拟化技术可通过任务管理器→性能选项卡查看虚拟化是否启用内存配置至少4GB RAM实际生产环境建议8GB起步存储空间系统盘剩余空间不少于20GB容器镜像很占空间重要提示如果服务器已经安装过Hyper-V角色需要先卸载该角色再安装Docker否则会导致冲突。可通过PowerShell执行Remove-WindowsFeature -Name Hyper-V -Restart2.2 必备组件安装实录通过管理员身份运行PowerShell依次执行以下命令# 安装容器功能模块 Install-WindowsFeature -Name Containers # 安装包管理工具Chocolatey比原生包管理更强大 Set-ExecutionPolicy Bypass -Scope Process -Force [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 iex ((New-Object System.Net.WebClient).DownloadString(https://community.chocolatey.org/install.ps1)) # 重启服务器使更改生效 Restart-Computer -Force重启后建议再次检查Containers功能是否成功安装Get-WindowsFeature -Name Containers | Where-Object InstallState -eq Installed3. Docker引擎安装全流程3.1 官方推荐安装方案微软官方提供了两种Docker安装方式经过多次实测推荐采用Docker EE版本# 添加Docker官方源 choco source add -ndocker-offcial -shttps://download.docker.com/components/engine/windows-server/index.json # 安装Docker引擎 choco install docker-ee -y # 设置Docker服务开机自启 Set-Service -Name docker -StartupType Automatic Start-Service docker安装完成后验证版本信息docker version正常输出应包含Client和Server两部分信息特别注意Server的OS/Arch显示应为windows/amd64。3.2 国内环境加速配置对于国内服务器必须配置镜像加速器才能正常拉取镜像。编辑C:\ProgramData\docker\config\daemon.json不存在则新建{ registry-mirrors: [ https://registry.docker-cn.com, https://docker.mirrors.ustc.edu.cn ], exec-opts: [isolationprocess] }然后重启Docker服务Restart-Service docker4. 容器实战运行第一个Windows容器4.1 基础镜像选择策略Windows容器镜像有不同基础类型根据应用需求选择microsoft/windowsservercore完整Windows Server Core约5GBmicrosoft/nanoserver精简版约250MBmcr.microsoft.com/windows/servercore:ltsc2019特定版本标签建议首次测试使用NanoServerdocker pull mcr.microsoft.com/windows/nanoserver:18094.2 交互式容器初体验运行一个交互式容器并进入PowerShelldocker run -it mcr.microsoft.com/windows/nanoserver:1809 powershell在容器内执行基本命令验证Get-Process hostname [System.Environment]::OSVersion.Version退出容器时不要直接关闭窗口应先输入exit命令否则会导致容器进程异常终止。5. 生产级容器部署示范5.1 IIS网站容器化实战构建包含IIS的ASP.NET应用容器准备DockerfileFROM mcr.microsoft.com/windows/servercore:ltsc2019 RUN powershell -Command Add-WindowsFeature Web-Server COPY ./webapp /inetpub/wwwroot EXPOSE 80 CMD [ping, -t, localhost]构建镜像docker build -t my-iis-app .运行容器并映射端口docker run -d -p 8080:80 --name myweb my-iis-app5.2 容器网络高级配置Windows容器支持多种网络模式# 查看现有网络 docker network ls # 创建自定义网络 docker network create -d nat mynet # 运行容器时指定网络 docker run -d --networkmynet --nameapp1 my-iis-app6. 避坑指南与性能优化6.1 常见报错解决方案问题1docker pull时报no matching manifest错误原因镜像标签与系统版本不匹配解决确认系统版本与镜像标签一致如1809对应ltsc2019问题2容器启动后立即退出排查查看容器日志docker logs 容器ID典型修复确保CMD命令是持久化进程如用ping -t替代直接运行exe6.2 存储驱动优化建议Windows容器默认使用windowsfilter存储驱动对于频繁创建销毁容器的场景建议定期清理无用镜像docker system prune -f修改镜像存储路径需修改注册表Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Containers -Name DockerRoot -Value D:\docker7. 监控与维护实战技巧7.1 容器监控三板斧实时查看容器资源占用docker stats查看容器详细配置docker inspect 容器ID | Select-String -Pattern IPAddress性能计数器监控需预先安装Install-WindowsFeature -Name Containers | Out-Null Get-Counter -Counter \Container(*)\* -SampleInterval 2 -MaxSamples 57.2 日志收集方案将容器日志输出到外部系统docker run -d --log-driverjson-file --log-opt max-size50m --log-opt max-file3 my-iis-app推荐使用ELK栈集中管理日志安装Filebeat收集docker日志配置日志解析规则在Kibana中创建监控看板8. 企业级部署进阶路线当单个容器无法满足需求时可以考虑8.1 Docker Swarm集群部署初始化Swarm集群docker swarm init --advertise-addr 本机IP部署服务示例docker service create --name web --replicas 3 -p 8080:80 my-iis-app8.2 Kubernetes on Windows虽然Windows节点在K8s中仍是二等公民但2019后已有显著改进安装kubeadm、kubelet和kubectl初始化控制平面kubeadm init --pod-network-cidr10.244.0.0/16安装Flannel网络插件生产环境建议Windows节点仅运行Windows容器Linux节点运行控制平面9. 安全加固最佳实践9.1 容器安全基线启用内容信任$env:DOCKER_CONTENT_TRUST1限制容器权限docker run --read-only -v C:\temp:C:\temp:ro my-iis-app定期扫描镜像漏洞docker scan my-iis-app9.2 证书管理方案为Docker Daemon配置TLS认证生成CA证书创建服务器证书配置daemon.json{ tls: true, tlscacert: C:\\certs\\ca.pem, tlscert: C:\\certs\\server-cert.pem, tlskey: C:\\certs\\server-key.pem }10. 从容器到生产完整CI/CD流水线示例10.1 Azure DevOps自动化流程构建阶段steps: - task: Docker2 inputs: containerRegistry: myRegistry repository: myApp command: buildAndPush Dockerfile: **/Dockerfile tags: $(Build.BuildId)发布阶段steps: - task: Docker2 inputs: containerRegistry: myRegistry repository: myApp command: login - script: | docker stack deploy -c docker-compose.yml myapp10.2 本地开发到生产的全链路开发环境使用Docker Desktop for Windows开发镜像通过docker-compose.yml定义多容器应用测试环境推送镜像到私有Registry自动触发Jenkins部署任务生产环境使用蓝绿部署策略通过Traefik实现流量切换