ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Docker三平台安装配置实战:Windows WSL2、Mac芯片与Linux引擎一次搞定

Docker三平台安装配置实战:Windows WSL2、Mac芯片与Linux引擎一次搞定 每次遇到“安装配置”这三个字我就知道又要开始折腾了。尤其像 Docker 这种涉及虚拟化、内核、系统服务的技术在 Windows、Mac、Linux 三个平台上装一遍基本能把常见的环境坑全踩个遍。你别说前两天我刚帮同事处理完一台 Windows 家庭版机器上 Docker Desktop 无法启动的问题正好借此把三个平台的安装配置流程完整梳理一遍。这篇文章不是官网文档的翻译而是我实际动手装过、改过、排查过之后的实战记录。无论你是刚接触 Docker 的初学者还是需要给多台机器统一配置环境的老手这篇文章都能给你一份可以直接照着抄的作业。先说清楚一个前提Docker 本身是一个容器化平台它解决的问题是“在我电脑上明明是好的怎么到你这就跑不起来”——通过把应用和它的依赖打包成标准镜像在任何装了 Docker 的机器上用同样方式运行。所以装好 Docker比学会任何具体命令都重要因为后面所有容器、编排、CI/CD 都建立在它之上。1. 先搞清楚Docker到底装的是什么很多人第一次装 Docker 时会产生一个疑问为什么 Windows 和 Mac 上要装 Docker Desktop而 Linux 上装的是 docker-ce这里必须先理解 Docker 的底层逻辑否则后面遇到问题会无从下手。1.1 容器与虚拟机的区别Docker 容器不是虚拟机。虚拟机里跑的是完整操作系统有独立的 Linux 内核占用的资源以 GB 起步容器则直接共用宿主机的操作系统内核只是在用户空间上做了隔离。这个设计让容器启动速度快毫秒级、资源占用小但也带来了一个关键限制容器技术最初是围绕 Linux 内核特性如 cgroups、namespaces设计的Windows 和 macOS 原生并不是 Linux 内核没法直接跑 Linux 容器。所以 Windows 和 Mac 平台的 Docker Desktop 本质上是“套了一层虚拟化”的解决方案。Windows 上通过 WSL2Windows Subsystem for Linux 2或者 Hyper-V 虚拟机跑一个轻量级 Linux 发行版Docker 引擎运行在里面Mac 上则通过 macOS 自带的高性能虚拟机框架跑一个轻量级 Linux 虚拟机。而 Linux 平台本身就有 Linux 内核直接安装 Docker 引擎即可不需要任何中间层。这个差异直接决定了安装流程的长短Linux 上装 Docker 可能就是几条命令的事Windows 和 Mac 上则要额外处理虚拟化、内核、权限等一系列前置条件。1.2 Docker Desktop与社区版引擎的区别Docker 官方目前的发行形式主要分两种一种是 Docker Desktop面向 Windows 和 Mac带图形化界面内置了 Docker Engine、Docker Compose、镜像管理、Kubernetes 单机集群等功能开箱即用另一种是 Docker Engine即 docker-ce 包面向 Linux 服务器纯命令行只有核心引擎需要什么功能自己装。对个人开发者来说Windows 和 Mac 上选 Docker Desktop 是省心选择对服务器部署来说Linux 上一定是用 Docker Engine不会有人在服务器上装图形界面。这里存在一个常见误解以为 Docker Desktop 就是 Docker 的全部。其实 Desktop 只是客户端封装真正干活的是里面的引擎。后面我在排查问题时说过很多次——报错信息里出现的docker daemon、containerd都是指 Linux 虚拟机里的那套引擎。1.3 安装前必须明白的“架构”问题还有一个很多人装完才发现的问题镜像的 CPU 架构。Docker 镜像是按指令集架构区分的比如 x86_64 和 arm64。Apple Silicon 芯片M1、M2、M3是 ARM 架构大多数从 Docker Hub 拉取的标准镜像默认包含多架构支持Docker 会自动选择对应版本。但少数老镜像没有 arm64 版本跑起来会报exec format error这时候要么找 arm64 替代镜像要么在 Docker Desktop 里开启 Rosetta 2 兼容模式后面章节细讲。Intel Mac 和绝大多数 Windows/Linux 机器是 x86_64 架构基本不会有这个问题。2. 安装前的前置检查清单三平台一个都不能少安装 Docker 最大的坑从来不是安装过程本身而是前置条件不满足。我见过不少人下载完 Docker Desktop 双击安装重启电脑后却无法启动最后发现虚拟化根本没开。所以在动手之前务必按平台完成下面的检查。2.1 Windows虚拟化、WSL2与系统版本Windows 平台安装 Docker Desktop 有硬性要求必须是 Windows 10 64 位专业版/企业版/教育版21H1 及以上或 Windows 11 64 位家庭版/专业版。注意Windows 10 家庭版过去需要手动启用 Hyper-V过程比较麻烦现在技术路线已经以 WSL2 为主家庭版也能正常用。第一确认 CPU 虚拟化已开启。打开任务管理器切到“性能”选项卡在“CPU”一栏底部看“虚拟化”是否显示“已启用”。如果显示“已禁用”需要在 BIOS/UEFI 里打开 Intel VT-x 或 AMD-V这是硬件层面的开关软件无法绕过。第二确认 WSL2 可用。Docker Desktop 的默认后端是 WSL2需要在 Windows 功能里启用“适用于 Linux 的 Windows 子系统”和“虚拟机平台”。简单方式以管理员身份打开 PowerShell执行wsl --install它会自动启用所需功能并安装默认 Linux 发行版。装完重启然后执行wsl --version如果能看到 WSL 版本号且内核版本显示 2.x说明就绪。第三检查 Linux 发行版状态。Docker Desktop 的 WSL2 后端需要至少一个已安装的 Linux 发行版。如果之前从未用过 WSL执行wsl --install后会自动装一个 Ubuntu如果已经装过最好执行一下wsl --set-default-version 2确保默认版本是 WSL2 而不是 WSL1。2.2 Mac芯片型号与系统版本Mac 平台的前置检查相对简单但有一件事必须确认清楚你的机器是 Intel 芯片还是 Apple Silicon。这一步直接决定下载哪个版本的 Docker Desktop。查看方式有两种点击左上角苹果菜单选“关于本机”如果显示“芯片 Apple M1/M2/M3”就是 Apple Silicon显示“处理器 Intel Core i5/i7”就是 Intel更准确的方式是打开终端执行uname -m输出arm64是 Apple Silicon输出x86_64是 Intel。千万别下载错版本苹果芯片装 Intel 版本虽然也能通过 Rosetta 运行但性能和兼容性都打折扣。系统版本要求方面Docker Desktop 目前最低支持 macOS 12 及以上。如果你还在用 macOS 10.15 或更早的系统新版 Docker Desktop 装不了只能找旧版本或者换用其他容器运行时这属于特殊场景这里不展开。2.3 Linux发行版与内核版本Linux 平台没有“桌面版”和“引擎版”的选择问题但需要确认两件事一是你的发行版属于哪一族Debian 系还是 Red Hat 系这决定用什么包管理器二是内核版本是否符合要求。Docker Engine 要求 Linux 内核 3.10 以上主流发行版都满足一般不需要特别操心但如果跑的是 CentOS 6、Ubuntu 14.04 这类老古董系统还是先升级系统再考虑 Docker。查看发行版信息可执行cat /etc/os-release结果里能看到IDubuntu、IDcentos这样的标识。内核版本执行uname -r。如果判断不了发行版最稳妥的方式是直接用我后面第 5 章介绍的官方脚本安装脚本会自动检测系统类型。3. Windows平台安装实录WSL2这一步别跳过Windows 的 Docker 安装教程在网上能搜出很多版本但很多教程一上来就让你下载 Docker Desktop忽略 WSL2 内核更新的步骤结果装完启动报错才到处找解决方案。我这里把完整流程按顺序走一遍。3.1 第一步完整启用WSL2环境以管理员身份打开 PowerShell执行wsl --install这条命令会完成三件事启用“适用于 Linux 的 Windows 子系统”功能、启用“虚拟机平台”功能、自动下载并安装最新版 Linux 内核同时会安装默认的 Ubuntu 发行版。命令执行完成后提示重启那就重启。重启后打开“设置 - 应用 - 可选功能”确认“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两项都在或者打开 PowerShell 执行wsl --status出现默认版本: 2之类的输出就说明正常。如果你要检查已安装的发行版执行wsl -l -v能看到每个发行版对应的 WSL 版本号。这里有第一个容易出错的地方执行wsl --install后提示正在下载但卡了很久或者提示“无法安装”。这种情况多半是因为 Windows 系统没更新到最新。先让 Windows Update 把所有安全补丁打上再重试。我的经验是 Windows 10 版本低于 19041 时wsl --install可能不被识别得单独手动启用功能并下载内核更新包。3.2 第二步安装Docker Desktop在 Windows 上安装 Docker 的入口是官网“Download Docker Desktop”页面也可以理解成一个 exe 文件。下载后双击运行安装向导会让你选择配置。关键选项只有一个安装页面底部有一个“Use WSL 2 instead of Hyper-V”的勾选项务必勾上。这是性能和兼容性的最优选择。WSL2 和 Hyper-V 不能同时作为 Docker 的后端如果之前手动开过 Hyper-V也可以在后续设置里随时切换。安装完成后桌面上会出现 Docker Desktop 图标。首次启动会弹出协议确认和登录引导可以直接选“Skip”跳过登录。启动后屏幕右下角或菜单栏会出现一个小鲸鱼图标等它从动画状态变成稳定状态表示引擎已就绪。3.3 第三步验证Docker是否可用打开 PowerShell 或者直接在 WSL 终端里执行docker version如果能看到 Client 和 Server 两段信息说明客户端和引擎都跑起来了。很多新人在这一步只看到 Client 的信息没有 Server 部分并提示Cannot connect to the Docker daemon这基本就是 Docker Desktop 没真正启动完等十几秒再试。更直接的办法是执行docker run hello-world如果能看到Hello from Docker!的输出整个环境就确认通了。我自己的使用习惯是Windows 下所有 Docker 命令都在 WSL 终端里执行不要在 PowerShell 里执行。原因有两个一是 WSL 内访问 Linux 容器的网络更顺畅二是后续如果要做文件挂载路径格式更统一比如/mnt/d/project而不是D:\project。4. Mac平台安装实录先弄清楚芯片再动手Mac 平台的安装本质上比 Windows 简单但有一个坑非常隐蔽芯片架构和 Docker 镜像架构的匹配问题。这里从下载讲起。4.1 根据芯片型号选择安装包打开 Docker 官网下载页系统会自动检测你的 Mac 是 Apple Silicon 还是 Intel给出对应安装包。如果官网自动检测不准就手动选择。Apple Silicon 芯片选择 “Apple Chip” 版本Intel 芯片选择 “Intel Chip” 版本。这里我强调一下为什么这么区分Apple Silicon 的 Mac 和 Intel 的 Mac CPU 指令集不同容器镜像也需要对应架构的版本。Docker Desktop 的 Apple Chip 版本在本机虚拟机上运行的是 arm64 架构的 Linux执行 arm64 的容器镜像Intel 版本运行的是 x86_64 架构的 Linux。如果你在 M 系列芯片上装了 Intel 版 Docker拉取的也是 x86_64 镜像虽然能通过系统内置的 Rosetta 2 转译运行但每次启动和运行多一层转换性能有损耗。4.2 常规安装步骤与配置下载得到的是一个.dmg文件双击打开把 Docker 图标拖进 Applications 文件夹再从启动台运行 Docker Desktop。首次启动会提示开启“特权助手”和“文件共享访问权限”点击允许。随后菜单栏会出现 Docker 鲸鱼图标。打开“Settings - Resources”这里有几个建议CPU 和内存默认分配可能偏小。我通常把内存设到 4GB 以上编译 Java 项目或跑数据库镜像时更从容。Disk image size这是虚拟磁盘大小上限默认 64GB存储紧张的话可以调整但建议至少留 16GB。File sharing选择允许 Docker 访问哪些目录比如/Users/你的用户名/projects。如果发现容器挂载本地目录不生效多半是这里没加权限。4.3 用Homebrew装Docker的另一种方式如果你已经装了 Homebrew装 Docker Desktop 就一条命令brew install --cask docker然后同样从启动台打开。用 Homebrew 的好处是升级方便brew upgrade --cask docker就能更新缺点是首次打开时仍然会弹协议确认如果当前系统的 macOS 版本偏老Homebrew 的 Docker cask 可能会下载到不兼容的版本。4.4 Apple Silicon用户记得打开Rosetta模拟M 系列芯片的 Docker Desktop 在“Settings - General”里面有一个 “Use Rosetta for x86_64/amd64 emulation on Apple Silicon” 选项。我建以勾选开启。虽然 Docker 优先拉取 arm64 镜像但团队协作时同事给你的镜像很可能只有 x86_64 版本或者某些老镜像没更新多架构支持没有 Rosetta 就直接报exec format error。开启后能少很多麻烦。5. Linux平台安装实录官方脚本和软件源两条路线Linux 上装 Docker 的路子比桌面平台直得多没有图形界面但每一步命令都有讲究。根据使用场景我推荐两条路线临时环境用官方一键脚本生产环境手动配软件源。5.1 快速路线官方脚本安装Docker 官方提供一个安装脚本可以在绝大多数发行版上直接安装 Docker 引擎和依赖组件。执行curl -fsSL https://get.docker.com | bash -s docker脚本会自动识别发行版配置官方软件源安装 docker-ce、docker-ce-cli、containerd.io 等全部组件。整个过程几分钟。安装完成后启动服务sudo systemctl enable --now dockerenable --now表示开机自启并立即启动一步到位比分开执行systemctl start docker和systemctl enable docker更省事。我虽然推荐这个脚本但必须提醒一点任何来源的“执行脚本”都可能存在风险这个脚本来自 Docker 官方维护的仓库可信度高只要你的网络环境允许访问其官方域名即可。企业内网环境则建议走下面“手动配源”的方式把下载源换成内部镜像源再安装。5.2 稳妥路线手动配置软件源安装以 Ubuntu/Debian 系为例手动安装核心步骤sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod ar /etc/apt/keyrings/docker.asc echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release echo $VERSION_CODENAME) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这套命令先导入 Docker 官方的 GPG 密钥再添加 apt 软件源然后安装核心组件。注意安装的包名不是docker也不是docker.io而是docker-ce。很多新手装的是 Ubuntu 自带的docker.io老版本本身也能用但版本落后不少且没有 docker compose 插件后面写编排文件会很憋屈。CentOS/RHEL 系的命令差别在于包管理器以 CentOS 9 为例sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl enable --now docker唯一要注意的是 CentOS 8 已经 EOL很多 docker-ce 仓库源地址需要替换为 vault 归档或使用 9 系列这里不展开具体以你实际系统版本为准。5.3 用户组与权限避免每次sudo安装完 Docker 后直接用docker ps很可能会看到permission denied因为 docker 命令需要 root 权限。解决方式有两种一是所有命令前加sudo但很繁琐二是把当前用户加入 docker 用户组sudo usermod -aG docker $USER执行后必须重新登录或者执行newgrp docker刷新会话然后不用 sudo 就能执行 docker 命令。这个操作在生产服务器上要谨慎评估因为加入 docker 组等于获得了近似 root 的容器控制能力但个人开发机完全没问题。还有个细节如果系统启用了 SELinux 且状态是 enforcing容器挂载本地目录时可能被拒绝。临时验证可以用sudo setenforce 0但更推荐去了解 docker 文件挂载与 SELinux 标签的关系这里涉及较深就不展开了。6. 三平台通用配置镜像加速、资源限制与卸载清理安装只是开始装完必须做几件通用配置——有镜像加速否则拉取镜像时高概率超时有资源限制否则 Docker Desktop 会把你电脑内存吃光还有卸载清理谁都不想留着几 GB 的残留文件占磁盘。6.1 给Docker配置镜像加速器Docker 默认从 Docker Hub 拉取公共镜像网络高峰期或者推送大镜像时经常超时。在 Linux 上配置文件位于/etc/docker/daemon.json编辑它{ registry-mirrors: [https://你的加速器地址] }保存后重启 Dockersudo systemctl restart docker再执行docker info在输出里找到Registry Mirrors一项如果列出了刚才填的地址说明配置生效。Windows 和 Mac 的 Docker Desktop 不用手动改文件打开“Settings - Docker Engine”在 JSON 配置里加上同样的registry-mirrors字段点击“Apply Restart”即可。加速器地址哪里来目前各个云服务商都提供个人专属的容器镜像加速地址登录其容器镜像服务控制台就能看到按格式填入即可。不建议在网上随便找一个公用地址填上去一是可能失效二是公用地址容易成为瓶颈。6.2 限制WSL2与Docker Desktop的资源占用Windows 上 Docker Desktop 默认占用 WSL2 的虚拟内存如果开发机内存只有 8GB跑几个容器就可能卡死。在 Windows 用户目录下创建.wslconfig文件写入[wsl2] memory4GB processors2 swap2GB保存后在 PowerShell 执行wsl --shutdown重启 WSL配置生效。Mac 上则直接在 Docker Desktop - Resources 里拖滑块。Linux 服务器上如果不做限制容器理论上可以利用宿主机全部内存。所以生产环境通常加--memory和--cpus参数限制容器资源docker run --memory512m --cpus1.0 myapp6.3 卸载Docker的正确方式Windows 卸载相对规整在“设置 - 应用”里卸载 Docker Desktop然后执行wsl --shutdown再执行wsl --unregister docker-desktop和wsl --unregister docker-desktop-data把两个专用发行版的虚拟磁盘清理掉。不然残留的虚拟磁盘文件可能占用十几 GB 空间。Mac 卸载需要多清几处删除 Applications 里的 Docker.app再清理~/Library/Group\ Containers/group.com.docker/、~/Library/Containers/com.docker.docker/、~/.docker/这几个目录。手动删之前建议先退出 Docker Desktop。Linux 卸载要分几个步骤sudo systemctl stop docker sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo rm -rf /var/lib/docker/var/lib/docker是 Docker 默认的数据目录包含了所有镜像层、容器数据、卷数据。如果不删重装后还会读到旧数据可能导致状态不一致删了之前所有的镜像和容器全没了。清理前确认这些数据不需要保留。7. 验证安装成果第一次运行容器的最佳实践装完 Docker 别急着跑复杂项目先用几个常规命令确认环境没有任何隐藏问题。很多隐形问题比如网络、代理、内核限制只有在第一次真正拉取镜像并运行容器时才会暴露。7.1 用hello-world确认引擎可用docker run --rm hello-world这条命令做了三件事先从 Docker Hub 拉取hello-world镜像再创建容器运行最后输出一段欢迎信息。加--rm参数表示容器运行完会自动删除不留垃圾。如果一切正常你会在屏幕上看到一段英文说明然后容器退出。这一步常见的问题就是拉取镜像超时如果你已经配了镜像加速还是慢就检查一下本机网络。在 Windows 上还可能是防火墙拦截了 WSL2 虚拟机的网络请求需要把 Windows Defender 防火墙对 wslrelay.exe 或 Docker Desktop 相关网络的拦截放行。7.2 用nginx验证端口映射与网络hello-world 只证明了“引擎能跑”还不足以证明“端口映射、网络隔离正常”。我习惯再跑一个 nginxdocker run -d --name test-nginx -p 8080:80 nginx docker ps浏览器打开http://localhost:8080如果出现 nginx 欢迎页说明容器到宿主机端口映射通了。这条命令用了几个关键参数-d让容器在后台运行--name指定容器名字-p 8080:80把容器的 80 端口映射到宿主机的 8080 端口。用完可以清理docker stop test-nginx docker rm test-nginxMac 上用localhost:8080没问题Windows 上如果浏览器访问不通先确认 Docker Desktop 在运行其次确认端口没被占用。另外一个判断技巧curl localhost:8080返回 HTML 说明端口通不返回就看docker logs test-nginx里有没有监听报错。7.3 从docker info中读取关键信息docker info是排查一切 Docker 配置问题的第一命令。它能一次性输出服务器版本、存储驱动、镜像加速器配置、CPU/内存资源、默认运行时等关键信息。当你后面遇到磁盘空间不足、镜像架构不对、网络问题的时候都要先回到docker info看输出有没有异常。特别是存储驱动那一行绝大多数 Linux 环境是overlay2这是推荐的驱动类型。如果你看到vfs之类的老驱动说明配置不正确或内核模块没加载容器性能会受影响。8. 高频问题排查我踩过的坑一次性列全每个平台的常见问题都不太一样这里整理一个实战排查表再挑几个高频场景详细展开。平台典型报错常见原因处理办法WindowsWSL 2 installation is incompleteWSL2 内核未更新以管理员身份执行wsl --update重启WindowsDocker Desktop requires a newer WSL versionWSL 内核过旧在“设置-应用-可选功能”中更新 WSL或执行wsl --updateWindowsPorts are not available: listen tcp 0.0.0.0:8080: bind: An attempt was made to access a socket端口被其他进程占用换映射端口或netstat -ano找到 PID 后结束进程WindowsDocker Desktop 启动后一直转圈Hyper-V/WSL2 功能未开启“Windows 功能”里勾选“虚拟机平台”重启MacCannot connect to the Docker daemonDocker Desktop 未完全启动查看菜单栏鲸鱼图标确认引擎就绪等几秒重试Macexec format error镜像架构与 CPU 不匹配开启 Rosetta 模拟或者docker pull --platform linux/amd64 镜像名强制指定架构Mac镜像占用大量磁盘空间虚拟磁盘未自动回收Settings - Resources - Advanced 点“Clean / Purge data”LinuxCannot connect to the Docker daemondockerd 服务未运行sudo systemctl start docker并执行systemctl enable docker设为开机自启Linuxpermission denied while trying to connect用户不在 docker 组sudo usermod -aG docker $USER重新登录Linuxiptables failed: No such file or directory系统缺少 iptables 或存在冲突安装iptables包临时可重启 docker 服务验证8.1 WindowsWSL2 相关的坑最深我在帮别人排查时发现Windows 平台 80% 的问题都出在 WSL2 相关环节。最常见的是安装了旧版 WSL 内核导致 Docker Desktop 提示版本过低。处理方法很简单管理员 PowerShell 执行wsl --update然后wsl --shutdown重启。另一个隐蔽问题是企业环境中组策略禁用了 Hyper-V 或者虚拟化被超管平台占用比如安卓模拟器、VirtualBox 同时开启。我的建议是 Windows 开发机上不要把 Docker Desktop、VirtualBox、VMware 同时跑虚拟化后端会互相冲突。如果一定要共存用 Hyper-V 模式的 Windows 上选 Windows Containers 或调整 Docker Desktop 后端模式来解决但这属于较复杂场景了。8.2 Mac权限与磁盘空间是你最容易忽视的Mac 上 Docker 的问题不少是“权限”和“磁盘”两个字。比如企业环境分配的 Mac 整机在安装扩展应用时弹 “Docker Desktop is damaged and can’t be opened”这通常是系统安全策略拦截了未签名或未认证的应用需要到“系统设置 - 隐私与安全性”里手动允许。还有一个我碰到过两次的场景用户 Home 目录权限被改动过导致 Docker Desktop 启动后无法写入配置。可以检查~/Library/Containers/com.docker.docker目录是否存在且权限正确。磁盘空间方面Docker Desktop 的虚拟磁盘默认位于~/Library/Containers/com.docker.docker/Data/vms随着镜像积累文件会越来越大。如果发现磁盘告急不是去手动删这个文件可能损坏数据而是在 Docker Desktop 设置里执行清理。想要更精细地看镜像和容器占用的空间执行docker system df。8.3 Linux内核模块与防火墙的隐形坑Linux 平台的 Docker 问题往往和系统调用链有关。有一个我踩过多次的坑内核开启了一些安全模块后容器启动时报operation not permitted或chown相关错误。常见原因是容器内的进程需要提升能力而运行容器的用户命名空间映射出了问题。排查时可以先用docker run --rm --privileged测试是否解除限制后能跑如果--privileged能跑而普通模式不行再去查 Capabilities 和 Seccomp 相关配置前者看命令手册后者在 Docker 的 seccomp profile 里调整。防火墙也是隐形坑CentOS 上默认 firewalld 开着容器端口映射出来后外部机器访问不通但容器内外都能通。需要在防火墙里放行映射端口。Ubuntu 上如果装了 ufw默认策略也可能拦截 Docker 的端口转发。排查网络问题第一关注防火墙第二关注 SELinux。我个人实际跑过的登坑经历在某台 Ubuntu 22.04 上装了 Docker 后执行docker run总是报permission denied排查了很久才发现该用户的 shell 环境变量里设置了DOCKER_HOST指向了一个不存在的远程地址。所以在遇到诡异错误时先执行env | grep -i docker看环境变量这一步成本最低却常常解决问题。最后一件事装 Docker 这件事说实话只要条件满足、流程正确半小时内都能搞定。但真正决定使用体验的是装完之后你是否理解了它在你机器上是怎么运转的。Windows 和 Mac 多出来的那一层虚拟机不是什么魔法Linux 上的几条命令也不是唯一的解。把三个平台各装一遍你自然就明白官方文档为什么那么写社区里的报错为什么那么报。我个人的建议是把安装过程中遇到的每一个报错都记录一下这个积累比任何教程都有价值。等你以后帮别人排障时翻出自己当年的踩坑记录一句“这个问题我见过”就是最有用的答案。
返回列表