
装Docker这件事网上教程一搜一大把但真到自己动手的时候各种报错还是能把人折腾到怀疑人生。尤其是Windows和Linux两套玩法完全不一样镜像拉不下来、服务启动失败、权限报错……每个坑都有无数人踩过。这篇东西我就把几年里装Docker踩过的坑、填过的土全部倒出来从零开始把每一步的为什么讲清楚照着抄作业就行。我先说清楚这篇指南会覆盖什么Linux下Ubuntu和CentOS的完整安装流程Windows下Docker Desktop配合WSL2的安装和避坑镜像加速的配置还有最常见的权限、启动、网络问题排查。不管是做开发、搭个人服务器还是纯粹想学容器技术这篇都可以作为你的第一份Docker安装参考。1. 装Docker前先搞清楚这几件事很多人在安装阶段就卡住其实不是操作问题而是对Docker的运行机制缺乏基本认知。先花五分钟搞清楚下面几件事后边能少走很多弯路。1.1 Docker不是虚拟机别用虚拟机的思路理解它Docker和传统虚拟机最大的区别在于虚拟机模拟整个硬件环境每个虚拟机里都有一套完整的操作系统而Docker直接复用宿主机的操作系统内核通过Linux内核的Namespace和Cgroups技术实现资源隔离和限制。这也是Docker镜像小、启动快、资源占用低的根本原因。这个区别带来几个直接后果第一只要你的操作系统内核是Linux理论上就能跑Docker容器。Windows和macOS不能直接运行Linux容器所以Windows上需要WSL2或Hyper-V提供Linux内核环境Docker Desktop本质上是帮你把这一层封装好了。第二容器里没有独立内核所以不要在容器里执行升级内核之类的操作。有些镜像基于精简版Linux发行版构建连systemd都没有这很正常。第三Docker的性能开销比虚拟机小得多但也意味着隔离性不如虚拟机彻底。在生产环境跑多租户容器要额外考虑安全加固。理解这些之后很多安装过程中的现象就能解释通了。比如Windows安装时报“virtualization support not detected”本质就是WSL2依赖的虚拟化平台没开Linux下报“Cannot connect to the Docker daemon”本质就是客户端和服务端通信出了问题。1.2 明确你的使用场景决定装哪个版本Docker分两个大版本社区版CE和企业版EE。个人开发者、小团队、实验室环境用社区版完全够了功能和稳定性都很靠谱。企业版多了些管理、安全方面的功能普通场景用不上。具体到操作系统Linux直接用命令行安装docker-ce社区版没有图形界面需求这也是最推荐的生产环境方案。Windows装Docker Desktop它会自动管理Linux后端提供图形界面和一键操作体验配合IDE开发非常丝滑。macOS同样用Docker DesktopIntel芯片和Apple Silicon芯片的安装包不同别下错。如果你只是想在Linux服务器上跑几个镜像完全不需要Docker Desktop也别装。Docker Desktop更适合开发环境生产服务器上跑桌面版是给自己添堵。1.3 安装前的系统检查清单动手之前先花两分钟确认系统状态能省下后面排查报错的大量时间。系统版本Ubuntu 18.04及以后、CentOS 7及以后都能顺利安装。太老的版本依赖包容易出问题不建议使用。内核版本Linux内核建议3.10以上。用uname -r查看过老的内核会出现存储驱动不兼容的问题。虚拟化支持Windows用进入BIOS/UEFI确认Intel VT-x或AMD-V已开启。同时确认Windows功能里的Hyper-V和虚拟机平台没有关闭。磁盘空间Docker本身占不了多少空间但镜像和容器数据会随着使用膨胀。建议预留10GB以上空闲空间。网络环境安装过程需要从软件源拉取包需要能正常访问软件源。国内环境建议直接配置国内镜像源后面单独讲。检查完这些安装过程会顺畅得多。别问为什么我知道问就是曾经在没开虚拟化的Windows上装了半小时Docker Desktop最后发现是BIOS里关掉了VT-x。2. Linux安装DockerUbuntu和CentOS全流程Linux下安装Docker网上教程最多的就是Ubuntu和CentOS两个分支。这俩系统的包管理器完全不同安装命令也从根上不一样。我把两条路线的完整流程都写出来你按自己的系统跟着走就行。2.1 Ubuntu/Debian系安装Docker完整步骤先说明一点不要直接apt install docker或apt install docker.io。这两个包虽然能装但版本陈旧且Docker官方推荐的是安装docker-ce社区版功能更新更及时。第一步清理可能存在的旧版本如果你的系统之前装过Docker或者自带了docker.io先把它们清干净sudo apt remove docker docker-engine docker.io containerd runc这一步不会删除你的镜像、容器和数据卷它是安全的放心执行。如果你确定系统很干净跳过也没问题。第二步安装依赖工具sudo apt update sudo apt install ca-certificates curl gnupg lsb-release这几个工具负责后续的证书验证和源添加。ca-certificates是CA证书库curl用于下载文件gnupg用于验证GPG密钥lsb-release用来识别系统版本。第三步添加Docker官方GPG密钥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为什么要验证密钥Debian系的软件来源可靠性完全建立在GPG签名验证上。添加密钥后apt安装的包才保证是Docker官方发布的防止被人篡改。--dearmor的作用是把从网络获取的ASCII格式密钥转成二进制格式存储。第四步添加Docker软件源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注意如果你的服务器下载Docker官方源非常慢可以换成国内源。这里以清华源为例echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null用国内源的话后面apt update的速度会有质的提升。实测从官方源拉取包经常只有几十KB每秒换清华源能到几MB每秒。第五步正式安装sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin我建议把docker-buildx-plugin和docker-compose-plugin一并装上。buildx用来自定义构建平台后面打包多架构镜像时用得着compose是管理多容器编排的标配工具做Redis主从、MySQL集群这类部署一个docker-compose.yml全搞定比手敲一串docker run命令优雅太多。第六步启动并设置开机自启sudo systemctl start docker sudo systemctl enable dockerenable会在系统启动时自动拉起Docker服务。服务器重启后Docker自动运行不需要手动干预。第七步验证安装sudo docker run hello-world能正常输出“Hello from Docker!”说明安装成功。这个测试镜像只有几KB会从远端拉取拉取速度受网络影响稍等一下就好。2.2 CentOS/RHEL系安装Docker完整步骤CentOS 7默认源里的docker版本太老官方推荐用docker-ce仓库。CentOS 8的情况复杂一些部分版本和官方源兼容性不好我建议尽量用CentOS 7.9或Rocky Linux 8以上版本。第一步卸载旧版本sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine如果你的CentOS系统里曾经装过podman或buildahCentOS 8自带了这两个也建议一并卸载或至少确认它们不冲突否则后面启动Docker时可能抢占containerd的端口。第二步安装依赖工具sudo yum install -y yum-utilsyum-utils提供了yum-config-manager命令用来管理软件仓库配置。第三步添加Docker软件源官方源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-pluginCentOS安装过程中如果提示有冲突依赖优先选择卸载冲突包后重试而不是使用--nobest强行绕过否则后患无穷。第五步启动并验证sudo systemctl start docker sudo systemctl enable docker sudo docker run hello-world2.3 免sudo使用Docker的正确姿势这一步很多人容易忽略直接导致后面运行docker ps时遇到“Got permission denied while trying to connect to the Docker daemon socket”的权限报错。原因在于Docker守护进程默认以root身份运行socket文件/var/run/docker.sock也归root所有。普通用户直接访问必然被拒。解决办法是把当前用户加入docker组sudo usermod -aG docker $USER然后注销重新登录或者执行newgrp docker让组权限立即生效。此后不需要再加sudo前缀了。这里必须提醒一句加入docker组的用户等同于拥有root权限。因为docker组用户可以挂载宿主机目录、执行特权容器甚至可以读取宿主机所有文件。生产环境给用户加docker组要慎重你等于把整个宿主机的钥匙交给了这个人。2.4 用二进制包离线安装的场景有些服务器在内网环境无法直接访问外网软件源。这种场景下需要在一台能联网的机器上提前下载好rpm或deb包拷贝到内网后离线安装。以CentOS为例# 在联网机器上下载 yum install --downloadonly --downloaddir/tmp/docker-packages docker-ce docker-ce-cli containerd.io # 拷贝到内网机器后执行 rpm -ivh /tmp/docker-packages/*.rpmUbuntu下用apt download不太好处理依赖前提是内网机器上已有大部分基础依赖。更省事的做法是直接下载Docker官方提供的静态二进制包wget https://download.docker.com/linux/static/stable/x86_64/docker-XX.tgz tar -xzvf docker-XX.tgz sudo cp docker/* /usr/bin/ sudo dockerd 静态二进制包的方式适合极简环境但少了init脚本需要自己处理后台运行和开机自启。日常使用我还是推荐标准安装流程。3. Windows Docker Desktop安装完整流程Windows上跑Docker本质是在Windows系统里运行一个Linux虚拟机再在这个虚拟机里跑容器。Docker Desktop做的是把这层封装好给你提供开箱即用的体验。3.1 升级到WSL2推荐的后端方案Windows上跑Linux容器的后端有两个选择WSL2和Hyper-V。我推荐WSL2理由很简单启动速度比Hyper-V模式快得多内存占用更小而且能直接在Windows终端里敲docker命令访问。当然最核心的Intel的磁盘性能在WSL2上比旧版本强很多这个对容器里的数据库场景特别重要。先确认Windows版本Windows 10 2004版及以上或Windows 11才支持WSL2。老版本系统建议先升级Windows。以管理员身份打开PowerShell执行# 启用WSL功能会要求重启系统 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启之后进入命令行安装WSL2内核更新包。微软官网有专门的WSL2 Linux内核更新包下载安装即可。然后把默认版本设为WSL2wsl --set-default-version 2如果你之前装过WSL1的发行版需要单独转换wsl --set-version Ubuntu 2这里常见的坑是转换过程卡在百分之四十左右等一会儿不动了多半是系统里残留了老版本WSL或者没有安装内核更新包。重新执行内核更新包安装基本能解决。3.2 Docker Desktop下载安装与初始配置到Docker官网下载Docker Desktop安装包。下载页面会自动识别Windows版本提供对应安装包。安装包有几百MB国内网络下载慢的时候可以试试配置代理或者从镜像站下载。双击安装一路默认即可。安装过程中会有个选项问你是用WSL2还是Hyper-V选WSL2。安装完成后启动Docker Desktop首次启动会初始化WSL后端需要一两分钟。此时托盘区会显示Docker图标如果一切正常图标会从黄色变成绿色。验证是否安装成功docker --version docker ps能正常输出版本信息和空列表说明Docker Desktop已经和WSL2后端对接成功。3.3 Windows安装高频报错与修复安装Windows版Docker几乎每个人都会遇到几个报错。我把高频的几个列出来“Docker Desktop failed to start because virtualization support is not detected”这个报错就一个字虚拟化没开。去BIOS里把Intel VT-x或AMD-V开启然后在Windows功能里确认“虚拟机平台”和“Windows虚拟机监控程序平台”都已启用。执行以下命令后重启dism.exe /online /enable-feature /featurename:HypervisorPlatform /all /norestart“WSL 2 installation is incomplete”这是WSL2内核更新包没装或没装全。重新去官网下载WSL2内核更新包安装后再wsl --version确认版本信息。“Docker failed to connect to the Docker API at npipe:////./pipe/dockerDesktopLinuxEngine”这个报错几乎都是Docker Desktop的后端引擎还没完全启动或者启动失败。等托盘图标变绿后重试。如果长时间卡住多半是WSL2后端起了冲突。执行wsl --shutdown后重新启动Docker Desktop屡试不爽。“Docker Engine stopped”一般是WSL发行版损坏或者磁盘空间不足日志里会写清楚原因。先把%LOCALAPPDATA%\Docker下的日志翻出来看看问题基本都写在里面。常见原因包括磁盘剩余空间小于2GB导致镜像临时层写入失败或者和杀毒软件的驱动冲突。3.4 主机和容器网络不通的排查方向Windows下用Docker网络架构比较特殊。Docker容器通过NAT方式访问外部网络而宿主机访问容器时走的是推荐转发端口。容器之间互通靠自定义网络我一般第一件事先建自定义bridge网络而不是默认的bridgedocker network create mynet docker run --network mynet --name mysql ... docker run --network mynet --name redis ...这样容器之间可以直接用服务名互相访问省去了查IP的麻烦。出现网络不通按照三个层面排查第一看容器本身的网络配置docker exec 容器名 cat /etc/resolv.conf确认DNS是否正常第二检查防火墙是否放行了对应端口第三用docker network inspect查看网络里的容器连接情况。4. 镜像加速源配置解决下载慢的痛镜像下载慢是所有国内Docker用户逃不过的体验。官方镜像源放在海外直接拉取动辄几分钟十几分钟甚至超时失败。解决办法就是配置镜像加速器。4.1 为什么需要镜像加速原理是什么Docker拉取镜像的时候会先向镜像仓库请求manifest信息然后按层下载。官方Docker Hub服务器部署在世界各地但国内直连延迟高、速度慢尤其是一些大镜像比如MySQL、Redis、GitLab、Hadoop这些动辄几百MB甚至几个GB的。镜像加速器的原理就是在国内部署一层缓存和代理。你请求镜像时加速器会从官方源拉取数据并缓存到本地节点同时直接把已缓存的数据传给你。第一次下载可能还是慢但从第二次开始速度会飞跃。4.2 Linux下配置镜像加速源Docker的镜像加速配置文件是/etc/docker/daemon.json。如果文件不存在新建即可sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.nju.edu.cn ] } EOF sudo systemctl daemon-reload sudo systemctl restart dockerregistry-mirrors可以配置多个Docker拉镜像时会依次尝试哪个快用哪个。注意镜像加速源是个玄学不同地区、不同时间段速度差异很大我给出的是综合下来比较稳定的几个你也可以用云厂商提供的加速器比如阿里云容器镜像服务的专属加速地址每个账号一个专属域名更稳定。配置完之后用docker info查看输出中的Registry Mirrors段落确认配置已生效。4.3 Windows Docker Desktop配置镜像加速Docker Desktop也支持配置镜像加速。点击托盘区Docker图标进入Settings找到Docker Engine选项卡在registry-mirrors字段中添加同样的地址然后点击Apply Restart即可。有个小技巧Docker Desktop切换引擎模式后配置可能会被重置需要重新设置。修改变量前先备份一下配置防止掉链子。4.4 拉镜像确认加速效果配置完成后实际拉一个镜像试试docker pull mysql:8.0注意观察拉取过程中的输出如果显示速度在几十MB/s甚至更高说明加速生效了。如果仍然很慢试试换个镜像源或者直接用代理网络下载后导出再导入也是各大型企业内网常用的救急方案。5. 常用Docker命令速查与概念扫盲安装完成只是第一步真正实用的是日常操作。我整理了一份高频命令清单新手先背熟这些后面再慢慢扩展。5.1 镜像生命周期管理搜索镜像docker search mysql拉取镜像docker pull mysql:8.0可以指定tag不指定默认latest。生产环境强烈建议指定明确版本别用latest不然哪天一更新就喜提bug。查看本地镜像docker images删除镜像docker rmi 镜像ID或名称镜像删除不掉时检查一下有容器正在使用该镜像。先删容器再删镜像。5.2 容器生命周期管理运行容器docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:8.0-d后台运行--name指定容器名-p映射宿主机与容器端口-e传入环境变量。这几个参数是最高频的。查看运行中的容器docker ps加上-a可以查看所有容器包括已停止的排查问题经常用。日志查看docker logs -f 容器名容器启动失败、服务异常先看日志。-f实时追踪退出按CtrlC。进入容器内部docker exec -it 容器名 /bin/bash用这个方式进入容器排查环境、修改配置。容器里可能没有bash改成/bin/sh即可。停止/启动/重启容器docker stop 容器名 docker start 容器名 docker restart 容器名删除容器docker rm 容器名删除前先停止容器加-f可以强制删除运行中的容器。5.3 数据卷与端口映射容器删除后数据会丢失所以数据一定要挂载到宿主机docker run -d \ --name mysql \ -p 3306:3306 \ -v /opt/mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD123456 \ mysql:8.0-v /opt/mysql-data:/var/lib/mysql的含义是把宿主机的/opt/mysql-data目录挂载到容器内的/var/lib/mysql路径。容器里面写的所有数据都会实时写回宿主机目录备份、导出、迁移都方便。5.4 Dockerfile构建自定义镜像如果官方镜像不能满足需求可以基于现有镜像自己做定制。写一个简单的DockerfileFROM ubuntu:22.04 RUN apt update apt install -y nginx COPY ./index.html /usr/share/nginx/html/ EXPOSE 80 CMD [nginx, -g, daemon off;]构建docker build -t my-nginx .运行docker run -d -p 8080:80 my-nginxDockerfile的编写有大量细节包括层缓存优化、多阶段构建等我们后续可以单独写一篇展开。6. 常见安装问题排查与避坑实录最后这部分是最有价值的实战内容。我把安装和日常使用中最常见的错误集中列出来每个都附上排查思路和解决方案。6.1 Docker权限错误Got permission denied报错信息Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock排查思路当前用户不在docker组里。解决办法就是前面说的sudo usermod -aG docker $USER newgrp docker注意newgrp docker是临时刷新不是永久生效。重启或注销永久生效。如果你已经加过组还是报这个错误检查一下当前用户确实没有加入成功id看输出里有没有docker这个组。6.2 Docker服务启动失败排查Linux下执行sudo systemctl start docker结果提示失败怎么排查第一步看状态systemctl status docker输出里通常会有红色的错误信息仔细读。第二步看完整日志journalctl -u docker --no-pager -n 50这一步能告诉你九十%的失败原因。常见的有报错“starting container process caused process_linux.go: no such file or directory”通常是镜像缺了可执行文件或者路径不对不是启动服务的问题。重新检查镜像内部的命令路径。报错“failed to start daemon: error initializing graphdriver: devicemapper”多见于老版本CentOS内核与存储驱动不兼容。升级内核到3.10以上或者换用overlay2驱动。手动改/etc/docker/daemon.json加上{ storage-driver: overlay2 }重启Docker生效。报错“iptables failed: iptables --wait -t nat -A DOCKER...”防火墙规则冲突。重启iptables或firewalld后再启动Dockersudo systemctl restart firewalld sudo systemctl start docker或者直接清空iptables规则重来过sudo iptables -F sudo iptables -t nat -F sudo systemctl restart docker生产环境别直接清空iptables注意斟酌。6.3 容器跨主机网络通信问题装好Docker后容器之间通信正常但跨主机通信出现问题。这种场景一般涉及网络模型选型。单机环境直接用bridge网络即可。多机部署可以考虑overlay网络需要Swarm或Kubernetes配合或者macvlan。如果是简单场景直接用宿主机端口映射反向代理就能搞定。排查跨主机网络问题时思路优先级宿主机之间能否直接ping通防火墙是否放行所需端口容器内能否访问宿主机网关确认是否走了正确的网络模式常见错误是两台机器不在同一网段防火墙规则又不一致结果两边容器各跑各的网络完全隔离。这种环境建议把所有宿主机的防火墙规则统一管理或者用overlay网络彻底绕开宿主机的网络栈。6.4 docker-compose常见错误提示“version is obsolete”老版本compose文件里的version: 3在新版本里已经不推荐写了删掉这行即可不影响功能。提示“network abc not found”或“network was found but has incorrect type”通常是因为compose文件里的网络配置和实际docker网络冲突。在compose文件底部添加网络声明networks: mynet: driver: bridge服务下面声明使用网络services: mysql: networks: - mynet提示“Error response from daemon: driver failed programming external connectivity”端口映射失败一般是对外端口被宿主机其他进程占用。检查端口占用sudo netstat -tlnp | grep 3306换端口或者停掉占用进程即可。6.5 Windows下docker pull失败的另类解法如果镜像加速配置好了仍然下载慢还有几个偏方可以救急方法一用代理拉取。在Docker Desktop的Settings里配置HTTP代理镜像下载会走代理通道。但对部分大型镜像代理的带宽仍是瓶颈。方法二换直接用国内可访问的镜像源。某些镜像官方源本身就有限速比如GitLab社区版的镜像就算加速了速度也不可观。这种时候建议直接下载离线包导入到本地docker load -i gitlab-ce.tar方法三优先使用更小体积的列表。比如MySQL有官方精简版、Redis的alpine版本体积差几十倍。能用小镜像绝不用大镜像。6.6 网络不通排查从容器内部看出去容器内网络不通很多人第一反应是把所有防火墙规则关了其实问题往往没那么复杂。写一个小脚本把容器里的网络状态全量打印出来docker exec 容器名 sh -c ip addr; echo ---; ip route; echo ---; cat /etc/resolv.conf; echo ---; ping -c 2 8.8.8.8逐步排查ip addr看容器是否有IP地址没IP属于网络模型分配问题ip route看默认路由是否存在缺路由出不去cat /etc/resolv.conf看DNS是否正常DNS不对域名解析会失败ping 8.8.8.8测试到外网是否通不通则是NAT或防火墙问题按照这个顺序排查大部分网络问题十分钟内能定位到问题层级。别一上来就怀疑网卡驱动大多数时候都是DNS配置或者默认路由丢了。最后分享一个实操中的小技巧经历过太多次Docker安装翻车后我个人的习惯是装完第一件事不急着跑业务容器先拉一个hello-world确认链路通再跑一个docker run -d --name nginx --restartalways -p 80:80 nginx测试网络映射。这两步过了说明整个Docker环境已经稳定可靠剩下的事无非是业务层面如何用。另外一个提升幸福感的小细节给家里的服务器配置好自动清理策略。跑一阵子Docker后悬空镜像和停止的容器会越堆越多占着磁盘不干活。定期清理一次docker container prune -f docker image prune -f新学的朋友不建议用docker system prune -a这种重型命令容易把还在用的镜像标记清掉到时候又要重新拉取。用我给的这两个温和命令删掉的是退出状态的容器和无tag的悬空镜像安全性高得多。装了Docker只是第一步真正用得顺手还得靠日常积累。这篇指南覆盖了从环境准备到故障排查的全链路照着操作基本不会再被安装阶段卡住。后面有时间我再整理一篇Docker常用容器部署指南把数据库、缓存、消息队列这一套典型应用的容器化配置都给出来到时候配合这篇安装指南直接就能搭起一套可用的开发环境了。