如何在启动时启动 Docker 守护进程(Windows 服务)而无需登录?
Posted
技术标签:
【中文标题】如何在启动时启动 Docker 守护进程(Windows 服务)而无需登录?【英文标题】:How to start Docker daemon (windows service) at startup without the need to log-in? 【发布时间】:2018-12-17 12:42:11 【问题描述】:我们在 Windows Server 2016 Datacenter 机器上安装了 Docker for Windows。
我们使用这个盒子作为我们的 docker 容器的构建代理。
当我们尝试通过守护程序连接到此框以构建容器时,我们收到一条错误消息,指示守护程序未运行(在帖子末尾)。
但是,如果我使用我的 AD 帐户登录到此框,则守护程序将启动、运行,然后我可以连接并执行我需要做的一切。
有没有办法让守护程序在启动时启动而不需要用户登录?该服务似乎只有在用户登录时才会运行。
错误信息:
error during connect: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.37/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=[NameRemovedForPrivacy]&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&session=[keyRemovedForPrivacy]&shmsize=0&t=[serverNameRemovedForPrivacy]&target=&ulimits=null: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
我尝试过的:
已验证 Docker 已在 Windows 服务中列出并配置为 自动启动。 在 Windows 任务计划程序中创建条目以执行 dockerexecutable
和 com.service.docker
在启动时提升
特权。
【问题讨论】:
一年前我有这个要求,发现没有办法在 Windows 上将 docker 作为服务运行而无需登录。最终创建了一个作为 Hyper-V 机器运行的 Debian VM。这是作为服务运行的,并且是 Docker 的主机。 这是一个完整的帖子,关于如何实现这个thecodeframework.com/… 【参考方案1】:windows server 的最佳解决方案是使用Task Scheduler
创建运行“Docker Desktop”应用程序的任务,以防系统启动。
要搜索“任务计划程序”,请单击“创建任务...”。
在新选项卡上指定任务名称并选择“无论用户是否登录都运行”单选按钮和“以最高权限运行”复选框。在页面末尾选择适当的窗口类型。
现在单击触发器选项卡并添加新触发器。在新的触发器页面上,选择“启动时”,然后单击“确定”。
最后,单击操作选项卡并添加一个运行“Docker windows”快捷方式的新操作,该快捷方式在 windows 上运行 docker daemon。
当 docker 启动时,经过 1 分钟,容器启动可能需要一些时间(在我的情况下为 4 分钟)等待几分钟,然后测试您的 docker 是否正在运行。
【讨论】:
是的,我测试了它,但我忘了提到在创建触发器时设置了 1 分钟延迟。在创建触发步骤时,在“Delay task for:”标签前设置1分钟延迟并再次测试。作为启动 docker,经过 1 分钟,启动容器可能需要几分钟(在我的情况下为 4 分钟)等待几分钟,然后测试您的 docker 是否正在运行。 我可以确认这对我有用。我的构建服务器正在运行 Windows 10,WCOW。这是我遇到的问题:我们使用不同的域帐户在我们的构建服务器上运行作业。该帐户必须添加到 docker 用户组。在这样做之前,docker desktop 会启动,但守护程序服务不会。我还必须以该用户身份登录并配置 docker 为该用户使用 Windows 容器。 这适用于我们在 Windows 10 上,但它要求我们将启动 Docker Desktop 的帐户设置为机器上的管理员。 这种方法为我工作了几年,但最近开始失败。 Docker for Windows 似乎为此添加了一些 Toast 通知,当没有用户登录时,那些尝试的 toast 调用似乎阻止了我的容器的调用。我找不到禁用 Toast 通知的选项。 @LarrySilverman 关于 toast 通知。使用抑制它们的值更新/c/Users/.../AppData/Roaming/Docker/settings.json
,例如"disableTips": true, "displayed18362Deprecation": true, "openUIOnStartupDisabled": true
.【参考方案2】:
这是一个 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)
【讨论】:
谢谢 - 这工作。我只需要用我自己的替换最后一个命令中的用户。 要将最后一条命令中的用户替换为我,请将-User docker
替换为-User $env:UserName
【参考方案3】:
除了@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的方案有什么不同吗?如果是这样,最好指出这一点。【参考方案4】:注意,非免费软件解决方案,但有 30 天试用版。
我可以确认上面的eckes' 评论。似乎没有任何效果。我非常努力地将任务计划程序设置为在具有提升权限等的 SYSTEM 用户下运行,但仍然没有运气。
我确实找到了一种需要第三方软件的解决方案。软件AlwaysUp允许Docker在启动时运行,无需登录。
I followed the instructions,除了要运行的可执行文件不是 Docker Tools,我指向的是reference\dockerd.exe
。重新启动服务器,果然我现在可以连接到我的远程守护进程了。
我推荐这种方法作为最简单的解决方案。
【讨论】:
值得一提的是,AlwaysUp 不是免费的,但有 30 天试用版 2020 年 12 月更新:我正在将我接受的答案从这个答案更改为 Milad Teimouri (***.com/a/59467740/7547525) 的答案。这里的方法仍然有效,但似乎可以在不使用 3rd-party 工具的情况下完成。【参考方案5】:如果此问题出现在 Windows 10 中,请尝试重新启动 Docker 服务。
【讨论】:
以上是关于如何在启动时启动 Docker 守护进程(Windows 服务)而无需登录?的主要内容,如果未能解决你的问题,请参考以下文章
docker 学习笔记20:docker守护进程的配置与启动