Docker Windows 如何在没有登录的情况下保留容器 运行?

Docker Windows how to keep container running without login?

我在 Windows Server 2016 的虚拟机中安装了 Docker。

我有一个来自 Python3 的 Linux 容器,带有使用 --restart=always 参数的 NGINX 服务器,如果我重新启动 VM,它 运行 在我登录时没问题, 容器不再活跃,只有当我登录时它才会启动。

此外,如果我注销,容器将停止。

如何在不登录的情况下将容器 运行 作为服务并在注销时保持 运行ning?

您安装的 docker 是什么版本?

在服务器上获取 docker 运行 的过程与在台式机上有很大不同! 它完全基于脚本,如 MS virtualization docs

中的详细描述

windows-server docker EE(企业)服务的可执行文件名称确实是 dockerd,如 linux.

因为为了完成这项工作我经历了很多痛苦,这里有一个解决方案对我有用 运行使用 docker 桌面 linux 容器在 windows 10 个虚拟机上。

首先,阅读 this 页面以了解 运行 将 python 脚本作为 windows 服务的方法。

然后 运行 你的容器使用 powershell 并给它一个名字,例如

docker run --name app your_container

在您运行作为服务的脚本中,例如您的 winservice class 的主要方法,使用 subprocess.call(['powershell.exe', 'path/to/docker desktop.exe]) 在服务中启动 docker 桌面。然后等待docker开始。我使用 docker SDK:

做到了这一点
client = docker.from_env()
started = False
while not started:
    try:
        info = client.info()
        started = True
    except:
        time.sleep(1)

客户端启动后,运行您的应用程序再次使用子进程

subprocess.call(['powershell.exe', 'docker start -interactive app'])

最后通过 ssh 进入您的容器以保持服务和容器处于活动状态

subprocess.check_call(['powershell.exe', 'docker exec -ti app /bin/bash'])

现在使用python service.py install

安装服务

现在您需要在具有本地管理员权限的 VM 上创建一个服务帐户。转到 windows 中的服务,然后在服务列表中找到您的服务。右键单击 -> 属性 -> 登录并在 "This account" 下输入服务帐户详细信息。最后在general下,select automatic(delayed) start 启动服务。

可能不是最 'by the book' 的方法,但它对我有用。

我从 HERE

那里得到了更好的答案

总结就是建立一个Task,在Windows开始时分配给Task Scheduler到运行。

所有脚本都应该在 powershell运行 上

  1. 登录到您希望 Docker 服务自动启动的 windows server/machine。

  2. 在您选择的位置创建一个名为 startDocker.ps1 的文件,并在其中保存以下脚本:

    start-service -Name com.docker.service

    start C:\'Program Files'\Docker\Docker\'Docker Desktop.exe'

验证 Docker.exe 的位置在您的机器上是否正确,否则在脚本中相应地修改它。

  1. 创建一个名为 registerTask 的文件。ps1 并将以下脚本保存在其中。

    $trigger = New-ScheduledTaskTrigger -AtStartup

    $action = New-ScheduledTaskAction -Execute "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Argument "-File C:\PowershellScripts\startDocker.ps1"

    $settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -AllowStartIfOnBatteries

    Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "Start Docker on Start up" -Settings $settings -User "Your user" -Password "Your user password" -RunLevel Highest

这是必需的,以便此用户可以访问 docker 服务

try 
{
    Add-LocalGroupMember -Group docker-users -Member "Your user" -ErrorAction Stop
} 
catch [Microsoft.PowerShell.Commands.MemberExistsException] { }
  1. 修改脚本:您必须根据您的 computer/server.
  2. 更改上面脚本中的一些内容

$action 行中,将 startdocker.ps1 脚本文件的位置更改为您放置此文件的位置。

Register-ScheduledTask 行中,将帐户用户和密码更改为需要在 Windows 启动时启动 Docker 服务的帐户用户。

  1. 执行registerTask。ps1

以管理员身份打开 Windows Powershell,并将当前目录设置为您放置 registerTask.ps1 的位置。例如

cd C:\PewershellScripts\

接下来执行这个脚本如下

.\PowershellScripts\