换了一家公司,新公司的网络环境只支持Windows,于是从Mac切换到了Windows。由此遇到了很多很多的问题,在此记录一些比较典型的问题。
问题背景
每一次重启电脑,Docker重新打开时,都会失败,具体表现为Docker界面显示Docker Engine stopped,右下角Docker的小图标则显示为一个鲸鱼不停的跳动,为加载状态,此时如果点击退出也会卡住,只能通过任务管理器的形式杀掉Docker进程。在第一次杀掉Docker进程后,后续启动都能成功。

由于比较忙的原因,每次我都是直接杀掉Docker进程再重新启动,以此来快速解决这个问题。偶然的情况下,我发现在【网络和Intel设置 - 高级设置】菜单中,禁用当前网卡再重启,Docker也随之完成了启动,即使当前界面显示的是Docker is stopped。
由此,初步判断,问题原因应该是Windows下有线网/无线网/WSL/Hyper-V等杂乱的网络配置导致Docker的网络判断逻辑失败。
最近有了一些空闲,准备腾出手好好解决这个问题。
解决方案
遇到软件问题,首先要想办法排查日志的问题。
查看Docker日志
Docker日志的路径在C:\Users\你的用户名\AppData\Local\Docker\log路径下,可以在PowerShell中使用命令code $Env:LOCALAPPDATA\Docker\log使用vscode快速打开log文件夹。
可以在文件夹中看到很多的日志文件,我将它们大体整理了一下(整理过程可见附录),得到的结果如下:
各目录的主要作用:
| 目录 | 作用说明 |
|---|---|
| host | Windows 主机侧组件的日志。主要记录Docker Desktop 应用程序自身(Electron UI、后台守护进程、代理进程、VPNKit、扩展框架等)的运行情况。 |
| vm | LinuxKit VM / WSL2 内部日志。相当于 Docker Desktop 启动的轻量 Linux 虚拟机,里面跑的就是dockerd、containerd、网络、DNS、时间同步等核心服务。如果 Docker Daemon 没起来,关键日志在这里。 |
| host\electron-crash-reports | Docker Desktop的UI层使用了electron框架,这个文件夹中就存放electron框架错误日志。 |
host目录下各日志文件的作用:
| 文件名 | 作用 |
|---|---|
.327f22648f3979bb4480e4e0a1189d37a8110fb3-audit.json |
审计事件记录,用于追溯设置变更或关键操作。 |
com.docker.admin.exe.log |
记录与 Docker Desktop 管理员权限相关的操作。 |
com.docker.backend.exe.log |
核心后端服务日志,负责协调虚拟机、WSL、文件共享和网络等。这是首次启动失败或核心功能异常时首要的排查文件。 |
com.docker.build.exe.stdout.log / stderr.log |
记录镜像构建过程中的标准输出和错误输出。在镜像构建失败或卡住时应查看。 |
com.docker.dev-envs.exe.stdout.log / stderr.log |
记录 Docker 开发环境(Dev Environments)功能的标准输出和错误输出。在创建或同步开发环境时遇到问题可查看。 |
com.docker.diagnose.exe.log |
诊断工具日志,用于记录在运行 Troubleshoot 或打包诊断包时的自检结果和问题。 |
com.docker.extensions.exe.log / stdout.log / stderr.log |
记录 Docker 扩展框架的日志,包括标准输出和错误输出。扩展安装或运行失败时需检查。 |
com.docker.proxy.exe.log / stdout.log / stderr.log |
主机与虚拟机/WSL 之间的网络代理进程日志,处理 API 和端口转发。网络不通或守护进程通信失败时,这些文件提供重要线索。 |
com.docker.wsl-distro-proxy.exe.log |
记录与 WSL 发行版通信的代理日志。WSL 启动缓慢或出现异常时,可在此处找到线索。 |
Docker Desktop.exe.stdout.log / stderr.log |
Docker Desktop GUI 主程序的标准输出和错误输出。若界面白屏、无法打开或交互异常,可查看。 |
docker.exe.stdout.log / stderr.log |
记录 Docker 命令行工具(CLI)的标准输出和错误输出。 |
electron-*.log |
记录基于 Electron 框架的 GUI 界面运行日志,按时间滚动。用于排查界面崩溃、渲染异常或与后端通信失败的问题。 |
httpproxy.log |
记录内置 HTTP 代理的日志。若扩展市场加载失败或内置 API 调用超时,可在此处查看。 |
ipc.stacks.log |
记录进程间通信(IPC)的堆栈快照,通常在检测到死锁或阻塞时生成。可用于排查应用卡死的问题。 |
monitor.log |
记录后台健康监控和“看门狗”服务日志。若核心组件反复崩溃并重启,此处会记录重启的原因和次数。 |
vpnkit-bridge.exe.log / stdout.log / stderr.log |
记录 VPNKit 网络桥的日志,负责容器的 NAT、DNS 和端口映射。当容器网络出现问题时,这是主要排查文件。 |
vm目录下各文件的作用:
| 文件名 | 作用 |
|---|---|
01-docker.log* |
记录 Docker 服务在 VM 启动初期的运行情况(init 阶段的 docker 日志)。 |
acpid*.log |
ACPI 电源管理相关日志,记录关机、休眠、设备电源事件。 |
allowlist.log |
管理和校验 VM 内允许的组件或访问规则。 |
artifactory.out.log |
与内部仓库/依赖缓存相关的服务日志。 |
binfmt*.log |
Linux binfmt_misc 机制日志,用于在 VM 内运行多架构镜像。 |
container-filesystem*.log |
容器文件系统的挂载、检测与错误记录。 |
containerd*.log |
Containerd 守护进程日志,管理容器生命周期。 |
devenv-service*.log |
开发环境辅助服务日志,相关功能启动/停止记录。 |
devenv.log |
开发环境相关操作记录。 |
diagnosticsd*.log |
Docker Desktop 的诊断服务日志。 |
dns-forwarder*.log |
VM 内 DNS 转发服务日志。 |
dns.log |
DNS 解析结果和错误日志。 |
docker*.log |
Docker 守护进程核心日志,记录容器与镜像管理。 |
dockerd.log |
Dockerd 守护进程单独日志,容器运行核心进程。 |
http-proxy.log |
VM 内 HTTP 代理服务日志,常用于拉取镜像时的代理转发。 |
init.log |
VM 初始化过程日志。 |
kmsg*.log |
Linux 内核消息缓冲区日志,系统级事件(驱动、内核警告)。 |
memlogd.log |
内存日志管理,可能是轻量级日志收集服务。 |
nat*.log |
VM 内 NAT 网络转发日志。 |
nfs-common*.log |
NFS 文件共享相关日志。 |
onboot.*.log |
VM 启动阶段的初始化任务日志,涵盖 sysctl、元数据、服务启动、网络配置等。 |
procd*.log |
进程管理服务日志,类似 init/systemd。 |
rpcbind*.log |
RPC 端口映射服务日志,文件共享和远程调用相关。 |
sntpc*.log |
SNTP 时间同步日志。 |
socks*.log |
SOCKS5 代理日志。 |
stargz-snapshotter.log |
stargz 快速镜像分层加载器日志。 |
syn-filter.log |
TCP SYN 过滤日志,网络安全相关。 |
trim-after-delete.log |
磁盘空间回收(TRIM 操作)相关日志。 |
volume-contents*.log |
容器卷挂载内容的检查与日志。 |
vpnkit-forwarder.log |
VPNKit 网络转发服务日志。 |
vpnkit-tap-vsockd.log |
VPNKit TAP/VSock 守护进程日志,处理 VM 与宿主机之间的网络通信。 |