The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何讓 Docker Desktop for Windows 在系統開機時自動啟動

我們公司內部有台 Windows 10 測試機,幾乎所有的環境都跑在 Docker 容器中,但這台 VM 每次重開的時候,都需要人工進入系統啟動 Docker Desktop 並且手動執行因為重開而被停止的容器。這篇文章我打算來分享一個小技巧,教你如何將現有正在執行的容器,可以在系統開機時就自動跑起來。

設定工作排程器

雖然說 Docker Desktop for Windows 本身就支援了可以在「登入時」自動啟動 Desktop Desktop 的設定,但我們的需求比較是希望可以在「啟動時」就直接啟動 Docker Desktop 服務。

Docker Desktop > Settings

我直接利用 Windows 內建的「工作排程器」來設定啟動時自動執行 Docker Desktop 應用程式,設定的過程直接用 PowerShell 自動化,只要複製貼上就能設定完成。

  • PowerShell 5.1

    由於 Windows 內建的 PowerShell 僅支援到 Windows PowerShell 5.1 版,之後的新版都需要額外安裝才行,這裡我先分享 PowerShell 5.1 的命令。

    請記得以系統管理人員身份執行 Windows PowerShell 命令提示字元。

    $trigger = New-ScheduledTaskTrigger -AtStartup
    $trigger.Delay = 'PT1M'
    
    $action = New-ScheduledTaskAction -Execute 'C:\Program Files\Docker\Docker\Docker Desktop.exe'
    
    $settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable -RestartCount 999
    $settings.ExecutionTimeLimit = 'PT0S'
    $settings.RestartInterval = 'PT1M'
    
    $secureString = Read-Host -Prompt 'Password' -AsSecureString
    $ToBSTRString = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
    $ToPlainText = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($ToBSTRString)
    
    Register-ScheduledTask `
        -Action $action `
        -Trigger $trigger `
        -TaskName Docker `
        -Settings $settings `
        -User $env:UserName `
        -Password $ToPlainText
    
  • PowerShell 7+

    較新版的 Windows 10 或 Windows 11 都已經內建 winget 套件管理器,你只要用一個命令就可以自動安裝好 PowerShell 7+ 版本:

    winget install Microsoft.PowerShell
    

    請記得以系統管理人員身份執行 PowerShell 7 命令提示字元,你也可以輸入 pwsh 命令進入 PowerShell 7 環境。

    $trigger = New-ScheduledTaskTrigger -AtStartup
    $trigger.Delay = 'PT1M'
    
    $action = New-ScheduledTaskAction -Execute 'C:\Program Files\Docker\Docker\Docker Desktop.exe'
    
    $settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable -RestartCount 999
    $settings.ExecutionTimeLimit = 'PT0S'
    $settings.RestartInterval = 'PT1M'
    
    $ToPlainText = ConvertFrom-SecureString (Read-Host -Prompt 'Password' -AsSecureString) -AsPlainText
    
    Register-ScheduledTask `
        -Action $action `
        -Trigger $trigger `
        -TaskName Docker `
        -Settings $settings `
        -User $env:UserName `
        -Password $ToPlainText
    

調整現有容器的重啟設定

由於我們的 Docker 容器都已經啟動,而且做了不少開發環境的設定,若要在不重建容器的情況下,讓 Docker Desktop 在成功啟動時自動啟動容器,那麼我們就需要透過以下命令,更新現有容器的 Restart Policy 設定值:

docker update --restart unless-stopped websphere
docker update --restart unless-stopped sqlserver

假設我們有兩個容器,名稱分別為 webspheresqlserver

如何停止 Docker Desktop for Windows 服務

由於我們已經在系統啟動時,就自動啟動 Docker Desktop 應用程式,因此我們用相同帳號登入此系統時,就無法再次啟動,你會看到以下錯誤訊息:

Docker failed to initialize

所以你無法透過桌面右下角的 System Tray 來關閉 Docker Desktop 運作。

我原本想,那我把「服務管理員」的 com.docker.service 服務關閉,會不會就能完全停止 Docker Desktop 運作了?結果是完全不行!就算你停止該服務,所有容器還是會繼續執行的。

Stop-Service com.docker.service

以上命令無法關閉 Docker Desktop 喔!

如果你真的要停止 Docker Desktop 的話,可能要用比較暴力的方法了,如下命令:

$isrunning = Get-Process "Docker Desktop" -ErrorAction SilentlyContinue
if ($isrunning) {
  $isrunning.CloseMainWindow()
  $isrunning | Stop-Process -Force
}

相關連結