ARTICLE DETAIL

资讯详情

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

Docker安装配置实战:Windows、Mac、Linux三平台避坑指南

Docker安装配置实战:Windows、Mac、Linux三平台避坑指南 这个系列写到2.3正好轮到Docker安装配置这块硬骨头。网上教程一抓一大把但真到自己机器上Windows、Mac、Linux三个平台翻车的姿势各不相同而且几乎每个坑都能让人卡住半小时以上。这几天我把三台机器全部重装了一遍从WSL2后端到arm64架构从国内镜像加速到daemon启动报错把每一条命令背后的原因也重新查了一遍。这篇文章定位就是安装配置适合已经知道容器大概是什么、正准备动手装环境的读者也适合已经被各种报错折磨了半天的新手直接对照排查。命令给你配置给你坑也给你标出来照着做基本不会出大问题。1. 安装前先想清楚三平台选型不是随便选的1.1 Docker Desktop是默认答案但你要清楚它背后的机制不管你是Windows还是Mac官方给出的标准答案基本就是Docker Desktop这一个东西。很多人装上之后以为Docker就是那个鲸鱼图标点开就能用其实Docker Desktop只是个壳它把Docker Engine、命令行工具、Compose、Kubernetes全部打包成一个安装包并且通过内置的轻量虚拟机模拟出一个Linux环境。为什么非要虚拟机因为Docker容器本质上依赖Linux内核的命名空间、cgroups这些特性Windows和macOS的内核不认这一套必须在中间垫一层虚拟化才能跑起来。理解这一点特别重要因为你后面遇到的所有安装问题几乎都和这个设计有关。比如Windows上Docker Desktop一直显示Engine Starting十有八九是WSL2或者Hyper-V没配对Mac上老感觉Docker变慢了多半是给虚拟机分配的资源不够Linux上没有这个问题因为容器可以直接用宿主机内核这也是为什么Linux上根本不推荐装Docker Desktop直接装docker-ce就行了。选型逻辑很简单Windows和Mac的开发机用Docker Desktop最省事Linux的服务器、云主机直接用命令行装引擎干净利落。1.2 Windows的WSL2与Hyper-V之争为什么推荐WSL2Windows平台的Docker Desktop支持两种后端WSL2和Hyper-V。Docker官方其实早就把WSL2设为默认了原因很简单WSL2模式下虚拟机的启动速度快内存动态分配不会像Hyper-V那样开个虚拟机就固定吃掉几个G的内存而且WSL2的文件系统和Windows互操作性也好开发时经常要挂载本地目录体验差别很大。Hyper-V也不是没有用处它更稳定兼容性也更好但有一个很致命的问题Hyper-V一旦开启VMware、VirtualBox这些第三方虚拟机软件就没法用了如果你平时还要跑别的虚拟机装完Docker之后发现VMware启动报错那就很尴尬。还有一个容易被忽略的点无论哪种后端电脑的BIOS里都必须开启虚拟化Intel的VT-x或者AMD的SVM。很多老机器的虚拟化是默认关闭的Docker安装一切正常启动就失败最后发现是BIOS设置的问题这类事我见得实在太多了。1.3 macOS的Apple Silicon和Intel是两条路Mac这边的情况更分裂Apple Silicon和Intel芯片是两条完全不同的路线。M1、M2这些芯片是arm64架构Docker Desktop需要下载对应arm64版本安装包Intel的Mac还要下载x86_64版本。很多人不知道这点在官网下载的时候没注意看芯片型号装完之后打开一看系统直接提示“Bad CPU type”这就是架构不匹配了。选对架构只是第一步M系列芯片还有一个隐性坑部分老镜像没有提供arm64版本运行的时候会报出no matching manifest for linux/arm64/v8这样的错误。这时候你可以给docker run命令加一个--platform linux/amd64参数让Docker用模拟方式跑x86_64的镜像虽然性能会有损耗但至少能跑起来。这些细节在安装阶段看似用不上等真正用起来之后就是日常操作了。2. Windows平台安装从WSL2到Docker Desktop全流程2.1 第一步开启WSL2和虚拟机平台Windows上装Docker之前先把WSL2搞定。Win11系统就比较省事直接用管理员权限打开PowerShell执行一条命令wsl --install这条命令会帮你把WSL功能、虚拟机平台、以及默认的Ubuntu发行版一次全装好装完重启电脑。如果你的系统版本比较老Win10 1903之前那种可能需要手动开两个Windows功能用这两条命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启之后确认一下WSL的默认版本是2WSL1和Docker Desktop配合会出现很多文件系统和网络上的奇怪问题直接统一用WSL2wsl --set-default-version 2这里有个小提示如果执行wsl --install的时候网络状态不太好下载内核包可能卡在某个百分比不动多试几次一般就能过实在不行就用命令单独更新一下WSL内核。装好之后用wsl -l -v看看发行版列表VERSION列显示是2就说明没问题。如果你不想用Ubuntu也可以换成别的发行版在wsl --install -d后面指定发行版名称不过对Docker来说Ubuntu和Debian都是兼容性最好的选择。2.2 第二步安装Docker Desktop并完成基础配置WSL2就绪之后去Docker官网下载Windows版本的安装包这一步基本是双击下一步没有太多技术含量。装完之后打开Docker Desktop第一次启动会初始化和WSL2的集成稍微等几分钟。如果启动时报错说需要安装WSL内核组件按照提示下载安装即可。进入设置界面之后有四个地方需要手动确认。第一在General设置里确保Use the WSL 2 based engine是勾选状态第二在Resources的WSL integration选项里勾选你准备用的那一个WSL发行版第三把Docker Engine的配置JSON里加上镜像加速地址第五部分会详细讲第四确认一下Resources那栏的CPU和内存分配默认值通常够用如果你本机内存小于8G建议把Memory从默认值往下调一些不然Docker和日常应用容易抢内存。安装完成之后记得要把当前用户加入docker-users组吗不用Docker Desktop的安装程序一般已经处理好了。但有一点经常被忽略装完Docker Desktop之后最好注销一次Windows或者重启电脑让环境变量和用户组的配置完全生效。我见过不少装完直接开命令行执行docker命令结果提示找不到命令其实只是没有重启导致Path没刷新。2.3 第三步验证安装与资源占用控制Docker Desktop启动起来之后在终端里验证三件事docker --version docker compose version docker run hello-world前两个命令检查核心组件有没有装齐第三个命令会拉取一个测试镜像并运行一个容器整个过程走通就说明安装成功。如果docker run hello-world拉取镜像卡住不动多半是网络问题别急着重装先配置镜像加速再说。有一个让我很头疼的事就是WSL2模式下Docker对内存的占用。默认情况下WSL2会动态占用宿主机的内存最高能到机器物理内存的50%左右开发机内存小的话开了Docker之后电脑会明显变卡。解决办法是在用户目录下创建一个.wslconfig文件内容类似这样[wsl2] memory4GB processors4 swap4GB这个配置是给所有WSL2发行版用的设置之后执行wsl --shutdown再重新启动WSL配置才会生效。需要注意processors的值不能超过物理核心数设置太大反而会影响性能。改完配置之后Docker Desktop的运行内存就会稳定在限定值内。2.4 Windows专用避坑清单Windows上安装Docker的问题很杂我把踩过的坑整理一下现象原因处理方式Docker Desktop一直显示Engine StartingWSL2没正确启用或内核版本老执行wsl --updatewsl --shutdown后重开装完Docker后VMware无法启动虚拟机Hyper-V被开启和第三方虚拟机冲突改用WSL2后端或关闭Hyper-V功能docker命令提示无法连接到daemonDocker Desktop没启动或DOCKER_HOST环境变量残留确保启动Docker Desktop检查环境变量并清理拉取镜像超时或卡住默认官方仓库访问不稳配置国内镜像加速而不是反复重试磁盘空间被WSL2虚拟磁盘大量占用vhdx文件自动膨胀不回收压缩WSL2虚拟磁盘清理后再compact杀毒软件拦截Docker Desktop联网实时防护误报把Docker相关目录加入白名单有一条经验值得单独说Windows上装了代理工具这里指正常的网络调试工具或者配置了全局代理的docker命令经常反而报错连不上daemon因为代理把本地的命名管道通信也给接走了。遇到查找不到docker_engine这类报错可以先把系统代理关掉再试一次。3. macOS平台安装Apple Silicon和Intel分开讲3.1 官方安装包还是Homebrew两条路都讲清楚Mac上装Docker有两条主流路径一个是直接从官网下载dmg安装包拖进Applications目录就完事另一个是通过Homebrew安装命令是brew install --cask docker我个人的建议是如果你是M系列芯片的机器直接去官网下载安装包最省心因为官网会自动识别你的芯片型号给出正确的包如果是Intel的Mac两条路径差别不大。Homebrew的方式适合喜欢命令行管理软件的人卸载、升级都方便但前提是你得先把Homebrew本身调教好。无论哪种方式装完第一次打开时macOS会弹窗要求授予辅助功能权限或者输入管理员密码这是Docker Desktop在安装一些内核扩展和网络组件属于正常现象直接同意就行。如果这一步被拒绝了后面Docker Desktop会一直提示缺少权限重新去系统设置的隐私与安全性里补上即可。3.2 Homebrew安装时最容易翻车的三个点先说一下很多人在Mac上装Docker失败根子其实在Homebrew本身没装好Docker只是背锅的。排查顺序是这样的第一步先确认brew本身能用。执行brew --version如果提示command not found说明Homebrew压根没装成功先花十分钟把brew装好。国内网络环境下brew安装经常超时常规做法是配置国内镜像源设置HOMEBREW_API_DOMAIN、HOMEBREW_BOTTLE_DOMAIN、HOMEBREW_BREW_GIT_REMOTE这几个环境变量指向国内镜像然后重新执行安装脚本。配置完镜像源之后brew的下载速度会明显改善。第二步注意权限问题。Apple Silicon机器上Homebrew的默认安装目录是/opt/homebrew如果之前装过一次失败目录权限可能已经乱了brew install会报一堆Operation not permitted。简单粗暴的办法是sudo chown -R 当前用户名:admin /opt/homebrew把目录所有权收回来。第三步如果以前装过Docker Toolbox这种老古董一定要彻底清干净再装新版。残留的旧版Docker会和新版抢命令行工具导致docker --version输出的还是旧版本号。清理时除了删除Applications里的Docker.app之外还要把~/Library/Group Containers/group.com.docker、~/Library/Containers/com.docker.docker这些数据目录删掉才能回到干净状态。3.3 安装后的权限、资源与稳定性检查Mac上Docker Desktop装好之后有几个检查点。打开设置里的Resources选项卡看看CPU和内存分配。默认配置在M系列芯片上一般够用但如果你同时要跑好几个容器建议把内存提到4G以上。还有一个很多人不知道的地方Settings里的Advanced可以设置镜像存储位置如果你的Mac磁盘紧张可以把Docker的数据目录挪到外置硬盘或者大分区。从使用稳定性上说macOS大版本升级之后Docker Desktop出现网络异常的概率挺高比如容器能启动但访问不了外网DNS解析失败之类的。遇到这种情况很多人以为是自己的配置问题其实大概率是Docker Desktop和系统网络栈的兼容性出了岔子。处理方法也很朴素把Docker Desktop完全退出清掉它的缓存目录再重新启动基本都能恢复。如果还不行就去官网升级到最新版本新系统发布之后Docker官方一般会出修复版本别一直用老版本死扛。4. Linux平台安装二进制、脚本还是包管理器4.1 用官方仓库安装docker-ceDebian/Ubuntu系Linux是Docker的大本营安装方式也多但我强烈不建议用apt install docker.io这种方式因为系统仓库里的docker.io版本往往比较老与其后面遇到功能缺失再折腾不如直接上官方仓库的docker-ce版本。以Ubuntu为例完整步骤如下先卸载可能存在的旧版本sudo apt-get remove docker docker-engine docker.io containerd runc然后安装依赖并添加官方GPG密钥sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg这里解释一下这几条命令在做什么install -m 0755 -d是创建一个专门的目录存放GPG密钥文件gpg --dearmor是把下载的asc格式密钥转成二进制格式chmod ar是确保所有用户都能读取密钥这一步如果漏了后面apt-get update的时候会报错。接着添加软件源echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt-get update$(dpkg --print-architecture)会自动识别系统架构填成amd64或arm64不用手动改$(lsb_release -cs)自动识别Ubuntu版本代号。如果系统是Debian或者其他衍生版把仓库地址里的ubuntu换成debian即可。最后安装sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugindocker-compose-plugin很值得装现在Docker Compose作为插件直接集成在Docker CLI里用docker compose命令就能操作不用另外找二进制文件。4.2 国产Linux发行版的适配经验国产Linux系统比如统信UOS、麒麟这些在服务器领域用的也不少它们大多基于Debian或Ubuntu所以4.1那套流程基本能用但有个细节要注意这些系统的lsb_release -cs返回的代号可能不是标准的Ubuntu代号比如返回一个“eagle”之类的自定义代号导致软件源地址不存在。解决办法是手动指定Ubuntu的代号比如用focal或者jammy来替代$(lsb_release -cs)。如果系统是基于CentOS的那就走RHEL套路的安装流程sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl enable --now docker还要提醒一下有些国产系统的软件源里自带一个docker包如果你直接yum install docker装的是那个老版本不是官方docker-ce两者存在一些命令和配置上的差异后面排错容易分不清。所以在国产系统上能走官方仓库就优先走官方仓库。4.3 免sudo运行Docker的正确姿势Linux上装完Docker之后你马上会遇到一个烦人的问题每次执行docker命令都要加sudo否则报错permission denied while trying to connect to the Docker daemon socket。原因是Docker守护进程的socket文件/var/run/docker.sock默认只对root开放。解决办法是把当前用户加入docker组sudo usermod -aG docker $USER newgrp dockernewgrp docker是让当前终端会话立即切换用户组不用注销重新登录但新开的终端还是需要重新登录才生效。加入docker组之后docker命令就能直接用了。有一点必须提醒把用户加入docker组本质上等于授予了这个用户root权限因为Docker可以挂载宿主机目录、控制宿主机资源能做的事情非常多。自己开发用的机器这么配置完全没问题生产服务器上要慎重别随便把不相关的账号加进docker组。另外服务器装好之后检查一下docker服务状态systemctl is-active docker。如果需要开机自启执行sudo systemctl enable docker。5. 装完之后必须做的事镜像加速、验证与常用命令5.1 镜像加速配置解决拉取慢的第一板斧不管哪个平台安装完成之后第一件事就是配置镜像加速否则你拉取Docker官方镜像仓库里的镜像时会经常遇到超时、卡顿、直接失败的问题。这跟网络环境有关不是Docker本身的问题。Linux上的做法是修改/etc/docker/daemon.json{ registry-mirrors: [ https://你的专属加速地址.mirror.aliyuncs.com ] }然后重启Docker服务sudo systemctl daemon-reload sudo systemctl restart dockerWindows和Mac上的Docker Desktop更简单打开设置找到Docker Engine选项卡把同样的JSON配置加到现有配置里保存并重启Docker Desktop即可。我建议的镜像加速地址来源是去云服务商的控制台免费申请一个容器镜像服务的专属加速地址这类地址是绑定你账号的连国内主流云服务商都提供。也有一些公开的镜像加速站可以用但稳定性和速度波动较大有条件还是优先用自己申请的。配置好之后用docker info验证docker info | grep -A 2 Registry Mirrors能看到你配置的镜像地址就说明加速生效了。5.2 hello-world验证与第一个真实容器配置完镜像加速再次执行docker run hello-world这次应该很快就能看到输出内容它会告诉你Docker安装成功的各个步骤包括客户端、守护进程、镜像拉取、容器运行这几层都通了一遍。hello-world容器运行完就退出了因为它的任务就是打印一段验证信息。接下来跑一个真正有用的容器。以nginx为例docker run -d --name web -p 8080:80 nginx这条命令的含义是用nginx镜像创建并启动一个名为web的容器-d表示后台运行-p 8080:80把容器的80端口映射到宿主机的8080端口。容器起来之后浏览器访问http://localhost:8080就能看到nginx的欢迎页。如果之前因为网络问题拉取nginx镜像失败现在配置了镜像加速应该能顺利跑起来。想停掉和清理这个容器用docker stop web docker rm web到这一步三平台安装配置的完整链路就已经全通了后面就是大量使用中慢慢积累经验了。5.3 常用命令速查安装篇用到的基本就这些安装配置阶段你真正高频用到的命令就那么十几条整理成一个速查表命令作用docker version查看客户端和服务端版本信息docker info查看Docker运行状态和配置详情docker ps -a列出所有容器包括已停止的docker images查看本地已有的镜像列表docker pull 镜像名手动拉取镜像docker run -d -p 端口:端口 镜像名创建并启动容器docker logs 容器名查看容器日志排错第一利器docker exec -it 容器名 /bin/bash进入容器的交互式终端docker stop/start/restart 容器名停止、启动、重启容器docker rm 容器名删除容器docker rmi 镜像名删除镜像docker system prune -a清理所有不再使用的容器和镜像释放磁盘就算记不住全部也没关系docker --help是随时可以查的内置手册。新手最容易混淆的是docker rm和docker rmi一个是删容器一个是删镜像容器必须停止并删除之后才能删掉正在引用它的镜像。6. 真实踩坑记录从daemon报错到MySQL容器启动失败6.1 三平台共用高频报错与排查思路我把三个平台安装和使用过程中最高频出现的报错汇总成一张排查表遇到问题先对照一下报错信息常见原因处理方式Cannot connect to the Docker daemonDocker服务没启动或守护进程异常Linux检查systemd状态Windows/Mac确认Docker Desktop已启动permission denied while trying to connect当前用户不在docker组sudo usermod -aG docker $USER重新登录no matching manifest for linux/arm64/v8镜像没有当前架构的版本加--platform linux/amd64参数运行Get https://registry-1.docker.io/v2/: timeout网络访问官方仓库超时配置镜像加速避免反复重试port is already allocated宿主机端口已被占用docker ps查看占用情况换一个端口映射docker: command not found软件没装全或PATH没生效重新安装Windows/macOS注销重登排错这事的核心思路有两条先看服务端再看客户端先看日志再看配置。很多人一上来就查配置文件其实docker logs和系统日志往往已经直接告诉你了原因。6.2 Windows daemon报错实录非管理员终端的坑Windows上有一个很典型的报错场景信息大概是这样的你打开PowerShell执行docker ps结果提示无法连接到一个命名管道甚至看到类似start the windows daemon from a non-elevated terminal; shared clients的提示。第一次遇到的人很容易慌以为Docker没装好。这里面的门道是这样的Docker Desktop在Windows上的客户端和服务端是通过本地的命名管道通信的访问这个管道需要权限。如果你用一个管理员权限的终端执行docker命令而Docker Desktop本身是以普通用户身份启动的两边权限不匹配就会出现这种莫名其妙的连接失败。看起来很奇怪权限高了反而连不上。处理办法依次试把当前终端关掉重新打开一个普通用户权限的终端再试。确认Docker Desktop确实已经启动完成看任务栏的鲸鱼图标是否稳定不转圈。检查环境变量里有没有残留的DOCKER_HOSTPowerShell执行gci env:DOCKER_HOST如果有输出就Remove-Item env:DOCKER_HOST。执行wsl --shutdown把所有WSL发行版停掉重启Docker Desktop让WSL2后端重新初始化。以上都不行彻底退出Docker Desktop后重新启动再不行就重启电脑。还有一种情况这个报错会出现在Windows服务里配置了Docker引擎的机器上那就要检查Windows服务列表里docker相关的服务是否正常启动。但Docker Desktop标准安装一般不会注册成Windows服务遇到这个报错基本就是权限和后端的问题按上面几步处理九成能解决。6.3 Linux下MySQL与Redis容器启动失败复盘装完Docker之后大家最常干的事就是先拉一个MySQL或者Redis跑起来这两个也是最容易出问题的。先说MySQL。我见过最多的失败场景是这样的docker run mysql:8.0执行之后容器一直在启动、退出、重启之间循环。用docker logs mysql看日志原因通常有四类。一是没有设置MYSQL_ROOT_PASSWORD环境变量MySQL初始化阶段直接报错退出二是宿主机挂载目录的权限不对容器里的mysql用户写不进数据目录三是3306端口被宿主机自己装的MySQL占用了四是系统内存不足MySQL 8.0初始化时内存开销比较大。正常的启动命令参考这个docker run -d --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD你的密码 \ -v /data/mysql:/var/lib/mysql \ mysql:8.0注意宿主机挂载目录/data/mysql要提前建好并且把属主改成uid 999因为MySQL官方镜像里的mysql用户uid是999mkdir -p /data/mysql chown 999:999 /data/mysqlRedis相对简单但很多人搞不清主从怎么一次性拉起来。主节点docker run -d --name redis-master -p 6379:6379 redis:7 redis-server --appendonly yes从节点docker run -d --name redis-slave -p 6380:6379 redis:7 redis-server --replicaof 主节点IP 6379这里要注意新版Redis用--replicaof旧版才用--slaveof。另外从节点的--replicaof参数指向的是主节点在Docker网络内的IP如果你用docker ps看到两个容器都在同一个宿主机上可以直接用宿主机IP或者先把两个容器加入同一个自定义网络再用容器名互相访问后一种更稳定。6.4 磁盘与内存的清理容器用久了磁盘和内存也是大问题。Linux上/var/lib/docker目录会慢慢膨胀里面是镜像层、容器层、卷数据、构建缓存。清理命令是docker system prune -a这个命令会把所有停掉的容器、没被容器使用的镜像、没用的网络全部清掉释放效果明显。但要注意如果你有些镜像只是暂时没用清完之后下次拉取还要重新下载所以执行之前先看一眼docker system df确认一下磁盘占用情况。Windows上WSL2的虚拟磁盘文件ext4.vhdx也会不断增长就算你在容器里删了大量文件宿主机上的vhdx文件也不会自动缩小。压缩办法是先wsl --shutdown然后以管理员身份打开diskpart或者直接用PowerShell相关命令对%LOCALAPPDATA%\Docker\wsl\data\ext4.vhdx执行compact操作。Mac上同理Docker Desktop的数据目录在~/Library/Containers/com.docker.docker如果磁盘空间吃紧也要定期清理容器和镜像而不是光删文件。我自己在不同电脑上装Docker重复了不下二十遍最大的体感是别急着敲命令先把平台的后端机制搞清楚。Windows就先去确认WSL2Mac就先去确认芯片架构Linux就先去确认发行版方向对了剩下的就是按步骤往下走。真遇到报错也不要第一反应就是卸载重装学会看日志多跟错误信息正面交锋几次很多问题其实只是几个环境变量、一个端口占用、一次权限设置的事。如果后面还想再进阶可以按照这个思路往下试把MySQL和Redis都跑起来之后再用docker compose把两个服务组合到一起编排那又是容器化另一个阶段的日常了。
返回列表