Docker Windows 如何在不登录的情况下保持容器运行?

Ale*_*dor 8 windows-server docker

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

我有一个来自 Python3 的 Linux 容器,带有使用--restart=always参数的 NGINX 服务器,它在我登录时运行良好,如果我重新启动虚拟机,该容器将不再活动,并且仅在我登录时启动。

另外,如果我注销,容器就会停止。

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

mam*_*ius 6

我从这里得到了更好的答案

摘要是构建一个任务并将其分配给Task Scheduler在 Windows 启动时运行。

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

  1. 登录到您希望自动启动 Docker 服务的 Windows 服务器/计算机。

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

start-service -Name com.docker.service
start C:\'Program Files'\Docker\Docker\'Docker Desktop.exe'
Run Code Online (Sandbox Code Playgroud)

验证 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

# This is needed so that this user has access to docker services
try 
{
    Add-LocalGroupMember -Group docker-users -Member "Your user" -ErrorAction Stop
} 
catch [Microsoft.PowerShell.Commands.MemberExistsException] { }
Run Code Online (Sandbox Code Playgroud)
  1. 修改脚本:您必须根据您的计算机/服务器更改上述脚本中的一些内容。

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

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

  1. 执行registerTask.ps1

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

cd C:\PewershellScripts\
Run Code Online (Sandbox Code Playgroud)

接下来执行这个脚本如下

.\registerTask.ps1
Run Code Online (Sandbox Code Playgroud)


小智 3

由于我为了完成这项工作经历了相当多的痛苦,因此这里有一个适合我的解决方案,可以在 Windows 10 虚拟机上使用 docker 桌面运行 Linux 容器。

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

然后使用 powershell 运行容器并为其命名,例如

docker run --name app your_container
Run Code Online (Sandbox Code Playgroud)

在作为服务运行的脚本中,例如 winservice 类的 main 方法,用于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)
Run Code Online (Sandbox Code Playgroud)

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

subprocess.call(['powershell.exe', 'docker start -interactive app'])
Run Code Online (Sandbox Code Playgroud)

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

subprocess.check_call(['powershell.exe', 'docker exec -ti app /bin/bash'])
Run Code Online (Sandbox Code Playgroud)

现在使用安装服务python service.py install

现在,您需要在具有本地管理员权限的虚拟机上创建一个服务帐户。转到 Windows 中的“服务”,然后在服务列表中找到您的服务。右键单击 -> 属性 -> 登录,然后在“此帐户”下输入服务帐户详细信息。最后,在常规下,选择自动(延迟)启动并启动服务。

可能不是最“按书本”的方法,但它对我有用。