尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Mac安装Docker避坑指南:芯片与virtualisation报错排查

Mac安装Docker避坑指南:芯片与virtualisation报错排查 从网上搜教程、照着敲命令、等了半天结果Docker Desktop要么一直转圈要么直接弹一句virtualisation support wasnt detected然后整个应用就退出了。这句话我见过太多次几乎快成Mac装Docker的劝退名场面。其实这个事本身没那么难难的是没人告诉你背后的逻辑是什么、出错之后该按什么顺序排查。这篇就来把Mac安装docker轻松解决安装这条路上可能遇到的坎儿全部摊开讲。先花两分钟确认芯片和系统版本再选安装方式接着把装完打不开的报错链路一步步理顺最后顺手把镜像加速、资源限制和常见容器场景里的坑一并处理掉。整个过程不需要你用命令行刷什么高端操作照着顺序走多数问题都能自己解决。1. 安装前先花两分钟确认芯片型号与系统版本别搞错1.1 Apple Silicon和Intel Mac下载的安装包完全不同很多人一听到Mac安装Docker第一反应就是打开浏览器搜索Docker Desktop然后下载。这个动作本身没问题问题是Mac现在还分两大阵营Apple SiliconM1/M2/M3/M4系列和Intel芯片。Docker Desktop针对这两种芯片提供了不同的安装包下载错了后面会非常难受。怎么确认芯片型号点左上角苹果图标选择关于本机如果芯片一栏写的是Apple M几那就是Apple Silicon如果写的是处理器并且后面跟着Intel字样那就是Intel款。不想翻设置的话打开终端输入uname -m输出arm64是Apple Silicon输出x86_64是Intel。这一步值得在开始前确认清楚因为Apple Silicon的Mac如果误装了x86_64版本虽然也能通过Rosetta 2转译跑起来但虚拟化这一层性能会打折扣还容易出现莫名其妙的问题。我见过好几个用户卡在装好了但容器启动极慢最后发现就是装错包了。1.2 系统版本达不到要求装完也是白装Docker Desktop的安装包对macOS版本有硬性要求。比较新的Docker Desktop 4.x版本一般要求macOS 11 Big Sur及以上。如果系统停在Catalina10.15或者更老装完大概率打不开就算勉强打开虚拟化组件也会报各种错。所以安装前再看一眼系统版本位置在关于本机里macOS那一栏。如果你还停在老版本建议先把系统升级到当前主流版本再继续。这比其他任何排查都省事因为新版macOS本身也修复了不少和虚拟化相关的底层问题。1.3 关于虚拟化支持Mac和Windows有个本质区别在Windows上装Docker Desktop很多人会去BIOS里翻VT-x虚拟化之类的开关。但在Mac上这个动作完全没有必要Intel款Mac的虚拟化一直是在系统层面默认启用的Apple Silicon更是原生支持。所以一旦出现virtualisation support wasnt detected这类提示根源基本不在硬件开关而是出在安装包平台、系统版本、Rosetta转译组件或者Docker自身的虚拟化后端上。搞清楚这一点排查方向就不会跑偏。2. 桌面版和命令行版哪条路更适合你2.1 Docker Desktop绝大多数人的首选Docker Desktop是Docker官方出的图形化套件集成了客户端、服务端和虚拟机管理对新手最友好。下载dmg之后双击打开把Docker图标拖进Applications文件夹标准操作就完成了。但这里有个新手非常容易误会的点拖进应用程序目录不等于启动成功。第一次打开Docker Desktop系统会弹窗要求输入管理员密码授权安装辅助工具然后软件才开始初始化引擎。这一步需要等一会儿视觉上看起来有点像卡死其实是在后台初始化。如果等了几分钟还是没有反应先别急着卸载重装把Docker完全退出再重新打开很多情况下就恢复了。完全退出的方式是点击菜单栏的Docker图标选择Quit或者在终端执行pkill -f Docker2.2 走Homebrew安装适合本来就用brew管理软件的人如果你对命令行不陌生而且电脑上已经装了Homebrew也可以直接用brew来装Docker Desktopbrew install --cask docker这条命令装的是Docker Desktop的完整版。如果你只想用纯命令行环境可以先装CLIbrew install docker但要注意装完CLI后直接运行docker run hello-world会报Cannot connect to the Docker daemon因为此时电脑上根本没有一个后端来承载容器的运行环境。Docker的架构可以简单理解成docker命令是客户端真正干活的是后台的Docker daemon而daemon需要一个虚拟机环境才能把Linux容器跑起来。Docker Desktop干的事情就是把客户端、daemon和虚拟机一起打包好省去自己折腾的功夫。如果你不想用Docker Desktop又希望有个命令行后端可以用colima配合brew install colima docker colima start之后就能正常使用docker命令了。Colima和Docker Desktop的区别在于它是纯命令行的Linux虚拟机管理工具不占图形界面资源轻量很多。至于拿它当主力还是当备胎看个人喜好就行。我这里不多展开因为后面所有内容都按Docker Desktop来讲这也是大多数人走的路线。2.3 顺便说一句Homebrew安装时最常见的报错热搜词里有个mac安装homebrew报错既然说到brew就顺带解决一下。最常见的是执行安装脚本时报xcode-select: error意思是系统还没装Xcode Command Line Tools。解决办法是先装命令行工具xcode-select --install装完再重新执行Homebrew安装脚本。如果报的是/opt/homebrew目录权限问题基本是之前安装中断导致目录归属乱了可以先检查目录是否存在ls -ld /opt/homebrew确认归属不对的话用管理员权限修一下目录归属然后把Homebrew重新安装一遍。遇到这类问题不要反复重跑脚本先看报错停留在哪一步再对症处理。把这些报错解决了后面brew安装Docker就顺了。3. 装完打不开virtualisation support报错按这个顺序排查3.1 先把报错现场还原一遍Docker Desktop打开后秒退或者弹窗提示类似virtualisation support wasnt detected这是Mac装Docker的高频故障。很多人一看到这串英文就慌了以为是电脑太老或者硬件不支持实际上绝大多数情况根本不是硬件问题而是软件环境搭错了。为什么Docker Desktop在Mac上会依赖虚拟化因为Docker容器本质上是Linux容器而macOS的底层不是Linux所以Docker Desktop必须在Mac上创建一个轻量级的Linux虚拟机。这个虚拟机在Apple Silicon上主要依赖macOS自带的Virtualization.framework在Intel上依赖Hypervisor.framework。一旦Docker Desktop启动时检测不到可用的虚拟化框架就会打出这个报错然后自动退出。3.2 排查链路第一步核对安装包平台回想一下下载安装包时有没有选对平台。Apple Silicon的Mac应下载带arm64标识的Docker Desktop安装包Intel Mac应下载x86_64或者amd64标识的。如果你不确定自己下的是不是对的直接去官网重新下载当前芯片对应的版本然后覆盖安装一次。就这么简单的一步能解决相当一部分报错。3.3 排查链路第二步检查Rosetta转译组件如果你是Apple Silicon的Mac而且之前曾装过x86_64版本的Docker Desktop那么系统需要Rosetta 2转译层才能把Intel指令转到ARM上执行。macOS首次运行需要Rosetta的软件时会提示安装但如果你手动跳过或者误选了不需要后面Docker Desktop就很容易报虚拟化相关错误。补装Rosetta的执行命令是softwareupdate --install-rosetta装完之后重启Docker Desktop。这个过程很快但能避开不少隐藏的平台不匹配问题。3.4 排查链路第三步重置Docker Desktop的虚拟化后端状态如果前两步都没问题那就要考虑Docker Desktop自身的配置文件或虚拟化后端是否卡在了异常状态。重置的方式有两种第一是先试试Docker Desktop菜单栏图标里的Troubleshoot → Reset to factory defaults这种重置不会删掉你本地已有的镜像但会把配置恢复成出厂状态。第二种是彻底删除Docker Desktop的本地数据后重新启动思路是移除下面几个目录rm -rf ~/Library/Group\ Containers/group.com.docker rm -rf ~/Library/Containers/com.docker.docker rm -rf ~/Library/Preferences/com.docker.docker.plist然后从Applications里重新打开Docker Desktop。这里要提醒一句这种删除会同时清掉本地的容器和镜像数据执行前想清楚是否要保留现有数据要保留的话先备份不要图省事直接删。3.5 排查链路第四步检查其他虚拟机软件是否打架如果电脑上还装过VMware Fusion、Parallels Desktop这类虚拟机软件并且当时有虚拟机在运行Docker Desktop的虚拟化组件可能会跟它们抢资源导致检测失败。排查方法很简单把其他虚拟机软件完全退出再启动Docker Desktop。如果恢复正常说明就是冲突问题。平时尽量别同时运行多套虚拟化方案省得互相干扰。3.6 排查链路第五步按现象对照速查表为了方便你快速定位我把Mac上Docker Desktop常见的启动异常整理成一个速查表按自己的现象对号入座即可。现象可能原因优先处理方向Dock图标一直跳但起不来首次启动尚未完成初始化多等几分钟必要时退出重开提示virtualisation support wasnt detected安装包平台选错、系统版本低、虚拟化后端异常按3.2到3.4逐项排查Apple Silicon上运行特别卡安装包是x86_64版本换arm64版本重装容器能启动但网络异常端口冲突或网络驱动问题检查宿主端口占用重建容器网络打开后要重新初始化配置丢失Docker Desktop本地数据损坏使用Troubleshoot重置配置这张表不是万能的但覆盖了绝大多数装好打不开的情况。我个人的经验是超过一半的报错在第一、二步就被解决了真正走到删数据那一步的反而很少。4. 装好先别急着跑容器三件事必做验证、换源、限资源4.1 用一条命令验证Docker真的能用了安装结束后第一件事是确认整个链路是通的。打开终端依次执行docker --version docker compose version docker run --rm hello-world前面两条是确认客户端版本第三条会从镜像仓库拉取一个极小的hello-world镜像并在容器里运行。如果一切正常你会看到一排Hello from Docker!开头的输出这就说明Docker的客户端、守护进程和虚拟机链路全部正常。很多教程让你直接跑docker run nginx虽然也能验证但hello-world更轻失败也更容易看出问题在哪。4.2 配置镜像加速解决拉取镜像慢的实际问题装好Docker第一道坎不是不能运行而是拉镜像太慢。从Docker Hub拉取比较大的镜像时速度不稳定是常态。解决办法是给Docker配置镜像加速地址也就是把Docker Hub的拉取请求转发到国内云服务商提供的Docker镜像节点上速度会明显改善。配置路径是Docker Desktop菜单栏图标 → Settings → Docker Engine会看到一个JSON配置编辑器。在默认配置里加一段registry-mirrors字段结构大致是{ registry-mirrors: [ https://你的专属加速地址.mirror.aliyuncs.com ] }关于加速地址我的建议是优先去自己常用的云服务商控制台里申请专属加速地址比如阿里云容器镜像服务控制台里就有这个功能注册后就能拿到一串每个人都不一样的地止。不要盲目抄网上随便贴出来的公共地址很多已经失效或者速度不稳定。配置完成后点Apply restartDocker Desktop会自动重启并重新读取配置。之后拉镜像的体验会舒服很多。4.3 资源限制一定要调不然Mac分分钟卡死Docker Desktop在Mac上默认会从系统里划走一部分CPU、内存和磁盘空间给虚拟机。默认值对配置高的Mac还算合理但如果你用的是8GB或16GB内存的机型不调这个参数可能会让整个系统变得很卡。设置路径是Settings → Resources。我给一个比较保守的经验值内存8GB的Mac给Docker分配4GB左右留一半给系统内存16GB的Mac给Docker分配6到8GB别贪多CPU核心数最多给一半比如8核的机器给4核就够跑了Disk image size根据自己常用镜像的体量来默认的60GB一般够不够可以后续再调大。还有一点容易被忽略Resources里有一个File sharing区域它决定宿主机哪些目录能被容器挂载。如果你后面想把本地目录挂进容器比如做开发调试需要把对应目录加进来。新版Docker Desktop默认会共享某些常用目录但如果挂载时遇到权限问题第一反应应该就是来这里看目录是否在共享列表里。这些配置看似不起眼却决定了你之后是用得舒服还是三天两头抱怨Mac很卡。我在这上面吃过亏一开始直接默认配置跑GitLab和一系列开发容器结果整个Mac风扇狂转最后才发现是资源分配没管好。5. 这几种常见容器的坑提前帮你踩过了5.1 青龙面板装上容易依赖管理才是大头很多Mac用户装Docker就是想跑青龙面板这类定时任务管理工具。青龙面板的部署本身不难一条docker run命令就能拉起来。比较常见的启动命令是docker run -d \ --name qinglong \ -p 5700:5700 \ -v ~/ql/data:/ql/data \ --restart unless-stopped \ whyour/qinglong:latest启动后浏览器访问http://localhost:5700按页面提示初始化管理员账号就行。端口和数据卷挂载都可以按自己需求改但核心逻辑不变。真正让人头大的是依赖管理。青龙面板跑任务脚本时经常需要Python、Node.js、npm等运行环境很多人发现任务运行失败缺这个模块缺那个库然后一脸懵只能反复重建容器。其实正确做法是进容器内部手动补齐依赖先进入容器环境docker exec -it qinglong bash然后在容器内用对应包管理器安装缺少的依赖装完退出容器再去面板里手动重启任务进程。这里有个坑容器一旦重建所有手动安装的依赖都会丢失。所以频繁重建容器的场景下依赖丢失是必然的。解决思路是尽量把常用依赖写入初始化脚本或者在镜像基础上做自定义固化而不是每次手动装一遍。5.2 GitLab一顿操作猛如虎一看内存已爆炸在Mac上跑GitLab这个选择我劝你三思。GitLab是出了名的内存大户官方建议至少4GB内存给它实际操作中我建议16GB内存的Mac再考虑跑GitLab8GB内存的机器装了之后系统几乎会卡到鼠标都挪不动。如果确实要装一个基本的部署命令是docker run -d \ --name gitlab \ -p 8022:22 \ -p 8080:80 \ -v ~/gitlab/config:/etc/gitlab \ -v ~/gitlab/logs:/var/log/gitlab \ -v ~/gitlab/data:/var/opt/gitlab \ --restart always \ gitlab/gitlab-ce:latest首次启动非常慢可能要等好几分钟甚至十几分钟因为容器内部要初始化数据库和服务。启动后访问http://localhost:8080。初始密码存在容器里需要进容器查看docker exec -it gitlab cat /etc/gitlab/initial_root_password用这个密码再配合root账号登录然后去改密码。跑GitLab这类重容器我建议在Resources设置里给它多分一些核数和内存同时注意观察Docker的磁盘占用GitLab的数据卷会随着仓库变多而膨胀这个体量比想象中快。5.3 Redis主从部署一个network让你少踩一半的坑做开发时很多人会在Docker里搭Redis主从复制做本地测试。比较常见的踩坑点在于主库和从库之间如何互通。如果你直接在两台容器里写127.0.0.1那肯定是不通的因为每个容器有自己的网络命名空间要用服务名或者容器IP互通。最简单的做法是自己建一个Docker网络让两个容器都加入其中docker network create redis-net然后启动主库docker run -d \ --name redis-master \ --network redis-net \ -p 6379:6379 \ redis:7 \ redis-server --appendonly yes接着启动从库docker run -d \ --name redis-slave \ --network redis-net \ -p 6380:6379 \ redis:7 \ redis-server --slaveof redis-master 6379在这里--slaveof redis-master 6379中的redis-master是容器名Docker的自带DNS可以自动解析同网络下的容器名不需要关心IP地址变化比手动查IP要可靠得多。如果需要在容器里访问宿主机上的服务则可以用host.docker.internal这个特殊域名。记住这两个点Redis主从在Mac上基本就不会再出网络问题。5.4 Docker磁盘占用越来越大如何把空间找回来用了一段时间Docker之后Mac系统数据怎么清理里很大一部分空间就是被Docker的虚拟磁盘文件占掉的。Docker Desktop会在Mac上维护一个大的磁盘镜像文件默认位置在~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw这个文件会随着你拉镜像、构建镜像、运行容器不断膨胀。删掉几个容器并不会让这个文件自动缩小所以你会觉得明明没装多少东西磁盘空间却一直在减少。先看看到底占了多大docker system df它会列出镜像、容器、缓存卷各自的占用。确认有大量无用内容后执行清理docker system prune -a --volumes这个命令会把所有未被容器使用的镜像、网络、构建缓存和匿名卷一次性清掉效果最明显。如果清完之后你发现虚拟磁盘文件还是很大那就需要到Docker Desktop的Resources里调整Disk image size或者在Troubleshoot里做一次彻底的Clean / Purge data然后重新拉取需要用到的镜像。清理完记得看看~/Library/Containers/com.docker.docker的大小有没有降下来这个目录就是Mac上Docker数据的大本营。另外还有一个习惯值得养成尽量不要把容器数据卷直接挂到Mac的桌面或文档目录里一来容易引发文件权限问题二来同步和性能都受影响。我自己习惯把所有Docker数据卷集中放到~/docker-data这样的目录下再通过File sharing共享给Docker后续要清理要备份都很清晰。我实际用下来的几点体会我用Docker Desktop跑了一整年中间也经历过装不上、打不开、磁盘爆炸的阶段。回过头来总结最容易让人放弃的其实是刚装好的第一个小时很多人一看到报错就慌了立刻去搜索各种终极解决方案然后套一堆自己都不理解的命令结果越弄越糟。实际上只要把芯片平台选对、系统版本放宽到最新、Rosetta装上这个软件基本不会闹脾气。还有一点Docker Desktop本身也是一个软件它会更新、会出小毛病所以遇到启动异常时第一反应不要是卸载重装先退到Troubleshoot里做一次重置比反复删除重装要高效得多。平时跑容器的时候记得定期用docker system prune -a --volumes做做清理再把Resources里的资源配比调成一个让Mac和自己都舒服的平衡点这套流程走下来再回头看那些抄来抄去的安装教程你会发现当初卡住你的并不是Docker有多难而是漏掉了某个普普通通的细节。
返回列表