安装 Docker Windows Server 2019:术语 'docker' 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称

Install Docker Windows Server 2019: the term 'docker' is not recognized as the name of a cmdlet, function, script file, or operable program

尝试在 Windows Server 2019 及以下 these steps 上以进程隔离方式安装 Docker。 (我无法在此服务器上使用 Hyper-V)当 运行在管理员模式下使用 PowerShell。

但是我得到了错误

Get-PackageProvider : A parameter cannot be found that matches parameter name 'ListAvailableget-packagesource'

我也试过了Install-Package -Name docker -ProviderName DockerMsftProvider 然后我得到:

Install-Package : Unable to find package providers (DockerMsftProvider).
At line:1 char:1
+ Install-Package -Name docker -ProviderName DockerMsftProvider
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], E
   xception
    + FullyQualifiedErrorId : UnknownProviders,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

Install-Package : Unable to find package providers (DockerMsftProvider).
At line:3 char:1
+ Install-Package -Name docker -ProviderName DockerMsftProvider
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], E
   xception
    + FullyQualifiedErrorId : UnknownProviders,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

更新 1

我不得不像这样将 PowerShell execution policy 设置为不受限制(在所有这些之后我将其设置回受限 Set-ExecutionPolicy -ExecutionPolicy Restricted):

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

我还不得不暂时禁用 Windows Defender 中的某些防病毒软件/malware protection。对我来说,反恶意软件已经被禁用,所以我还必须禁用实时病毒防护。

然后我可以运行

Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

现在通过 Get-PackageProvider -ListAvailable 我看到 DockerMsftProvider 已安装。

Name                     Version          DynamicOptions
----                     -------          --------------
DockerMsftProvider       1.0.0.8          Update
msi                      3.0.0.0          AdditionalArguments
msu                      3.0.0.0
NuGet                    2.8.5.208        Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag...
PowerShellGet            1.0.0.1          PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, ...
Programs                 3.0.0.0          IncludeWindowsInstaller, IncludeSystemComponent

我运行Install-Package -Name docker -ProviderName DockerMsftProvider然后输入Y.

然后我 运行 Get-Package -Name Docker -ProviderName DockerMsftProvider 得到:

Name                           Version          Source                           ProviderName
----                           -------          ------                           ------------
docker                         20.10.0          DockerDefault                    DockerMsftProvider

当我 运行 Install-Package -Name docker -ProviderName DockerMsftProvider 我没有通过 PowerShell 得到反馈,没有错误,所以我认为它很好。

然而,当我 checked here 和 运行 docker run --isolation=process mcr.microsoft.com/windows/nanoserver:1809 cmd.exe /c ping 127.0.0.1 -t

我收到错误

docker : The term 'docker' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ docker run --isolation=process mcr.microsoft.com/windows/nanoserver:1 ...
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (docker:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

过去我曾尝试安装 Docker Desktop,但后来我将其卸载,因为我的 VPS 不支持 Hyper-V。 我不确定这是否仍然来自该安装或新安装,但我将路径 C:\Program Files\Docker 添加到我的环境 PATH 变量中。

我仍然得到同样的错误

The term 'docker' is not recognized as the name of a cmdlet, function, script file, or operable program.

更新 2

根据@Peter Wishart 的回答,我检查了我的 PATH 系统变量,但是可以在那里看到 Docker(见下面的截图),正如 Peter 也提到的,因为我可以 运行 docker --version 通过命令提示符(不是 PowerShell)安装成功完成。

更新 3
我在 PowerShell 中检查了 ($env:path).Split(";") 并且 Docker 路径在那里:

如何安装 Docker?

我使用脚本安装容器功能并卸载 Windows Defender(n.b。这对您的环境可能安全也可能不安全):

$rebootNeeded = $false
if (-not (Get-WindowsFeature Containers).Installed) {
  $rebootNeeded = $rebootNeeded -or (Install-WindowsFeature -Name Containers).RestartNeeded
}

if ((Get-WindowsFeature Windows-Defender).Installed) {
  $rebootNeeded = $rebootNeeded -or (Uninstall-WindowsFeature Windows-Defender).RestartNeeded
}

if ($rebootNeeded) { throw "Reboot then rerun to complete docker installation" }

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider -Force
Start-Service docker  
docker --version

我提到这一点是为了在没有其他工作时可以选择重置机器...

我认为您的第一个问题是 Get-PackageProvider 步骤中的 copy/paste 错误。

您列出的文件是最新 DockerEE 版本的正确文件。

如果您直接从那里 运行 docker,例如&"C:\Program Files\Docker\docker.exe" --version 并且它不起作用,然后是路径以外的环境问题 - 尝试重新安装 Docker。

如果您重新启动 Powershell 和 运行 ($env:path).Split(";"),唯一的 Docker 条目应该是 C:\Program Files\Docker - 也许有一些来自 Docker 桌面干扰的残留物?

[编辑]

系统路径似乎以一种微妙的方式损坏了(尽管 docker 路径存在且正确)。

我认为如果您仔细检查路径配置and/or 将 docker 路径移动到更靠近路径起点的位置,您应该能够获得永久修复。