如何在开机时启动Docker守护进程(Windows服务),而无需登录?

51
我们在一台安装有Windows Server 2016 Datacenter的计算机上安装了Docker for Windows。我们将此计算机用作构建代理以构建我们的Docker容器。当我们尝试通过守护程序连接到此计算机以构建容器时,我们会收到一个错误消息,指示守护程序未运行(参见文章末尾)。但是,如果我使用我的AD帐户登录到此计算机,则守护程序会启动、运行,然后我就可以连接并做我需要做的一切。有没有办法使守护程序在启动时开始运行,而不需要用户登录?该服务似乎只在用户登录时运行。错误消息如下: 在Windows的默认守护程序配置中,必须以管理员权限运行docker客户端才能连接。这个错误也可能表明docker守护进程没有运行。 我已经尝试过以下方法: - 验证Docker是否列在Windows服务中,并配置为自动启动。 - 在Windows任务计划程序中创建条目,以使用管理员权限在启动时执行docker可执行文件和com.service.docker。

2
我一年前有这个需求,但是发现在Windows上没有办法在不登录的情况下运行Docker服务。最终我创建了一个Debian虚拟机作为Hyper-V机器,并将其作为服务运行,同时作为Docker的主机。 - eckes
以下是一篇关于如何实现此操作的完整文章:https://thecodeframework.com/start-docker-desktop-on-windows-start-up-without-user-logon/ - Gagan
8个回答

41
在Windows服务器上,最好的解决方案是使用“任务计划程序”创建任务,在系统启动时运行“Docker Desktop”应用程序。
要做到这一点,请搜索“任务计划程序”,单击“创建任务...”。
在新标签页上为任务指定名称,并选择“无论用户是否登录都运行”单选按钮和“以最高权限运行”复选框。在页面末尾选择适当的Windows类型。

Create Task

现在点击触发器选项卡并添加新的触发器。在新的触发器页面上选择“启动时”并点击确定。

enter image description here

最后,点击"Actions"选项卡并添加一个新的操作,运行"Docker windows"快捷方式,在Windows上运行Docker守护进程。

Create Action

当docker启动时,可能需要等待1分钟左右,容器启动可能需要一些时间(在我的情况下是4分钟),请等待几分钟,然后测试您的docker是否正在运行。


这对我们在Windows 10上起作用,但它要求我们将启动Docker Desktop的帐户设置为机器管理员。 - Anders Ekdahl
2
大家好,我尝试了这个解决方案,但即使它解决了我的问题,我发现在将其设置为服务后,Docker托盘图标会消失,我无法再打开仪表板...有人遇到过这种情况吗? - DDD
1
这种方法在过去几年中一直适用于我,但最近开始失效。Docker for Windows的开发人员似乎为此添加了一些Toast通知,当没有用户登录时,这些尝试的Toast调用似乎会阻止我的容器被调用。我找不到禁用Toast通知的选项。 - Larry Silverman
1
@LarrySilverman 关于 toast 通知。更新 /c/Users/.../AppData/Roaming/Docker/settings.json 文件中的值以禁止它们,例如 "disableTips": true, "displayed18362Deprecation": true, "openUIOnStartupDisabled": true - hlovdal
7
很不幸,在最新版本的Docker和Windows Server 2019上,我无法正常工作。在任务管理器中,我可以看到Docker桌面版及其所有相关进程(以及com.docker.service)正在启动运行。然而,没有一个容器在运行。在管理员命令提示符中运行“docker container ls”会出现错误消息:“error during connect: In the deafult daemon configuration on Windows, the docker client must be run with elevated priviliges to connect.” - Jip
显示剩余2条评论

14

这是一个PowerShell脚本,用于创建计划任务,并已验证可在Windows 10上正常工作:

以下是该脚本的代码:

$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'

Register-ScheduledTask -Action $action -Trigger $trigger -TaskName Docker -Settings $settings -User $env:UserName -Password (ConvertFrom-SecureString (Read-Host -Prompt 'Password' -AsSecureString) -AsPlainText)

谢谢,这个方法可行。我只需要将最后一个命令中的用户替换为自己的就好了。 - Vlad A. Ionescu
1
将最后一个命令中的用户替换为我,将“-User docker”替换为“-User $env:UserName”。 - xpt
1
此答案仅适用于PowerShell 7+。 - Will Huang

3

我现在按照这些说明使其工作了。

最重要的步骤是使用任务计划程序添加一个“在启动时”触发器的任务,并将其设置为“无论用户是否登录都运行”。你可以基本上按照Milad Teimouri的答案中的步骤进行操作,但不是直接启动Docker Desktop.exe,而是运行一个Power Shell脚本来启动Docker Desktop和Docker Service,例如:

start "C:\Program Files\Docker\Docker\Docker Desktop.exe"
start-service -Name com.docker.service

1

我尝试了这篇文章中的所有方法,但它们都有缺陷。最终,我使用以下步骤解决了我的问题:

  1. 设置开机后自动登录
  2. 检查 Docker Desktop 设置中的“登录时启动 Docker Desktop”
  3. 取消 Docker Desktop 设置中的“开机时打开 Docker 仪表板”

是的,我放弃了在未登录时运行 Docker Desktop,我使用了自动登录。

参考资料: 如何在 Windows 11 上启用自动登录? https://www.stellarinfo.com/article/windows-11-auto-login.php


0
如果在Windows 10中遇到此问题,只需尝试重新启动Docker服务即可。

0
除了 @Leon V 之外,这已经被验证可在 Windows Server 2019 上运行,只需更改用户名和密码即可:
$trigger = New-ScheduledTaskTrigger -AtStartup
$trigger.Delay = 'PT1M'

$action = New-ScheduledTaskAction -Execute 'C:\Program Files\Docker\dockerd.exe'

$settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable -RestartCount 999
$settings.ExecutionTimeLimit = 'PT0S'
$settings.RestartInterval = 'PT1M'

Register-ScheduledTask -Action $action -Trigger $trigger -TaskName StartDockerAtStartup -Settings $settings -User <username> -Password <password>

你和 Eon V 的解决方案有什么不同吗?如果有的话最好指出来。 - xpt

-1

注意,这是一款非免费软件解决方案,但有30天试用版本。

我可以确认eckes'上面的评论。似乎没有什么方法可行。我非常认真地设置了任务计划程序,以在SYSTEM用户下以提升的权限运行,但仍然没有成功。

我找到了一个需要第三方软件的解决方案。该软件AlwaysUp允许Docker在启动时运行,无需登录。

我按照说明操作, 除了将Docker Tools作为要运行的可执行文件之外,我指向了reference\dockerd.exe。重新启动服务器,果然我现在可以连接到我的远程守护进程了。

我建议采用这种方法,因为它是最简单的解决方案。


9
值得一提的是,AlwaysUp并非免费软件,但拥有30天的试用版本。 - mmahgoub
1
2020年12月更新:我将我的采纳答案从此答案更改为Milad Teimouri的答案(https://dev59.com/sFUK5IYBdhLWcg3w0Cm9#59467740)。这里的方法仍然有效,但似乎可以在不使用第三方工具的情况下完成相同的任务。 - Clayton Rothschild
$50 永久在线?哇! - KevinB

-1

Docker Settings

现在您可以在 Docker 设置中勾选“登录时启动 Docker Desktop”选项,然后应用并重新启动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接