咱们直接说正事Docker 装完之后到底怎么确认它是真的能用了很多人在 Mac 上装完 Docker Desktop看到小鲸鱼图标起来了就以为万事大吉。但“装完”和“能用”之间还隔着一整套验证流程。我自己见过太多案例图标亮着但docker run一执行就报错或者容器起半天起不来甚至启动之后网络不通最后排查一圈才发现是安装残留或资源分配的问题。这篇博文就围绕 Mac 系统上 Docker 安装完成后的验证这件事展开把我平时在真实环境里会做的检查项、命令、判断标准都整理出来。不管你用的是 Apple Silicon 还是 Intel 芯片是刚入门还是想系统查一遍都可以照着我这套流程走一遍把环境彻底摸透。1. 安装后为什么要单独做验证先搞懂 Mac 上 Docker 的特殊性先说个很多人都忽略的背景。Docker 在 Linux 上是直接跑在宿主机内核里的容器和系统共享同一个内核。但 Mac 不行macOS 的内核不是 LinuxDocker 容器必须依赖一个轻量级 Linux 虚拟机来运行。Docker Desktop 在 Mac 上的本质就是帮你启动了一个隐藏的 Linux VM所有容器都跑在这个 VM 里面而不是直接跑在你的 Mac 上。这个架构差异带来两个直接影响。第一你在 Mac 上敲docker ps看到的是 Linux VM 里的容器列表不是 Mac 的进程。第二验证 Docker 是否正常不能只看 Mac 上的应用图标必须确认这个 Linux VM 是否正常工作以及 CLI 工具能否和它正常通信。所以我把安装后的验证拆成了三个层次CLI 工具层命令行能不能用、引擎层容器能不能创建和运行、网络与资源层端口映射、磁盘、内存是否正常。三个层次全部通过才能说这台 Mac 的 Docker 环境是健康的。验证的最佳时机是刚装完、还没开始跑业务项目的时候。这时候环境干净出问题容易定位。如果等到项目都已经跑起来了再排查容器、镜像、网络混在一起光定位问题就够折腾半天。2. 安装后的第一波基础验证CLI 与引擎状态2.1 验证 Docker CLI 可用先看docker version打开终端敲docker version。这个命令会分别显示 Client 和 Server 两部分信息。正常情况下你会看到类似这样的输出Client: Cloud integration: v1.0.35desktop.13 Version: 27.2.0 API version: 1.47 Go version: go1.22.7 Git commit: 3ab5c7d Installed: Mon Oct 14 10:23:45 2024 OS/Arch: darwin/arm64 Server: Engine: Version: 27.2.0 API version: 1.47 (minimum version 1.24) Go version: go1.22.7 Git commit: 3ab5c7d OS/Arch: linux/arm64注意看两个关键点。第一Client 的OS/Arch是darwin/arm64这是因为你当前终端跑在 macOS 上。第二Server 的OS/Arch必须是linux/arm64Apple Silicon或linux/amd64Intel这说明引擎跑在 Linux 虚拟机里是正常现象。我排查时最常遇到的情况是只显示了 Client 信息Server 部分直接报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?。这就是 Docker Desktop 虽然开了但引擎还没就绪或者 CLI 连接不上引擎。这时候先别急着往下验证得先把这一步解决。2.2 用docker info检查引擎健康度docker version只能确认 Server 存在但引擎内部状态怎么样需要docker info来看。docker info这个命令输出的关键信息我一般这么看Containers当前存在多少个容器包括已停止的。Images本地已有多少个镜像。Server Version引擎版本应该和 Client 版本一致或接近。Storage Driver通常是overlay2这是 Docker 默认的存储驱动看到别的值要留意。Cgroup Driver通常是cgroupfs或systemd。Architecture应该是aarch64或x86_64对应你的芯片架构。Operating System显示Docker Desktop或类似名称说明引擎由 Docker Desktop 管理。Total Memory虚拟机分配到的总内存默认是你 Mac 内存的一半但可以在 Docker Desktop 设置里调整。还有一个容易被忽略的点docker info末尾有ERROR或WARNING行的话说明环境存在隐患。比如磁盘空间不足、内存过低、swap 设置异常这些都会在docker info里显示警告。看到ERROR级别就先解决掉别等到运行容器时才崩。3. 核心链路验证跑通第一个容器别停留在“看起来正常”3.1hello-world容器的完整生命周期检查CLI 和引擎状态正常接下来做最核心的验证拉取镜像、创建容器、运行容器、退出容器。docker run hello-world这条命令会先从 Docker Hub 拉取hello-world镜像然后以这个镜像创建一个容器并运行。如果一切正常终端会输出一段欢迎信息告诉你 Docker 安装成功。我见过不少新手在这步就卡住了但其实是网络问题拉取镜像超时。这时候我建议先单独执行docker pull hello-world把拉取和运行分开来验证这样能准确定位是网络问题还是运行问题。执行完docker run hello-world之后再看一下容器状态docker ps -a你会看到hello-world这个容器的状态是Exited (0) ...退出码是 0说明容器正常执行完毕并退出。这个细节很关键退出码 0 代表容器内部没有报错。3.2 用交互式容器验证完整能力hello-world只能证明最基础的流程能跑通但生产环境里我们用的是交互式容器、后台容器、端口映射。所以第二步我建议起一个能交互的 Alpine 容器它体积小几 MB且自带 shell方便测试。拉取并进入容器docker run -it --rm alpine sh注意这里的两个参数。-it表示分配一个交互式终端--rm表示容器退出后自动删除。进入容器后你会看到类似/ #的提示符。然后执行cat /etc/os-release能看到 Alpine Linux 的版本信息说明你已经在容器内部了。再执行exit退出然后跑docker ps -a确认这个容器已经被删掉因为有--rm。这一步验证了两个重要的能力交互式终端的分配、容器生命周期管理。实际操作中如果-it失败通常是终端模拟的问题或者是引擎资源不足。3.3 验证端口映射启动 Nginx 并访问端口映射是 Docker 日常使用里最基础、最高频的功能。我建议用 Nginx 镜像做一次完整验证。docker run -d --name test-nginx -p 8080:80 nginx:alpine这条命令的参数解释一下-d表示后台运行--name test-nginx给容器命名-p 8080:80把 Mac 的 8080 端口映射到容器的 80 端口镜像用nginx:alpine是因为体积小。启动后用docker ps确认容器状态是Up然后打开浏览器访问http://localhost:8080会看到 Nginx 的欢迎页面。这里有一个特别值得提的排查点如果浏览器打不开但容器状态显示Up先在 Mac 终端里跑curl http://localhost:8080试试。如果 curl 有响应但浏览器不行可能是浏览器代理设置的问题。如果 curl 也没响应就要检查端口映射用docker logs test-nginx看看容器日志再用docker port test-nginx确认实际映射关系。验证完记得清理docker stop test-nginx docker rm test-nginx4. 网络与资源验证这一块最容易被忽略4.1 容器对外网访问能力验证很多人在 Mac 上装完 Docker跑通了 Nginx就以为环境没问题了。直到项目里需要容器里访问外网时才发现问题。所以网络验证里必须先检查容器能否访问外网。进入一个交互式容器docker run -it --rm alpine sh然后在容器内执行wget -O- https://www.baidu.com或者用 Alpine 自带的其他命令apk updateapk update会拉取 Alpine 的软件包索引这个过程必须联网。如果容器无法访问外网这条命令会卡住或报错。我自己在 Mac 上遇到过一次很隐蔽的问题容器能 ping 通内网 IP但访问外网超时后来发现是公司的代理设置影响了 Docker Desktop 的网络栈。4.2 验证自定义网络和容器间通信实际项目中多个容器通常需要通过自定义网络通信。我建议在验证阶段就把这个场景也测一遍。先创建一个自定义网络docker network create test-net然后用这个网络启动两个容器docker run -d --name test-a --network test-net alpine sleep 3600 docker run -d --name test-b --network test-net alpine sleep 3600进入 test-a 去 ping test-bdocker exec -it test-a ping test-b如果网络配置正常你会看到来自 test-b 的 ICMP 回包。这个验证很关键因为 Docker 内置的 DNS 解析只有自定义网络才支持容器名互相解析。使用默认的 bridge 网络时容器之间只能通过 IP 访问不能通过容器名访问——这一点是新手最容易踩的坑。4.3 磁盘与内存占用确认Docker Desktop 会在 Mac 上创建一个虚拟机磁盘镜像默认路径在~/Library/Containers/com.docker.docker/Data/vms/下面。这个磁盘文件会随着镜像和容器的增多而膨胀。磁盘空间检查docker system df这个命令会显示镜像、容器、卷、构建缓存四个维度的占用情况。我自己会在验证阶段特意看一眼因为很多 Mac 用户反映“硬盘空间越来越小”最后发现是 Docker 的虚拟磁盘在悄悄膨胀。如果发现磁盘占用过大可以执行docker system prune清理未使用的资源。不过要注意这个命令会删掉所有未被使用的东西执行前最好看清楚输出内容。内存方面在 Docker Desktop 的Settings - Resources里可以看到当前分配给虚拟机的内存。默认是 Mac 物理内存的一半如果你的 Mac 只有 8GB 内存建议手动把 Docker 的内存限制到 3-4GB否则 Docker 会把 Mac 本身的内存吃紧。5. Compose 与常用配置验证从“容器能跑”到“项目能跑”5.1 验证 Docker Compose 可用现代项目中几乎不会一个个docker run都是用 Compose 文件统一编排。Docker Desktop 自带 Docker Compose但版本有差异值得单独验证。docker compose version注意新版本推荐用docker compose version带空格老版本可能用的docker-compose --version带横线。如果提示找不到命令说明你的 Docker Desktop 版本比较旧或者 PATH 配置有问题。5.2 用一个最小 Compose 项目做完整验证我建议在验证阶段用最小化 Compose 配置跑通整个编排链路。创建一个测试目录mkdir ~/docker-compose-test cd ~/docker-compose-test创建docker-compose.ymlservices: web: image: nginx:alpine ports: - 8081:80 redis: image: redis:alpine这个配置定义了两个服务一个 Nginx 做 Web 服务一个 Redis 做数据存储模拟了最常见的 Web 缓存架构。启动docker compose up -d然后验证docker compose ps你会看到两个服务都是running状态。再验证服务间通信——进入 web 容器尝试连接 redis 服务docker exec -it docker-compose-test-web-1 sh在容器内执行nc -z redis 6379 echo redis is reachable能输出redis is reachable说明 Compose 创建的默认网络工作正常服务发现也没问题。6. 常见异常与排查技巧实录6.1 Docker Desktop 无法启动这是 Mac 上最棘手的问题。点了 Docker Desktop 图标但图标一直转圈或者启动后立即退出。排查步骤我按顺序整理如下第一确认 macOS 版本符合要求。Docker Desktop 最新版本通常要求 macOS 12 及以上Intel 芯片的老机型特别容易遇到这个问题。第二检查是否开启了“允许未签署的扩展”等安全设置。macOS 的 Gatekeeper 可能会拦截 Docker Desktop 的组件加载。打开“系统设置 - 隐私与安全性”查看是否有关于 Docker 的提示。第三查看 Docker Desktop 的日志。日志文件在~/Library/Containers/com.docker.docker/Data/log/host/目录下。重点看com.docker.backend相关的日志。6.2 报错Cannot connect to the Docker daemon这个错误通常有两个原因引擎没启动或者 socket 权限有问题。先用docker context ls查看当前上下文。Mac 上默认上下文是desktop-linux如果显示的是其他条目或者指向了远程主机就会出现连接不上本地引擎的问题。解决方法docker context use desktop-linux如果上下文没问题那就是引擎确实没起来。回到 Docker Desktop 界面看右上角的状态灯是不是绿色的不是绿色就重启 Docker Desktop。6.3 端口冲突address already in use启动容器时指定了-p 8080:80但报错说端口被占用。通常是本机已经有一个应用占用了 8080 端口。排查命令lsof -i :8080查到占用进程后有两个处理方式杀掉占用进程或者把容器的端口映射改成其他端口。我建议直接改映射端口因为本机上的其他服务往往也是必须跑的别为了测试去杀生产进程。6.4 镜像拉取慢或超时国内网络环境下直接从 Docker Hub 拉镜像经常超时。这个问题我在 Mac 上也遇到很多次。常规做法是配置镜像加速器。Docker Desktop 的设置里在Settings - Docker Engine中修改registry-mirrors填入可用的镜像加速地址。例如{ registry-mirrors: [https://docker.mirrors.ustc.edu.cn] }修改后点击Apply RestartDocker 会自动重启并生效。但我还要提醒一句镜像加速只能解决拉取镜像的问题容器内部需要访问外网的场景是加速不了的。6.5 虚拟化支持异常有些用户在启动 Docker Desktop 时看到类似Virtualization support not detected的报错说明 Docker 无法使用硬件虚拟化能力。解决办法分两种情况。Apple Silicon 芯片的 Mac确认 macOS 版本符合要求同时关闭可能干扰的虚拟机软件。Intel 芯片的 Mac需要在“系统设置 - 隐私与安全性 - 开发者工具”中允许 Docker 使用虚拟化能力。还有一种情况是同时安装了 VirtualBox、VMware 等虚拟机软件它们会和 Docker Desktop 争抢虚拟化资源这种情况下需要关闭其他虚拟机软件再重启 Docker。我个人不建议强制关闭虚拟化检测来绕过这个错误因为容器引擎没有硬件虚拟化支持性能和稳定性都没有保障运行复杂容器时大概率会崩。6.6 容器之间互相 ping 不通如果你发现自定义网络里的容器ping对方容器名不通第一反应通常是觉得网络配置坏了。但实际情况往往是 Alpine 镜像里没有ping命令。Alpine 基于 musl libc默认镜像精简到极致连ping都没装。测试前先安装apk add iputils或者不用 ping改用nc -zv来测试端口连通性。很多网络排查问题其实就是一个工具缺失别一上来就怀疑 Docker 网络配置。7. 最后分享一点实际操作中的体会验证 Docker 这个事最忌讳的是“用到哪验到哪”。刚装完的时候花十分钟把环境全部测一遍后面能省下大把排查问题的时间。我自己在 Mac 上测试环境最终的验证清单就是这几条CLI 和引擎通信正常、能跑交互式容器、端口映射能访问、容器能访问外网、容器间能互相通信、Compose 能正常编排。这六项全过了Docker 环境基本就是健康的。还有个小建议验证完环境后记得把测试用的镜像和容器清理掉。docker system prune可以帮你清掉未使用的资源保持环境干净以后实际项目跑起来看到的容器列表就不会是一堆测试残留。如果你在验证过程中遇到这篇里没覆盖到的问题建议先把 Docker Desktop 的日志翻出来看。Mac 上日志在~/Library/Containers/com.docker.docker/Data/log/host/报错的上下文都会记录在里面比在终端里瞎猜要靠谱得多。
