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运行 上
登录到您希望 Docker 服务自动启动的 windows server/machine。
在您选择的位置创建一个名为 startDocker.ps1 的文件,并在其中保存以下脚本:
start-service -Name com.docker.service
start C:\'Program Files'\Docker\Docker\'Docker Desktop.exe'
验证 Docker.exe 的位置在您的机器上是否正确,否则在脚本中相应地修改它。
创建一个名为 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] { }
- 修改脚本:您必须根据您的 computer/server.
更改上面脚本中的一些内容
在 $action
行中,将 startdocker.ps1
脚本文件的位置更改为您放置此文件的位置。
在 Register-ScheduledTask
行中,将帐户用户和密码更改为需要在 Windows 启动时启动 Docker 服务的帐户用户。
- 执行registerTask。ps1
以管理员身份打开 Windows Powershell,并将当前目录设置为您放置 registerTask.ps1
的位置。例如
cd C:\PewershellScripts\
接下来执行这个脚本如下
.\PowershellScripts\
我在 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运行 上
登录到您希望 Docker 服务自动启动的 windows server/machine。
在您选择的位置创建一个名为 startDocker.ps1 的文件,并在其中保存以下脚本:
start-service -Name com.docker.service
start C:\'Program Files'\Docker\Docker\'Docker Desktop.exe'
验证 Docker.exe 的位置在您的机器上是否正确,否则在脚本中相应地修改它。
创建一个名为 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] { }
- 修改脚本:您必须根据您的 computer/server. 更改上面脚本中的一些内容
在 $action
行中,将 startdocker.ps1
脚本文件的位置更改为您放置此文件的位置。
在 Register-ScheduledTask
行中,将帐户用户和密码更改为需要在 Windows 启动时启动 Docker 服务的帐户用户。
- 执行registerTask。ps1
以管理员身份打开 Windows Powershell,并将当前目录设置为您放置 registerTask.ps1
的位置。例如
cd C:\PewershellScripts\
接下来执行这个脚本如下
.\PowershellScripts\