Docker安装全指南:从概念到实操,分平台详解与排错

发布时间:2026/9/18 2:30:08
Docker安装全指南:从概念到实操,分平台详解与排错 写这篇东西之前我先把话说前面装Docker这件事网上教程一抓一大把但绝大多数只告诉你“敲这几条命令”没说为什么敲、敲完报错怎么办、装完又该干嘛。我这些年从自己电脑到公司服务器从Windows到Ubuntu再到CentOSDocker装了不下几十次踩过的坑比官方文档里写的多得多。这篇就把装Docker这件事从头到尾捋一遍从核心概念到分平台实操从装完后的初始化配置到高频报错排查一次讲透。不管是刚接触的小白还是想在服务器上部署环境的老手照着往下走就行。1. Docker到底解决什么问题值得花时间装它1.1 用一句话说清楚Docker是什么Docker是一个容器化平台它能把你的应用和它依赖的运行环境打包成一个标准化的单元这个单元就叫“镜像”跑起来之后叫“容器”。如果你没接触过虚拟化我打个比方虚拟机相当于你租了一套毛坯房想住进去得自己装修、买家具而且占地方容器则更像标准集装箱货物装进去箱子一锁不管运到哪个港口用标准起重机一吊就能用。Docker容器共享宿主机的操作系统内核但它自己有一套完整的文件系统和进程空间所以在容器里跑起来的东西和宿主机上其他程序互不干扰。这也是为什么Docker能解决那个困扰开发者多年的老问题代码在同事电脑上跑得好好的到你电脑上一启动就崩最后发现是环境不一致。有了Docker你把应用连同运行环境一起打包成镜像任何人拿过去都跑得一模一样这就叫“一次构建到处运行”。1.2 装完Docker你能干什么Docker装好之后它的价值会体现在非常多的场景里我给你列几个最常见的本地开发需要中间件比如你要在本地调代码需要MySQL、Redis、Nginx、RabbitMQ没有Docker前你得挨个去官网下载、解压、改配置、配环境变量折腾一上午有Docker后一条命令几秒钟就起一个干净的实例测完删掉也不留垃圾。项目一键部署你写了一个后端服务打包成镜像推到仓库服务器上一条docker pull加docker run就完成了部署不再需要手动安装运行时环境也不用担心服务器上多版本冲突。微服务和CI/CD现在主流的后端项目都是微服务架构几十个服务要靠Docker来进行统一管理和编排配合CI/CD平台做到代码提交后自动构建镜像、自动发布。测试环境隔离需要兼容不同版本的软件时就特别明显比如有的老项目要PHP 5有的要PHP 8Docker可以同时跑互不干扰。所以装Docker这件事受益最大的就是后端开发、运维、测试工程师以及那些经常需要在本地搭一套环境的同学。前端如果想在本地快速启动一些依赖服务同样用得着。1.3 先理解几个名词避免后面晕头转向安装过程中你会碰到几个高频术语我先把它们扳扯清楚后面看报错信息不至于一头雾水镜像Image一个只读的模板相当于一个压缩好的“系统安装盘”。你从镜像仓库拉取的就是它。容器Container镜像运行后的实体相当于装好系统的电脑。容器可以被启动、停止、删除每次启动基于同一个镜像但容器内的改动不会影响镜像本身。守护进程DaemonDocker的后台服务负责管理镜像、容器、网络等核心资源。你在终端里敲docker命令时其实是客户端在跟这个守护进程通信。仓库Repository存放镜像的地方。Docker Hub是默认公共仓库国内也会用阿里云、腾讯云、中科大等镜像加速站。Dockerfile一个文本文件里面写了构建镜像的指令比如“基础镜像用哪个”“拷贝哪些文件进去”“容器里执行什么命令”。这些概念在安装阶段不需要完全掌握但装完之后你一定会频繁和它们打交道。现在心里有个数就行。2. 安装前先做选择题平台、版本、网络2.1 你的系统属于哪种安装路线很多人一搜“装Docker”直接照着别人教程一顿操作结果命令全部报错原因就是没分清自己的系统该走哪条路。Docker安装路线基本按系统分三大类Windows正规做法是安装Docker Desktop for Windows它自带图形界面背后依赖Hyper-V或WSL 2。注意Windows家庭版在早期版本上Hyper-V支持不完整所以现在官方普遍推荐用WSL 2后端这个我们后面细说。macOS同样装Docker Desktop for Mac下载dmg文件拖进Applications目录就行。Linux服务器或桌面版这里绝大多数情况下只需要安装Docker Engine也就是纯命令行版本没必要装Docker Desktop。Linux下的Docker Engine没有图形界面配置和操作都通过终端完成但这也是服务器环境最稳定、最省资源的方案。千万别把Windows教程里的命令搬到Linux服务器上反过来也一样。有些教程写“下载安装包后双击运行”那只适用于Windows和macOSLinux有自己的包管理器路径完全不同。2.2 Docker Engine 和 Docker Desktop 到底有什么区别Docker Desktop是Docker官方为开发人员做的一体化工具它把Docker Engine、图形界面、docker compose、Kubernetes扩展集成在一起开箱即用。对本地开发来说非常友好能直观看到当前有哪些镜像、哪些容器还能一键启动和停止。但Docker Desktop有一个关键限制它面向个人开发者免费大型企业使用需要购买商业授权。而Linux服务器上直接装的Docker Engine也就是docker-ce是完全开源的不存在这个授权问题所以生产环境无一例外都是直接装Docker Engine而不是Docker Desktop。你的云服务器、物理机、虚拟机里全都是后者。所以结论是个人电脑上做开发装Docker Desktop图省事服务器上部署、运行应用一定装Docker Engine。2.3 安装前确认三件硬件和系统条件不论哪个平台安装之前建议先自查这三件事能少踩一半的坑操作系统是64位且版本不能太老。Windows需要Win 10 64位专业版/企业版/教育版或更新版本Win 11全系都可以macOS需要较新的版本Linux主流发行版近几年版本都支持但太老的比如CentOS 6就无能为力建议用CentOS 7以上的版本。内存建议至少4GB实际体验8GB更稳。Docker本身占资源不算多但你一旦跑起MySQL、Redis、Nginx好几个容器内存小了系统会很卡。虚拟化功能必须在BIOS里开启。对Windows用户来说尤其关键到时候Docker Desktop启动时如果报“virtualisation support wasnt detected”就是这个原因。开机进BIOS不同品牌按键不一样一般是F2、Del、F10等找到Intel VT-xIntel或AMD-VAMD选项设为Enabled。现在的主流电脑默认开启但部分品牌出厂是关着的。确认完这三条就可以根据你的平台走对应的安装流程了。3. 分平台安装实操照着抄就行3.1 Windows 安装 Docker Desktop 完整步骤Windows上装Docker Desktop我建议直接选WSL 2作为后端这比老牌的Hyper-V更轻量、启动更快也是官方现在的默认推荐。第一步先确保WSL开启。打开PowerShell管理员身份执行wsl --install这个命令会安装WSL 2和默认的Linux发行版通常是Ubuntu。装完后可能需要重启电脑。如果已经装过WSL想确认版本可以执行wsl --status如果版本是1需要升级成2执行wsl --set-default-version 2。第二步去Docker官网下载Docker Desktop for Windows安装包。官网会根据你的系统自动匹配版本下载下来的是exe文件。双击运行安装过程中会有一个选择后端界面的选项勾选“Use WSL 2 instead of Hyper-V”然后一路Next等待安装完成。第三步安装完成后启动Docker Desktop。首次启动它会要求你接受协议然后等一会儿右下角鲸鱼图标变成绿色就说明启动成功。打开终端执行docker version能正常显示客户端和服务端版本信息说明Windows上的Docker已经彻底装好了。这里有个很多人问的点装完Docker Desktop后自己电脑上原来的虚拟机软件比如VMware或VirtualBox还能不能用如果用的是WSL 2后端Docker会使用Windows的虚拟化平台VMware新版本可以共存但老版本可能会有冲突。装了Docker后如果发现VMware虚拟机起不来优先检查VMware版本最好升级到兼容WSL 2的版本。3.2 Ubuntu / Debian 安装 Docker Engine 完整步骤Linux服务器上装Docker我推荐用官方apt仓库的方式这样以后升级方便而且拿到的版本始终是社区最新稳定版。依次执行下面这些命令# 第一步更新软件包索引并安装Docker所需的依赖 sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release # 第二步添加Docker官方的GPG密钥这个步骤是为了确保你下载的安装包来自官方 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 第三步添加Docker的apt软件源 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 Engine sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin这里特意装了docker-ce而不是docker.io是因为Ubuntu自带的源里那个docker.io版本非常旧很多新特性都没有docker-ce才是Docker官方维护的社区版。装完以后启动服务并设置开机自启sudo systemctl enable --now docker验证一下sudo docker version看到Client和Server两部分信息都正常显示安装成功。如果觉得上面手动添加GPG密钥和软件源太繁琐也有一个曲线救国的办法Docker官方提供了一个一键安装脚本执行以下命令会自动完成上述所有步骤curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh这个脚本会检测你的系统版本、自动添加对应源并安装省事很多。但注意一点脚本要联网执行而且它默认安装的是最新版。生产环境建议优先用第一步那种分步操作至少你知道每一步做了什么。3.3 CentOS / RHEL 安装 Docker Engine 完整步骤CentOS上安装和老牌的Ubuntu流程类似只是包管理器是yum。# 第一步安装yum-utils工具包它提供yum-config-manager命令 sudo yum install -y yum-utils # 第二步添加Docker官方yum仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 第三步安装docker-ce sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin安装完成后启动并设置开机自启sudo systemctl enable --now dockerCentOS环境装Docker有两点容易踩坑我单独拎出来讲一是SELinux。如果服务器开启了SELinuxDocker安装后容器启动可能报权限相关错误。临时可以执行setenforce 0但生产环境不建议直接关闭更合理的做法是给容器的目录配置SELinux标签或者在docker run时加上--security-opt labeldisable参数。二是firewalld防火墙。CentOS默认开启了firewalldDocker安装后虽然会自动添加iptables规则但如果你自己又手动改了防火墙配置容器端口可能无法从外部访问。排查这个问题时先看firewall-cmd --list-all的输出确认端口放行情况。3.4 macOS 安装 Docker DesktopmacOS用户就轻松多了。去Docker官网下载Docker Desktop for Mac选择对应Intel芯片或Apple Silicon芯片的版本下载后打开dmg文件把Docker图标拖进Applications文件夹再从启动台打开。首次启动会提示需要安装Docker组件输入系统密码授权即可。启动后顶部菜单栏会出现鲸鱼图标点击可以看到Dashboard。打开终端执行docker version验证。Apple Silicon芯片的Mac要注意装的是ARM版Docker主流镜像都提供了多架构版本所以能跑兼容的arm64镜像。万一碰到某老镜像没有arm64版本也可以加参数强制用x86模拟运行但性能会打折扣。实际开发中遇到这种情况的概率不大大部分常用软件官方镜像都更新了多架构支持。3.5 云服务器快速上手场景总结如果你手头是一台全新的云服务器系统选的是Debian系或RHEL系Linux最省事的就是用官方一键脚本。基本流程是登录服务器执行上面提到的get-docker.sh脚本装完启动服务再按下一章的步骤做配置。云服务器还有一个特殊点生产环境一般不缺磁盘但容器日志会越堆越大建议安装完就顺手设置一下日志清理策略。具体是在/etc/docker/daemon.json里写上{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }这样单个容器日志超过10MB自动切割最多保留3个文件防止日志把磁盘占满。这个配置当时不生效需要重启Docker进程。4. 装完之后别急着拉镜像先做这三步4.1 让普通用户免sudo操作Docker装完Docker后你会发现一个很烦的事情直接执行docker ps会报权限错误必须加sudo。这是因为Docker守护进程默认绑定在/var/run/docker.sock这个Unix Socket上只有root用户和docker用户组里的用户能访问。解决办法就是把自己的账号加进docker组sudo usermod -aG docker $USER执行完后必须重新登录或者重启系统这一步很多人漏了结果执行完docker ps还是报错以为命令没用。重新登录后再执行docker ps就不会再出现权限问题。加了这个组相当于把你的账号提权到了能完全控制Docker的程度因为Docker本身拥有很高的系统权限。所以在多人共享的服务器上这个操作要谨慎不要给没必要的账号开放。4.2 配置镜像加速解决拉取超时装完Docker后第一件事就是拉镜像试水但很多用户马上会碰上一个头疼的问题Docker Hub的镜像拉不下来或者慢得离谱。这通常不是Docker的问题而是网络链路的问题。常规解决办法是给Docker配置镜像加速器原理就是让Docker从国内可访问的镜像仓库拉取文件。操作很简单编辑或者新建/etc/docker/daemon.jsonsudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.mirrors.ustc.edu.cn ] } EOF然后重启Docker让配置生效sudo systemctl daemon-reload sudo systemctl restart docker验证是否生效docker info在输出里找Registry Mirrors能看到你配置的地址列表就说明生效了。不同加速地址的稳定性和速度经常变动哪天不好用了换一个就行。这是一个纯配置文件的操作改完重启好处立竿见影。4.3 跑通官方 hello-world 作为安装验证配置完加速器执行一条所有Docker教程都会让你跑的命令docker run hello-world如果一切正常你会看到一堆英文输出大意是“你的Docker安装看起来正确”。这个hello-world是一个极小的测试镜像容器启动后打印这条信息就退出专门用来验证Docker能否正常拉取镜像、创建并运行容器。注意一点执行这条命令时如果卡住不动多半是镜像拉取的问题就是你刚才配的加速器没生效或者地址失效了。检查那一步。至此你的Docker已经具备基本使用条件了。5. 从“装好”到“会用”跑一个贴身例子5.1 先跑一个Nginx试试水理解端口映射验证完hello-world还不足以让你对Docker产生直观感受我建议跑一个真正的服务。Nginx是最简单也最直观的例子docker run -d --name my-nginx -p 8080:80 nginx这条命令做了什么从Docker Hub拉取nginx镜像基于它创建一个名为my-nginx的容器后台运行然后把宿主机的8080端口映射到容器内的80端口。浏览器访问http://localhost:8080能看到Nginx欢迎页就算成功。这时你已经掌握了Docker最核心的两个概念容器和端口映射。为什么要做端口映射因为容器默认在宿主机里外界访问不到必须把容器的端口“捅”到宿主机上才能通过宿主机的IP加端口访问容器内的服务。这个像你在小区里开了一家店客人要找到你得先找到小区大门端口映射就是这个大门。5.2 实操用Docker起一个MySQL 8并完成数据持久化Nginx太简单我再带你跑一个实战型实例在本地用Docker起一个MySQL 8并配置好数据持久化。执行docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDroot123 \ -v mysql_data:/var/lib/mysql \ mysql:8.0这条命令比之前的复杂一点我逐个参数解释-d后台运行。--name mysql8给容器起名字。-p 3306:3306宿主机3306端口映射到容器3306端口。-e MYSQL_ROOT_PASSWORDroot123设置MySQL root用户的密码为root123。注意这是通过环境变量传入的凡事跟密码有关的参数都别写进Dockerfile里。-v mysql_data:/var/lib/mysql创建一个名为mysql_data的卷挂载到容器内的MySQL数据目录。这一步是关键它保证容器删了数据还在。执行完以后等个十来秒让MySQL完成初始化然后用你本机的MySQL客户端连一下mysql -h127.0.0.1 -P3306 -uroot -proot123能连上说明这套环境已经跑通了。以后想清理环境执行docker rm -f mysql8容器删了但因为数据卷还在下次再执行同样命令启动一个新容器数据依然完好。这就是持久化带来的好处。5.3 平时一定会用到的常用命令速查装好Docker只是开始日常使用中你一定会频繁敲下面这些命令我整理成一张速查表建议收藏用途命令说明镜像操作docker pull 镜像名:版本拉取镜像不写版本默认latest查看本地镜像docker images列出所有已下载镜像删除镜像docker rmi 镜像ID删除镜像要先删依赖它的容器运行容器docker run -d --name 名字 镜像后台运行容器查看运行中容器docker ps只显示运行中的查看所有容器docker ps -a包含已停止的停止容器docker stop 容器名优雅停止启动容器docker start 容器名启动已停止的容器删除容器docker rm 容器名删除已停止的容器强制删除容器docker rm -f 容器名不管运行与否直接删查看容器日志docker logs -f 容器名-f表示持续追踪进入容器docker exec -it 容器名 bash进入容器内部操作清理闲置资源docker system prune删除所有未使用的镜像、容器、网络刚开始不需要全记住用多了自然就熟了。核心就三件事镜像怎么来、容器怎么起、资源怎么清。5.4 多容器场景交给 Docker Compose真实项目往往不只是跑一个容器比如一个Spring Boot项目要同时依赖MySQL和Redis总不能每次手动敲两条docker run。这时候就要用Docker Compose。新建一个文件docker-compose.yml内容示例version: 3.9 services: mysql: image: mysql:8.0 container_name: compose-mysql environment: MYSQL_ROOT_PASSWORD: root123 ports: - 3306:3306 volumes: - mysql_data:/var/lib/mysql redis: image: redis:7 container_name: compose-redis ports: - 6379:6379 volumes: mysql_data:在文件所在目录执行docker compose up -d两条服务会一并创建并启动。Compose把容器之间的依赖关系、网络互通、数据卷都替你管好了比一个个run省心太多。你安装时如果我前面提过docker-compose-plugin这个包就是为了支持docker compose子命令。6. 高频报错排查实录这些坑我基本都踩过6.1 Windows 上虚拟化检测不到这是一个超级高频的问题现象是Docker Desktop启动时报错Docker Desktop failed to start because virtualisation support wasnt detected。按这个顺序排查进BIOS确认Intel VT-x或AMD-V已经开启。有些笔记本的虚拟化选项藏在高级或CPU设置里名字可能叫“Intel Virtualization Technology”或“SVM Mode”。确认Windows的“虚拟机平台”功能已开启。在“控制面板 - 程序 - 启用或关闭Windows功能”里勾选“虚拟机平台”和“适用于Linux的Windows子系统”确定后重启。确保WSL 2安装了。执行wsl --status和wsl --set-default-version 2。WSL 2是Docker Desktop所依赖的底层。这三步走完绝大多数Windows启动失败的问题都能解决。6.2 Linux 连不上 Docker 守护进程报错长这样Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?先说一个最容易被忽略的情况执行命令的账号没权限。如果是普通用户没加入docker组执行命令时也会报这个错。解决方式我已经在前面说过加到docker组然后重新登录。如果已经是root用户或sudo执行还是这个报错那就是Docker服务真的没起来。执行sudo systemctl start docker sudo systemctl enable docker然后再看状态sudo systemctl status docker如果服务起不来往下看下一条。6.3 权限错误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然后注销重登不是开个新窗口就能解决。有个歪门邪道是直接chmod 777 /var/run/docker.sock千万别这么干这会让你服务器上的任何用户都能完全控制Docker等于把系统的后门敞开。6.4 服务起不来看日志才是正经事systemctl start docker命令没有任何输出但docker还是连不上这几乎一定是服务启动失败了。不要瞎猜原因第一件事看日志journalctl -u docker --no-pager -n 50或者看/var/log/messages、/var/log/daemon.log。日志里通常会有明确的错误线索我碰到过的就有磁盘空间不足。/etc/docker/daemon.json里JSON格式写错了导致Docker进程直接挂掉。iptables相关报错通常和防火墙或网络配置有关。二进制文件和系统不兼容多见于CentOS从旧版本升级Docker时残留了旧配置。日志这个东西越早学会看排障效率越高。别一有问题就重装重装解决不了根本问题。6.5 镜像拉不下来或超时现象是执行docker pull xxx后一直转圈最后输出net/http: TLS handshake timeout或者EOF。这个问题我在第4.2节已经给了解决方案配置镜像加速器。补充一个排查技巧加速器配完后可以先执行docker pull hello-world验证如果还是慢用docker info确认Registry Mirrors配置已经加载确认加载了还慢那就是这个加速地址当前状态不好换一个试试。6.6 端口被占用导致容器起不来执行docker run -p 8080:80 nginx时报错Bind for 0.0.0.0:8080 failed: port is already allocated原因很简单宿主机上8080端口已经被别的进程占了。为什么新建容器时不提前检查因为Docker不像虚拟机那样有独占的“网卡”端口冲突只有在启动瞬间才会暴露。解决办法有两个换一个宿主端口比如-p 8081:80或者找出占用端口的进程处理掉。查端口占用用下面命令ss -tlnp | grep 8080 lsof -i :8080说是排查端口的问题但更深一层的经验是生产环境规划端口时要统一登记不然跑几个容器很容易撞车。我自己习惯是端口尾号和服务类型关联比如所有MySQL用3306、所有Redis用6379、Web服务统一用808x区间好记也不容易冲突。装完之后送你两张“地图”Docker装好只是万里长征第一步。如果你打算长期用下去我建议你先把两件事情做了能让后面的学习顺畅很多。第一去Docker Hub随便挑几个热门镜像看看他们的文档页比如nginx、mysql、redis。你注意观察每个镜像的页面其实都写了“怎么用”包括环境变量、端口、数据卷、示例命令。Docker的生态里“不会用”多半是“没看文档”而文档就在那里。第二自己在本地搭一个最小项目练手。不用多复杂一个后端接口连接一个MySQL用Docker Compose跑起来然后试着改代码、重新构建镜像、再部署。这个过程会逼你把镜像、容器、数据卷、端口映射这些概念真正串起来。我用Docker这么多年最大的体会就是它看起来是个工具实际上是一套思想。装好它只要几十分钟理解它的使用逻辑才是真正的门槛。这篇讲的全是安装和基础使用但所有的坑都是真实的照着走应该能让你少走我当年走过的弯路。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询