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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:53:16