Azure Windows VM Scale Set自动安装Docker:自定义脚本扩展无效求最优方案
解决Windows VM Scale Set自动安装Docker的最优方案
方案一:使用预安装Docker的自定义镜像(推荐长期使用)
这是最彻底的解决方案,一次性把Docker预安装到镜像中,VMSS创建的所有新实例都会自带Docker,无需重复操作:
- 创建一台基于
WindowsServer 2022-Datacenter的独立VM - 登录该VM,手动安装并配置Docker:
- 下载并解压Docker静态包,配置环境变量
- 注册Docker服务并设置为自动启动
- 验证Docker正常运行(执行
docker version)
- 对VM执行Sysprep(系统准备工具),确保镜像可复用:
C:\Windows\System32\sysprep\sysprep.exe /oobe /generalize /shutdown - 在Azure中捕获该VM为自定义镜像
- 修改VMSS的
source_image_reference配置,替换为自定义镜像的信息(使用镜像的ID或publisher/offer/sku/version)
优点:实例启动速度快,无需每次执行安装脚本;配置一次即可长期复用。
方案二:改进自定义脚本扩展,处理重启后配置
针对原有脚本重启后失效的问题,可通过计划任务让重启后的VM自动完成Docker的最终配置:
编写PowerShell脚本并通过自定义脚本扩展部署,示例如下:
# 下载并解压Docker安装包 Invoke-WebRequest -Uri "https://download.docker.com/win/static/stable/x86_64/docker-24.0.6.zip" -OutFile "docker.zip" Expand-Archive docker.zip -DestinationPath $Env:ProgramFiles # 配置系统环境变量 $currentPath = [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) if (-not $currentPath.Contains("$Env:ProgramFiles\docker")) { [Environment]::SetEnvironmentVariable("Path", "$currentPath;$Env:ProgramFiles\docker", [EnvironmentVariableTarget]::Machine) } # 创建开机自动执行的计划任务,完成Docker服务注册与启动 $taskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument @" -Command '& `"$Env:ProgramFiles\docker\dockerd.exe`" --register-service; Start-Service docker; Set-Service docker -StartupType Automatic; docker version' "@ $taskTrigger = New-ScheduledTaskTrigger -AtStartup $taskPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest Register-ScheduledTask -TaskName "DockerPostRestartSetup" -Action $taskAction -Trigger $taskTrigger -Principal $taskPrincipal -Force # 重启VM使环境变量生效 Restart-Computer -Force
原理:脚本先完成Docker的基础安装,通过计划任务预留重启后的配置步骤,VM重启后系统自动执行该任务,完成Docker服务的注册与启动。
方案三:使用Azure DSC扩展管理配置
Azure DSC(Desired State Configuration)扩展支持幂等性配置,可自动处理重启并继续完成后续配置:
编写DSC配置脚本,示例如下:
Configuration InstallDocker { Import-DscResource -ModuleName PSDesiredStateConfiguration Node 'localhost' { # 下载并解压Docker安装包 Archive DockerArchive { Path = "https://download.docker.com/win/static/stable/x86_64/docker-24.0.6.zip" Destination = $Env:ProgramFiles Ensure = "Present" } # 配置系统环境变量 Environment DockerPath { Name = "Path" Value = "$([Environment]::GetEnvironmentVariable('Path', 'Machine'));$Env:ProgramFiles\docker" Ensure = "Present" Path = $true DependsOn = "[Archive]DockerArchive" } # 注册并启动Docker服务 Script ConfigureDockerService { GetScript = { @{ Result = (Get-Service -Name docker -ErrorAction SilentlyContinue) -ne $null } } TestScript = { (Get-Service -Name docker -ErrorAction SilentlyContinue) -ne $null } SetScript = { & "$Env:ProgramFiles\docker\dockerd.exe" --register-service Start-Service docker Set-Service docker -StartupType Automatic } DependsOn = "[Environment]DockerPath" } } }
将该配置打包后通过DSC扩展部署到VMSS,DSC会自动处理安装流程,若需要重启则自动重启并继续完成配置。
内容的提问来源于stack exchange,提问作者user25982998
相关产品推荐
相关产品推荐

