我在Windows Server 2016的虚拟机中安装了Docker。我有一个来自Python3的Linux容器,带有使用--restart=always参数的NGINX服务器,当我登录时它运行良好,如果我重新启动VM,容器不再活动,只有当我登录时它才启动。如果我注销,容器也会停止。
--restart=always
如何让容器在不登录的情况下作为服务运行,并在注销时保持运行?
cngwdvgl1#
我从HERE那里得到了一个更好的答案摘要是构建一个任务并将其分配给Task Scheduler以在Windows启动时运行。
Task Scheduler
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的位置。举个例子
$action
startdocker.ps1
Register-ScheduledTask
registerTask.ps1
cd C:\PewershellScripts\
接下来按如下所示执行此脚本
.\registerTask.ps1
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:
subprocess.call(['powershell.exe', 'path/to/docker desktop.exe])
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”下输入服务帐户详细信息。最后,在常规下,选择自动(延迟)启动并启动服务。可能不是最“按书”的方法,但它对我有效。
python service.py install
db2dz4w83#
你安装了哪个版本的docker?在服务器上运行Docker的过程与在桌面上运行非常不同!它完全基于脚本,如MS virtualization docsWindows服务器docker EE(企业)服务的可执行名称实际上与Linux中的dockerd一样。
3条答案
按热度按时间cngwdvgl1#
我从HERE那里得到了一个更好的答案
摘要是构建一个任务并将其分配给
Task Scheduler
以在Windows启动时运行。所有脚本都需要在powershell上运行
1.登录到您希望自动启动Docker服务的Windows服务器/计算机。
1.在您选择的位置创建一个名为startDocker.ps1的文件,并在其中保存以下脚本:
验证Docker.exe在计算机上的位置是否正确,否则在脚本中进行相应修改。
1.创建一个名为registerTask.ps1的文件,并在其中保存以下脚本。
1.修改脚本:您将不得不根据您的计算机/服务器更改上面脚本中的一些内容。
在
$action
行中,将startdocker.ps1
脚本文件的位置更改为您放置该文件的位置。在
Register-ScheduledTask
行中,将帐户用户和密码更改为需要在Windows启动时启动Docker服务的帐户用户。1.执行registerTask.ps1
以管理员身份打开Windows Powershell,并将当前目录设置为放置
registerTask.ps1
的位置。举个例子接下来按如下所示执行此脚本
aydmsdu92#
因为我经历了很多痛苦,为了使这个工作,这里有一个解决方案,为我运行一个linux容器使用docker桌面在windows 10虚拟机上工作。
首先,阅读this页面,了解将python脚本作为windows服务运行的方法。
然后使用powershell运行你的容器,并给予它一个名字,例如
在作为服务运行的脚本中,例如winservice类的main方法,使用
subprocess.call(['powershell.exe', 'path/to/docker desktop.exe])
在服务中启动docker desktop。然后等待docker启动。我使用Docker SDK:客户端启动后,再次运行带有子进程的应用
最后,将ssh放入容器中,以保持服务和容器处于活动状态
现在使用
python service.py install
安装服务现在,您需要在VM上创建一个具有本地管理员权限的服务帐户。转到Windows中的服务,并在服务列表中找到您的服务。右键单击-> properties -> Log On并在“This account”下输入服务帐户详细信息。最后,在常规下,选择自动(延迟)启动并启动服务。
可能不是最“按书”的方法,但它对我有效。
db2dz4w83#
你安装了哪个版本的docker?
在服务器上运行Docker的过程与在桌面上运行非常不同!它完全基于脚本,如MS virtualization docs
Windows服务器docker EE(企业)服务的可执行名称实际上与Linux中的dockerd一样。