日志和故障排除

预计阅读时间: 21分钟

该页面包含有关如何诊断和解决问题,发送日志并与Docker Desktop团队进行通信,使用我们的论坛和Knowledge Hub,在GitHub上浏览和记录问题以及查找已知问题的变通方法的信息。

Docker知识中心

寻找有关Windows的Docker桌面的帮助? 查看Docker Success Center,获取知识库文章,常见问题解答以及各种订阅级别的技术支持。

诊断问题,发送反馈并创建GitHub问题

应用内诊断

如果遇到在本文档中找不到解决方案的问题,请访问GitHub上的Docker Desktop for Windows问题Docker Desktop for Windows论坛 ,我们可以帮助您解决日志数据问题。

选择鲸鱼菜单 >从菜单中进行故障排除

诊断与反馈

启动“ 诊断和反馈”窗口后,它将开始收集诊断。当诊断可用时,您可以上传它们并获取Diagnostic ID ,与Docker团队进行通信时必须提供该ID 。有关我们有关个人数据的政策的更多信息,请参阅Docker Desktop中如何处理个人数据

带有ID的诊断和反馈

如果单击报告问题 ,它将在Web浏览器中的“新问题”模板中在GitHub上打开GitHub上的Windows版Docker桌面,并在提交前完成。不要忘记包含您的诊断ID。

问题模板

从终端诊断

有时,自己运行诊断很有用,例如,如果Docker Desktop for Windows无法启动。

首先找到com.docker.diagnose ,它应该在C:\Program Files\Docker\Docker\resources\com.docker.diagnose.exe

要在Powershell中创建和上传诊断,请运行:

  PS C:\> & "C:\Program Files\Docker\Docker\resources\com.docker.diagnose.exe" gather -upload

诊断完成后,您应该具有以下输出,其中包含您的诊断ID:

Diagnostics Bundle: C:\Users\User\AppData\Local\Temp\CD6CF862-9CBD-4007-9C2F-5FBE0572BBC2\20180720152545.zip
Diagnostics ID:     CD6CF862-9CBD-4007-9C2F-5FBE0572BBC2/20180720152545 (uploaded)

故障排除主题

确保证书设置正确

Docker Desktop会忽略不安全注册表中列出的证书,并且不会将客户端证书发送给它们。尝试从注册表中拉出的命令如docker run会在命令行上生成错误消息,如下所示:

Error response from daemon: Get http://192.168.203.139:5858/v2/: malformed HTTP response "\x15\x03\x01\x00\x02\x02"

以及在注册表上。例如:

2017/06/20 18:15:30 http: TLS handshake error from 192.168.203.139:52882: tls: client didn't provide a certificate
2017/06/20 18:15:30 http: TLS handshake error from 192.168.203.139:52883: tls: first record does not look like a TLS handshake

有关使用客户端和服务器端证书的更多信息,请参见如何添加自定义CA证书? 以及如何添加客户端证书? 在入门主题中。

卷数

共享卷的数据目录上的权限错误

Docker Desktop将共享卷上的权限设置为默认值0777usergroup readwriteexecute权限)。

共享卷上的默认权限不可配置。如果使用的应用程序在容器运行时需要的权限与共享卷默认值不同,则需要使用非主机安装的卷,或者找到一种使应用程序使用默认文件权限的方法。

Docker Desktop当前基于Microsoft SMB协议实现主机安装的卷,该协议不支持对这些权限的细粒度chmod控制。

另请参阅,是否可以针对特定于容器的部署要求更改共享卷上的权限?有关更多解释,请参见FAQ,有关GitHub问题, 控制从共享Windows驱动器传递的目录上的Unix样式的权限

无法在共享驱动器上初始化

当前, inotify在Docker Desktop上不起作用。例如,当应用程序需要跨已安装的驱动器读取/写入容器时,这变得显而易见。建议不要依赖于框架或编程语言的轮询功能,而不必依赖文件系统的inotify。

卷挂载需要Linux容器共享驱动器

如果您使用的是已挂载的卷,并且出现运行时错误指示未找到应用程序文件,拒绝对卷挂载的访问或服务无法启动(例如,使用Docker Compose时) ,则可能需要启用共享驱动器

卷安装需要Linux容器(而不是Windows容器)共享驱动器。请点击鲸鱼菜单然后设置 > 共享驱动器,并共享包含Dockerfile和卷的驱动器。

验证域用户是否具有共享驱动器(卷)的权限

提示 :只有批量安装Linux容器而不是Windows容器才需要共享驱动器。

访问共享驱动器的权限与您用来设置共享驱动器的用户名和密码有关。如果以与用于设置共享驱动器的用户名不同的用户名运行docker命令和任务,则您的容器没有访问已装载卷的权限。卷显示为空。

解决方案是切换到域用户帐户并重置共享驱动器上的凭据。

在您以本地用户而不是域用户共享C驱动器的情况下,这是如何调试此问题的示例。假设本地用户是samstevens ,域用户是merlin

  1. 确保您以Windows域用户身份登录(对于我们的示例merlin )。

  2. 运行net share c以查看<host>\<username>, FULL用户权限。

    > net share c
    
    Share name        C
    Path              C:\
    Remark
    Maximum users     No limit
    Users             SAMSTEVENS
    Caching           Caching disabled
    Permission        windowsbox\samstevens, FULL
    
  3. 运行以下命令以删除共享。

    > net share c /delete
    
  4. 通过“ 共享驱动器”对话框重新共享驱动器 ,并提供Windows域用户帐户凭据。

  5. 重新运行net share c

    > net share c
    
    Share name        C
    Path              C:\
    Remark
    Maximum users     No limit
    Users             MERLIN
    Caching           Caching disabled
    Permission        windowsbox\merlin, FULL
    

另请参阅GitHub上的相关问题, 容器中的已安装卷为空

从主机路径进行卷安装使用nobrl选项覆盖数据库锁定

您可能会在主机上使用卷挂载时遇到问题,具体取决于数据库软件和启用了哪些选项。适用于Windows的Docker桌面使用SMB / CIFS协议挂载主机路径,并使用nobrl选项挂载它们,以防止将锁定请求发送到数据库服务器( docker / for-win#11docker / for-win#694 ) 。这样做是为了确保容器访问主机共享的数据库文件。尽管它解决了网络上的数据库访问问题,但这种“解锁”策略可能会干扰数据库功能的其他方面(例如,使用docker / for-win#1886中所述的使用SQLite的预写日志记录(WAL)) )。

如果可能,请避免使用共享驱动器在具有网络路径的主机上进行卷挂载,而应在MobyVM上挂载,或创建数据卷 (命名卷)或数据容器 。另请参阅服务配置下卷密钥和撰写文件文档中的卷配置参考

本地安全策略可能会阻止共享驱动器并导致登录错误

您需要具有安装共享驱动器的权限才能使用Docker Desktop for Windows 共享驱动器功能。

如果本地策略阻止了此情况,则尝试在Docker上启用共享驱动器时会出错。Docker无法解决此问题,因为您确实需要这些权限才能使用该功能。

以下是示例错误消息的摘录:

Logon failure: the user has not been granted the requested logon type at
this computer.

[19:53:26.900][SambaShare     ][Error  ] Unable to mount C drive: mount
error(5): I/O error Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount: mounting //10.0.75.1/C on /c failed: Invalid argument

另请参阅Docker for Windows问题#98

符号链接在容器内部和容器之间工作。但是,在容器外部(例如,在主机上)创建的符号链接不起作用。要了解更多信息,请参阅支持符号链接吗? 在常见问题解答中。

避免意外的语法错误,对容器中的文件使用Unix样式行结尾

任何要在容器中运行的文件都必须使用Unix样式\n行尾。这包括在命令行中针对构建和Docker文件中的RUN命令引用的文件。

Docker容器和docker build在Unix环境中运行,因此容器中的文件必须使用Unix样式行结尾: \n而不是 Windows样式: \r\n 。使用Windows工具创作诸如Shell脚本之类的文件时,请牢记这一点,其中默认可能是Windows样式行的结尾。这些命令最终传递给基于Unix的容器内的Unix命令(例如,传递给/bin/sh的shell脚本)。如果使用Windows样式行结尾,则docker run失败,并出现语法错误。

有关此问题和解决方案的示例,请参阅GitHub上的此问题: Docker RUN无法执行shell脚本

虚拟化

为了使Docker Desktop正常运行,您的机器必须具有以下功能:

  1. Hyper-V已安装且正在运行

  2. 启用虚拟化

超V

Docker Desktop需要安装和启用Hyper-V以及Windows Powershell的Hyper-V模块。Docker Desktop安装程序会为您启用它。

Docker Desktop还需要两个CPU硬件功能才能使用Hyper-V:虚拟化和二级地址转换(SLAT),也称为快速虚拟化索引(RVI)。在某些系统上,必须在BIOS中启用虚拟化。所需步骤是特定于供应商的,但通常将BIOS选项称为Virtualization Technology (VTx)或类似的东西。运行命令systeminfo以检查所有必需的Hyper-V功能。有关更多详细信息,请参见Windows 10上Hyper-V的先决条件

要手动安装Hyper-V,请参阅在Windows 10上安装Hyper-V 。安装后需要重新启动。如果您在不重新引导的情况下安装Hyper-V,则Docker Desktop无法正常工作。

在开始菜单中,键入“ 打开或关闭Windows功能” ,然后按Enter。在随后的屏幕中,验证是否已启用Hyper-V:

Windows上的Hyper-V功能

Docker机器的Hyper-V驱动程序

Docker Desktop安装包括旧版工具Docker Machine,该工具使用旧的boot2docker.isoMicrosoft Hyper-V驱动程序来创建本地虚拟机。这与使用Docker Desktop有关 ,但如果要使用Docker Machine创建多个本地虚拟机(VM)或配置远程计算机,请参阅Docker Machine主题。仅针对在Windows上寻找有关Docker Machine的信息的用户记录此文档,这要求启用Hyper-V,外部网络开关处于活动状态,并在Docker Machine驱动程序中所述的docker docker-machine create命令的标志中进行引用例子

必须启用虚拟化

Hyper-V外 ,还必须启用虚拟化。检查任务管理器上的“性能”选项卡:

任务管理器

如果您手动卸载Hyper-V或禁用虚拟化,则Docker Desktop无法启动。请参阅无法在Windows 10企业版上为Windows运行Docker

安装Windows的Docker桌面时的网络和WiFi问题

有些用户可能会在Docker Desktop的安装和启动过程中遇到网络问题。例如,在安装或自动重新启动时,网络适配器和/或WiFi可能会被禁用。在某些情况下,问题是由于仍安装VirtualBox或其网络适配器引起的,但在其他情况下则并非如此。请参阅GitHub问题启用Hyper-V功能可关闭wi-fi

如果遇到类似的问题,请执行以下步骤:

  1. 确保已启用虚拟化 ,如上面虚拟化中所述。

  2. 确保Hyper-V的安装并启用,如上文中所描述的Hyper-V必须启用

  3. 通过检查Hyper-V管理器右侧的“操作”选项卡上的“ 虚拟交换机管理器” ,确保已启用DockerNAT

    Hyper-V经理

  4. 设置一个外部网络交换机。如果您计划在任何时候使用Docker Machine设置多个本地VM,则仍然需要这样做,如Docker MachineHyper-V驱动程序主题中所述。您可以使用此开关替换DockerNAT

  5. 如果前面的步骤不能解决问题,请按照“ 清理自述文件”中的步骤进行操作。

    在运行Windows清理脚本之前,请阅读完整的说明。

    cleanup命令有两个标志-Cleanup-ForceDeleteAllSwitches 。在运行任何脚本之前,请阅读整个页面,尤其是有关-ForceDeleteAllSwitches警告。{: 。警告}

Windows容器和Windows Server

Windows Server不支持Docker Desktop。相反,您可以免费使用Docker Enterprise Basic

如果您对如何在Windows 10上运行Windows容器有疑问,请参阅在Windows和Linux容器之间切换

完整的教程可从docker / labs中的Windows容器入门中获得

您可以安装本机Windows二进制文件,该二进制文件允许您在没有Docker Desktop的情况下开发和运行Windows容器。但是,如果以这种方式安装Docker,则无法开发或运行Linux容器。如果尝试在本机Docker守护程序上运行Linux容器,则会发生错误:

C:\Program Files\Docker\docker.exe:
 image operating system "linux" cannot be used on this platform.
 See 'C:\Program Files\Docker\docker.exe run --help'.

Windows容器对localhost和已发布端口的限制

Windows的Docker桌面提供了切换Windows和Linux容器的选项。如果您使用的是Windows容器,请记住由于Windows NAT(WinNAT)的当前实现,在网络方面存在一些限制。随着Windows容器项目的发展,这些限制可能会解决。

Windows容器与localhost上已发布的端口一起使用,从Windows 10 1809开始使用Docker Desktop for Windows以及Windows Server 2019/1809使用Docker EE。

如果您使用的是Windows 10 18.09之前的版本,则Windows容器上已发布的端口会存在环回本地主机的问题。您只能使用容器的IP和端口从主机访问容器端点。在Windows 10 18.09 ,容器可与localhost上已发布的端口一起使用。

因此,在使用Docker拉取映像并使用以下命令运行Web服务器的情况下:

> docker run -d -p 80:80 --name webserver nginx

使用curl http://localhost或将Web浏览器指向http://localhost ,不会显示nginx网页(与Linux容器一样)。

要从本地主机访问Windows容器,您需要为运行服务的容器指定IP地址和端口。

您可以通过使用带有某些--format选项的docker inspect和容器的ID或名称来获取容器的IP地址。对于上面的示例,命令看起来像这样,使用我们给容器指定的名称( webserver )而不是容器ID:

$ docker inspect \
  --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
  webserver

这为您提供了容器的IP地址,例如:

$ docker inspect \
  --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
  webserver

172.17.0.2

现在,您可以使用http://172.17.0.2:80 (或简单地为http://172.17.0.2 ,因为端口80是默认的HTTP端口)连接到Web服务器。

有关更多信息,请参见:

在嵌套虚拟化方案中运行Docker Desktop

Docker Desktop可以在Windows 10 VM内运行,只要该VM正确配置,该Windows 10 VM即可在Mac上的Parallels或VMware Fusion等应用程序上运行。但是,由于这些应用程序虚拟化硬件的方式,仍然可能会出现问题和间歇性故障。由于这些原因, 嵌套虚拟化方案中不支持Docker Desktop 。在某些情况下可能会起作用,而在另一些情况下则不会。

为了获得最佳结果,我们建议您在Windows系统上本地运行Docker Desktop(以使用Windows或Linux容器),或者在Mac上本地运行Docker Desktop,以使用Linux容器。

如果您仍然想使用嵌套虚拟化

  • 确保在VMWare或Parallels中启用了嵌套虚拟化支持。检查“ 硬件”>“ CPU和内存”>“高级选项”>“启用嵌套虚拟化”中的设置 (确切的菜单顺序可能会略有不同)。

  • 为您的VM配置至少2个CPU和足够的内存以运行您的工作负载。

  • 确保系统或多或少处于空闲状态。

  • 确保您的Windows操作系统是最新的。一些内部人员构建存在多个问题。

  • 您所拥有的处理器也可能是相关的。例如,与基于Nehalem的Mac Pro相比,基于Westmere的Mac Pro具有其他一些硬件虚拟化功能,新一代的Intel处理器也是如此。

嵌套虚拟化带来的典型故障

  • Linux VM的启动时间慢。如果您在日志中查找并找到一些前缀为Moby条目。在实际的硬件上,启动Linux VM需要5到10秒钟。从Connected日志条目到* Starting Docker ... [ ok ]日志条目之间的大致时间。如果您在Windows VM内启动Linux VM,这可能会花费更长的时间。我们有60秒左右的超时时间。如果此时尚未启动VM,我们将重试。如果重试失败,我们将打印错误。您有时可以通过为Windows VM提供更多资源来解决此问题。

  • 有时,当Linux尝试校准时间戳计数器(TSC)时,VM无法启动。此过程对时间非常敏感,并且在内部运行于VM的VM中执行时可能会失败。 CPU利用率也可能更高。

  • 确保在Mac上的Parallels中已关闭“ PMU虚拟化”。检查“ 硬件”>“ CPU和内存”>“高级设置”>“ PMU虚拟化”中的设置

Docker for Windows版本267上GitHub上的讨论线程。

网络问题

一些用户报告了在Docker Desktop稳定版本上连接到Docker Hub的问题。(请参阅GitHub第22567版)

这是示例命令和错误消息:

> docker run hello-world

Unable to find image 'hello-world:latest' locally
Pulling repository docker.io/library/hello-world
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error while pulling image: Get https://index.docker.io/v1/repositories/library/hello-world/images: dial tcp: lookup index.docker.io on 10.0.75.1:53: no such host.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

作为此问题的立即解决方法,将DNS服务器重置为使用Google DNS固定地址: 8.8.8.8 。您可以通过设置进行配置

网络对话框,如主题网络中所述 。应用此设置时,Docker会自动重启,这可能需要一些时间。

NAT / IP配置

默认情况下,Docker Desktop使用内部网络前缀10.0.75.0/24 。如果这与您的常规网络设置冲突,则可以从“ 设置”菜单更改前缀。请参阅“ 设置”下的 网络”主题。

解决方法

inotify当前在Docker桌面上不起作用

如果您将Node.jsnodemon一起使用,则临时解决方法是尝试使用此处所述的后备轮询模式: nodemon不会重新启动node应用程序 。另请参见GitHub 上的此问题Inotify在共享驱动器上不起作用

重启

重新启动PC,以停止/丢弃从先前安装的版本运行的守护程序的所有痕迹。

取消设置DOCKER_HOST

不需要设置DOCKER_HOST环境变量。如果使用bash,请使用命令unset ${!DOCKER_*}取消设置。对于其他外壳,请查阅外壳的文档。

确保Docker正在运行以获取Web服务器示例

对于hello-world-nginx示例及其他示例,必须运行Docker Desktop才能访问http://localhost/上的Web服务器。确保在菜单栏中显示Docker鲸鱼,并确保在连接到Docker桌面引擎(不是Toolbox的Engine)的外壳中运行Docker命令。否则,您可能会启动Web服务器容器,但在转到docker时收到“网页不可用”错误。

如何解决port already allocated错误

如果看到诸如Bind for 0.0.0.0:8080 failed: port is already allocated类的错误Bind for 0.0.0.0:8080 failed: port is already allocatedlisten tcp:0.0.0.0:8080: bind: address is already in use ...

这些错误通常是由Windows上使用这些端口的某些其他软件引起的。要发现此软件的身份,请使用resmon.exe GUI并单击“网络”,然后单击“侦听端口”,或者在Powershell中使用netstat -aon | find /i "listening "以查找当前使用该端口的进程的PID(PID是最右列中的数字)。确定是关闭其他进程还是在Docker应用中使用其他端口。

安装了防火墙或防病毒软件后,Docker无法启动

某些防火墙和防病毒软件可能与Microsoft Windows 10版本 (例如Windows 10周年更新)不兼容。该冲突通常在Windows更新或防火墙的新安装之后发生,并表现为Docker守护程序的错误响应和Docker Desktop启动失败 。Comodo防火墙是此问题的一个示例,但是用户报告说,此后该软件已更新为可与这些Windows 10版本一起使用。

请参阅Comodo论坛主题“ Comodo防火墙与Hyper-V的冲突Windows 10周年纪念版本不允许安装Comodo驱动程序” 。Docker桌面用户创建的问题专门描述了与Docker相关的问题: Docker无法在Windows 10上启动

对于临时的解决方法,请卸载防火墙或防病毒软件,或者浏览论坛上建议的其他解决方法。

Windows故障排除日志问题