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

55ooxyrt  于 2023-05-22  发布在  Docker
关注(0)|答案(3)|浏览(375)

我在Windows Server 2016的虚拟机中安装了Docker。
我有一个来自Python3的Linux容器,带有使用--restart=always参数的NGINX服务器,当我登录时它运行良好,如果我重新启动VM,容器不再活动,只有当我登录时它才启动。
如果我注销,容器也会停止。

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

cngwdvgl

cngwdvgl1#

我从HERE那里得到了一个更好的答案
摘要是构建一个任务并将其分配给Task Scheduler以在Windows启动时运行。

所有脚本都需要在powershell上运行

1.登录到您希望自动启动Docker服务的Windows服务器/计算机。
1.在您选择的位置创建一个名为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

# 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] { }

1.修改脚本:您将不得不根据您的计算机/服务器更改上面脚本中的一些内容。
$action行中,将startdocker.ps1脚本文件的位置更改为您放置该文件的位置。
Register-ScheduledTask行中,将帐户用户和密码更改为需要在Windows启动时启动Docker服务的帐户用户。
1.执行registerTask.ps1
以管理员身份打开Windows Powershell,并将当前目录设置为放置registerTask.ps1的位置。举个例子

cd C:\PewershellScripts\

接下来按如下所示执行此脚本

.\registerTask.ps1
aydmsdu9

aydmsdu92#

因为我经历了很多痛苦,为了使这个工作,这里有一个解决方案,为我运行一个linux容器使用docker桌面在windows 10虚拟机上工作。
首先,阅读this页面,了解将python脚本作为windows服务运行的方法。
然后使用powershell运行你的容器,并给予它一个名字,例如

docker run --name app your_container

在作为服务运行的脚本中,例如winservice类的main方法,使用subprocess.call(['powershell.exe', 'path/to/docker desktop.exe])在服务中启动docker desktop。然后等待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中的服务,并在服务列表中找到您的服务。右键单击-> properties -> Log On并在“This account”下输入服务帐户详细信息。最后,在常规下,选择自动(延迟)启动并启动服务。
可能不是最“按书”的方法,但它对我有效。

db2dz4w8

db2dz4w83#

你安装了哪个版本的docker?
在服务器上运行Docker的过程与在桌面上运行非常不同!它完全基于脚本,如MS virtualization docs
Windows服务器docker EE(企业)服务的可执行名称实际上与Linux中的dockerd一样。

相关问题