日志和故障排除

预计阅读时间: 13分钟

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

Docker成功中心

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

疑难排解

选择鲸鱼菜单 > 故障排除从菜单栏中看到故障排除的选项。

卸载或重置Docker

疑难解答页面包含以下选项:

  • 重新启动Docker Desktop :选择以重新启动Docker Desktop。

  • 运行诊断程序 :选择此选项可诊断Docker桌面上的任何问题。有关诊断的详细信息,请参阅诊断问题,发送反馈和创建GitHub问题

  • 重置磁盘映像 :此选项可重置所有Docker数据, 而无需重置为出厂默认值。选择此选项将导致现有设置丢失。

  • 重置为出厂默认设置 :选择此选项可将Docker桌面上的所有选项重置为初始状态,与首次安装Docker桌面时相同。

  • 卸载 :选择此选项可从系统中删除Docker Desktop。

从命令行卸载Docker Desktop

要从终端上卸载Docker Desktop,请运行: <DockerforMacPath> --uninstall 。如果您的实例安装在默认位置,此命令将提供干净的卸载:

$ /Applications/Docker.app/Contents/MacOS/Docker --uninstall
Docker is running, exiting...
Docker uninstalled successfully. You can move the Docker application to the trash.

例如,如果您发现该应用程序无法正常运行,并且无法从菜单中将其卸载,则可能要使用命令行卸载。

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

应用内诊断

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

选择鲸鱼菜单 > 疑难解答 > 运行诊断

诊断与反馈

诊断可用后,您可以上传它们并获取诊断ID ,与Docker团队进行交流时必须提供该ID 。有关我们有关个人数据的政策的更多信息,请参阅Docker Desktop中如何处理个人数据

具有ID的诊断和反馈

如果单击报告问题 ,这将在Web浏览器中的“新问题”模板中在GitHub上打开Docker Desktop for Mac问题。提交问题之前,请添加详细信息。不要忘记复制/粘贴您的诊断ID。

从终端诊断

在某些情况下,例如当Docker Desktop无法启动时,自行运行诊断很有用。

首先,找到com.docker.diagnose工具。如果您已将Docker Desktop安装在Applications目录中,则其位于/Applications/Docker.app/Contents/MacOS/com.docker.diagnose

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

$ /Applications/Docker.app/Contents/MacOS/com.docker.diagnose gather -upload

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

Diagnostics Bundle: /tmp/B8CF8400-47B3-4068-ADA4-3BBDCE3985D9/20190726143610.zip
Diagnostics ID:     B8CF8400-47B3-4068-ADA4-3BBDCE3985D9/20190726143610 (uploaded)
Diagnostics Bundle: /tmp/BE9AFAAF-F68B-41D0-9D12-84760E6B8740/20190905152051.zip
Diagnostics ID:     BE9AFAAF-F68B-41D0-9D12-84760E6B8740/20190905152051 (uploaded)

诊断ID(此处为BE9AFAAF-F68B-41D0-9D12-84760E6B8740 / 20190905152051)由您的用户ID(BE9AFAAF-F68B-41D0-9D12-84760E6B8740)和时间戳(20190905152051)组成。确保提供完整的诊断ID,而不仅仅是用户ID。

要查看诊断文件的内容,请运行:

$ open /tmp/BE9AFAAF-F68B-41D0-9D12-84760E6B8740/20190905152051.zip

检查日志

除了使用诊断和反馈选项来提交日志外,您还可以自己浏览日志。以下文档是关于macOS 10.12及更高版本的;有关旧版本,请参见旧文档

在终端

要在命令行中观看Docker Desktop日志的实时流,请从您最喜欢的shell运行以下脚本。

$ pred='process matches ".*(ocker|vpnkit).*"
  || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")'
$ /usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred"

或者,要收集文件中日志的最后一天( 1d ),请运行:

$ /usr/bin/log show --debug --info --style syslog --last 1d --predicate "$pred" >/tmp/logs.txt

在控制台应用程序中

Mac提供了一个名为“ Console”的内置日志查看器,可用于检查Docker日志。

控制台位于/Applications/Utilities ;您可以使用Spotlight搜索进行搜索。

要阅读Docker应用程序日志消息,请在控制台窗口搜索栏中键入docker ,然后按Enter。然后选择ANY以展开docker搜索条目旁边的下拉列表,然后选择Process

Mac Console搜索Docker应用

您可以使用控制台日志查询来搜索日志,以各种方式过滤结果以及创建报告。

故障排除

确保证书设置正确

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"

以及在注册表上。例如:

2019/06/20 18:15:30 http: TLS handshake error from 192.168.203.139:52882: tls: client didn't provide a certificate
2019/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

有关使用客户端和服务器端证书的更多信息,请参阅“入门”主题中的“ 添加TLS证书 ”。

如果在安装应用程序后重命名了Mac用户帐户和主文件夹,则Docker Desktop无法启动

如果更改了macOS帐户的名称,请参阅是否需要重新安装Docker桌面?在常见问题解答中。

卷挂载需要/Users以外的任何项目目录的文件共享

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

卷挂载需要位于/Users目录之外的项目的共享驱动器。去鲸鱼菜单 > 首选项 > 资源 > 文件共享,并共享包含Dockerfile和卷的驱动器。

检测到不兼容的CPU

Docker Desktop需要一个处理器(CPU),该处理器支持虚拟化,尤其是Apple Hypervisor框架 。Docker Desktop仅与具有支持Hypervisor框架的CPU的Mac系统兼容。如Apple Hypervisor Framework文档中有关受支持硬件的描述,大多数2010年以后制造的Mac都支持它。

通常,支持具有Intel VT-x功能集(包括扩展页表(EPT)和无限制模式)的计算机。

要检查您的Mac是否支持Hypervisor框架,请在终端窗口中运行以下命令。

sysctl kern.hv_support

如果您的Mac支持Hypervisor Framework,则该命令将显示kern.hv_support: 1

如果不是,该命令将显示kern.hv_support: 0

另请参阅《 Apple文档中的Hypervisor框架参考 》以及Docker Desktop Mac系统要求

常见问题的解决方法

  • 如果Docker Desktop无法在Mac上正确安装或启动:

    • 在安装新版本的应用程序之前,请确保退出Docker桌面( 鲸鱼菜单 > 退出Docker桌面 )。否则,当您尝试将新应用程序从.dmg复制到/Applications时,会出现“正在使用应用程序”错误。

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

    • 从菜单中运行卸载命令。

  • 如果docker命令无法正常运行或未按预期运行,则可能需要取消设置一些环境变量,以确保未在shell或命令窗口中使用旧版Docker Machine环境。取消设置DOCKER_HOST环境变量和相关变量。

  • 如果macOS防火墙设置为“阻止所有传入连接”,则网络连接失败。您可以启用防火墙,但是必须允许bootpd进入连接,以便VM可以获取IP地址。

  • 对于hello-world-nginx示例,必须运行Docker Desktop才能访问http://localhost/上的Web服务器。确保在菜单栏上显示Docker图标,并确保在连接到Docker桌面引擎(而非Toolbox的Engine)的外壳中运行Docker命令。否则,您可能会启动Web服务器容器,但是在转到localhost时出现“网页不可用”错误。有关区分这两种环境的更多信息,请参阅Mac与Docker Toolbox上的Docker桌面

  • 如果看到诸如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

    • 这些错误通常是由Mac上使用这些端口的其他软件引起的。

    • 运行lsof -i tcp:8080以发现另一个进程的名称和pid,并决定是关闭另一个进程还是在docker应用中使用其他端口。

已知的问题

  • Docker桌面尚不支持IPv6。

    提供了一种解决方法,该方法可以自动过滤出DNS服务器列表中的IPv6地址并实现成功的网络访问。例如, 2001:4860:4860::8888将变为8.8.8.8 。要了解更多信息,请在GitHub和Docker Desktop论坛上查看以下问题:

  • 在将docker-compose up与Docker Desktop搭配使用时,您可能会遇到错误( ValueError: Extra Data )。我们已经确定这很可能与一次传递所有数据和/或事件有关,而不是一次一个地传递,因此有时数据会随着2个以上对象的连接而返回并导致错误。

  • 在运行Docker.app从其中强制弹出.dmg可能会导致鲸鱼图标无响应,Docker任务在活动监视器中显示为未响应,并且某些进程会消耗大量CPU资源。重新启动并重新启动Docker以解决这些问题。

  • 即使在Docker中启用了Docker,也不会在登录时自动启动鲸鱼菜单 > 首选项 。这与Docker帮助程序,注册和版本控制的一系列问题有关。

  • Docker Desktop在macOS 10.10 Yosemite及更高版本中使用HyperKit虚拟机管理程序(https://github.com/docker/hyperkit)。如果您正在使用与HyperKit发生冲突的工具(例如英特尔硬件加速执行管理器(HAXM))进行开发 ,则当前的解决方法是不要同时运行它们。使用HyperKit ,可以通过暂时退出Docker Desktop来暂停HyperKit。这使您可以继续使用其他工具并防止HyperKit干扰。

  • 如果您正在使用像Apache Maven这样的应用程序,它们需要对DOCKER_HOSTDOCKER_CERT_PATH环境变量进行设置,请指定这些设置以通过Unix套接字连接到Docker实例。例如:

    export DOCKER_HOST=unix:///var/run/docker.sock
    
  • localunixsocket.local docker-compose 1.7.1对localunixsocket.local执行DNS不必要的查询,在某些网络上可能需要5 localunixsocket.local超时时间。如果docker-compose命令看起来很慢但是在禁用网络时似乎加快了速度,请尝试将127.0.0.1 localunixsocket.local附加到文件/etc/hosts 。或者,您可以使用以下命令在localhost:1234上创建纯文本TCP代理:

    docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:1234:1234 bobrik/socat TCP-LISTEN:1234,fork UNIX-CONNECT:/var/run/docker.sock
    

    然后export DOCKER_HOST=tcp://localhost:1234

  • 使用osxfs绑定安装的目录的性能存在许多问题。特别是,小块的写操作和大目录的遍历当前很慢。此外,执行大量目录操作(例如对大型目录树的重复扫描)的容器可能会遭受性能下降的困扰。以这种方式运行的应用程序包括:

    • 余烬
    • Symfony
    • Magento
    • Zend框架
    • 使用Composervendor文件夹中安装依赖项的PHP应用程序

    作为解决此问题的方法,您可以将供应商或第三方库目录放入Docker卷中,在osxfs挂载之外执行临时文件系统操作,并使用Unison或rsync等第三方工具在容器目录之间进行同步并绑定安装目录。我们正在使用多种不同的技术积极致力于osxfs性能。要了解更多信息,请参阅关于性能问题,解决方案和路线图的主题。

  • 如果您的系统无权访问NTP服务器,则在休眠后,Docker Desktop看到的时间可能与主机不同步。此外,在使用过程中,时间可能会缓慢地偏离同步。要在休眠后手动重置时间,请运行:

    docker run --rm --privileged alpine hwclock -s
    

    或者,要解决这两个问题,可以将本地时钟添加为主机的低优先级(高层次)后备NTP时间源。为此,请编辑主机的/etc/ntp-restrict.conf以添加:

    server 127.127.1.1              # LCL, local clock
    fudge  127.127.1.1 stratum 12   # increase stratum
    

    然后使用以下命令重新启动NTP服务:

    sudo launchctl unload /System/Library/LaunchDaemons/org.ntp.ntpd.plist
    sudo launchctl load /System/Library/LaunchDaemons/org.ntp.ntpd.plist
    
mac故障排除日志问题