# ========================================================= # MAX Windows Toolkit - 安装 Docker Desktop # 中文界面,统一风格 # ========================================================= $Common = "C:\Setup\windows\lib\common.ps1" if (Test-Path $Common) { . $Common } Write-Header "安装 Docker Desktop" Show-AdminWarn $AppsDir = "C:\Setup\apps" $InstallerName = "DockerDesktopInstaller.exe" $InstallerUrl = "$Global:RepoBase/apps/$InstallerName" $InstallerPath = Join-Path $AppsDir $InstallerName try { New-Item -ItemType Directory -Path $AppsDir -Force -ErrorAction Stop | Out-Null } catch {} # 检测 Docker Desktop 是否已安装 function Test-DockerDesktopInstalled { $Paths = @( "$env:ProgramFiles\Docker\Docker\Docker Desktop.exe", "${env:ProgramFiles(x86)}\Docker\Docker\Docker Desktop.exe" ) foreach ($Path in $Paths) { if (-not [string]::IsNullOrWhiteSpace($Path) -and (Test-Path $Path)) { return $Path } } return $null } # 启用 Docker 所需 Windows 功能 function Enable-DockerRequiredFeatures { Write-Section "启用 Windows 必需功能" try { dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart } catch { Write-Warn "WSL 功能启用可能已被处理" } try { dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart } catch { Write-Warn "虚拟机平台功能启用可能已被处理" } try { dism.exe /online /enable-feature /featurename:HypervisorPlatform /all /norestart } catch { Write-Warn "Hypervisor 平台功能启用可能已被处理" } Write-OK "功能命令已执行,可能需要重启才能生效" } # 设置 WSL2 为默认 function Set-WSL2DefaultForDocker { Write-Info "正在设置 WSL 2 为默认版本..." try { wsl.exe --set-default-version 2 Write-OK "WSL 2 已设为默认" } catch { Write-Warn "wsl.exe 未就绪或 WSL 未安装,可在安装 WSL 后再设置" } } # 下载 Docker Desktop 安装程序 function Download-DockerDesktopInstaller { if (Test-Path $InstallerPath) { Write-OK "安装程序已存在: $InstallerPath" return $true } return (Download-File -Url $InstallerUrl -OutFile $InstallerPath) } # 安装 Docker Desktop function Install-DockerDesktop { if (-not (Test-IsAdmin)) { Write-Err "请以管理员身份运行 PowerShell" return } $InstalledPath = Test-DockerDesktopInstalled if ($InstalledPath) { Write-OK "Docker Desktop 已安装: $InstalledPath" return } Write-Info "此操作将安装 Docker Desktop" Write-Info "" Write-Info "需要启用的 Windows 功能:" Write-Info "- Windows Subsystem for Linux" Write-Info "- Virtual Machine Platform" Write-Info "- Hypervisor Platform" Write-Info "" Write-Muted "安装程序: $InstallerUrl" Write-Info "" $Confirm = Read-Host "是否继续?输入 YES 确认" if ($Confirm -ne "YES") { Write-Warn "已取消" return } Enable-DockerRequiredFeatures Set-WSL2DefaultForDocker if (-not (Download-DockerDesktopInstaller)) { Write-Err "Docker Desktop 安装程序下载失败" return } try { Unblock-File -Path $InstallerPath -ErrorAction SilentlyContinue } catch {} Write-Info "正在安装 Docker Desktop..." Write-Muted "安装程序: $InstallerPath" try { $Process = Start-Process -FilePath $InstallerPath -ArgumentList "install --quiet" -Wait -PassThru Write-OK "Docker Desktop 安装程序退出代码: $($Process.ExitCode)" Write-Info "如果 Docker Desktop 无法正常启动,请先重启 Windows" } catch { Write-Err "Docker Desktop 安装失败" Write-Muted $_.Exception.Message } } # 启动 Docker Desktop function Start-DockerDesktop { $InstalledPath = Test-DockerDesktopInstalled if (-not $InstalledPath) { Write-Warn "Docker Desktop 未安装" return } try { Start-Process $InstalledPath Write-OK "Docker Desktop 已启动" } catch { Write-Err "启动 Docker Desktop 失败" Write-Muted $_.Exception.Message } } # 显示 Docker 状态 function Show-DockerStatus { $InstalledPath = Test-DockerDesktopInstalled if ($InstalledPath) { Write-OK "Docker Desktop: 已安装" Write-Muted "路径: $InstalledPath" } else { Write-Warn "Docker Desktop: 未安装" } Write-Section "Docker CLI" try { docker version } catch { Write-Warn "docker 命令不可用或 Docker 引擎未运行" } Write-Section "WSL 状态" try { wsl --status wsl --list --verbose } catch { Write-Warn "WSL 不可用或未初始化" } } # 主菜单循环 :dockerLoop while ($true) { Write-Header "安装 Docker Desktop" Write-Info "可用操作:" Write-Info "1. 安装 Docker Desktop" Write-Info "2. 下载/更新 Docker Desktop 安装程序" Write-Info "3. 启用 Docker 所需 Windows 功能" Write-Info "4. 设置 WSL 2 为默认" Write-Info "5. 启动 Docker Desktop" Write-Info "6. 显示 Docker 状态" Write-Info "0. 退出" Write-Info "" $Choice = Read-Host "请选择" Write-Line switch ($Choice) { "1" { Install-DockerDesktop; Pause-Max } "2" { Download-DockerDesktopInstaller | Out-Null; Pause-Max } "3" { Enable-DockerRequiredFeatures; Pause-Max } "4" { Set-WSL2DefaultForDocker; Pause-Max } "5" { Start-DockerDesktop; Pause-Max } "6" { Show-DockerStatus; Pause-Max } "0" { break :dockerLoop } default { Write-Err "无效选项"; Pause-Max } } }