标题已经写得很直白这一章就是动手装东西。不管你是刚看完前面几章准备自己折腾一套开发环境还是公司里要在一台新机器上把运行环境铺起来Docker安装部署都是绕不开的第一步。这篇文章我会把整个安装过程掰开揉碎从最开始的版本选择、环境检查到实际敲命令、配镜像加速、踩坑处理全部按真实操作顺序走一遍尽量让照着做的朋友少走弯路。这一章覆盖的内容比较基础但基础不代表不重要。很多人的第一个Docker环境都有残留问题比如装到一半源配错了、权限配置不到位、日志涨得飞快这些问题源头都在安装阶段埋下的。所以我会把每一步“为什么要这么做”也讲清楚而不是只丢一行命令让你复制。1. 部署前先盘清楚Docker是什么、装哪里、怎么选版本1.1 Docker到底解决了什么问题先花几十秒把Docker的价值捋一遍不然你装了也不知道自己在装什么。Docker本质上是把应用和它依赖的运行环境打包成一个标准镜像然后用容器来跑这个镜像。你可以理解成把一个软件的“完整生态系统”塞进一个标准集装箱里不管集装箱运到哪台机器上箱子里面的环境都不会变。这带来的直接好处是部署效率大幅提升。以前发布一套服务先装运行时、再配依赖、处理系统库版本冲突光环境准备就可能花半天。有了容器镜像一拉、容器一跑应用就在里面跑起来了外面系统不管是什么版本、缺了什么都跟你没关系。这也是为什么现在几乎所有的在线服务、微服务架构、持续集成流水线都在用Docker连个人电脑上跑个数据库、装个中间件用它也比直接装在宿主机上干净得多。1.2 装在物理机、虚拟机还是个人电脑上Docker的安装方式取决于你的场景这决定了后面所有操作路径。第一种是Linux物理机或云服务器这是最标准、也最推荐的做法。容器本身就是Linux内核技术在Linux上装Docker环境最自然性能损耗最小配置相对简单。生产环境、测试环境基本都走这条路。第二种是Windows或macOS个人电脑。这类系统上是靠一个轻量级虚拟机把Linux内核跑起来再在虚拟机里面跑Docker官方对应的方案是Docker Desktop。便利性很高适合做日常开发、本地联调但不太适合当成生产运行环境来用毕竟那层虚拟化多多少少会带来一些额外开销和兼容性边界。第三种是虚拟机里面再装Docker。比如你在本机的虚拟化软件里开了一个CentOS或Ubuntu虚拟机再把Docker装进去。这种相当于在物理机和个人方案之间取了个折中适合需要模拟真实服务器环境、又不想直接上云的场景我自己就经常这么干。有一点要提前跟你讲清楚虚拟机里再套容器性能会有一定损失但用来学习、做实验完全够用。1.3 版本怎么选CE版还是发行版自带版Docker官方提供的主要是Docker Engine社区版和Docker Enterprise企业版。社区版就是免费使用的功能上已经覆盖了绝大部分开发和运维需求咱们这一章安装的就是社区版。很多人容易踩的一个坑是直接用Linux发行版自带的软件源里那个docker包。比如Ubuntu自带的docker.io或者CentOS自带的老版本docker装上确实能用但版本更新通常滞后功能落后和最新版Compose、镜像格式之间都有兼容性问题。我建议一律从Docker官方源安装这样能拿到最新稳定版后续升级也统一。另外要区分一下安装Docker引擎不等于安装Docker Desktop。Docker Desktop是带图形界面和虚拟机Helper的个人电脑方案而服务器上装的Docker引擎就是一个后台服务加一套命令行工具。这篇讲的后者。2. 动手之前先把环境条件和旧残留清干净2.1 系统版本与内核要求先查一遍再装Docker对Linux系统是有要求的不是随便哪个版本都行。先说硬性条件操作系统必须是64位内核版本最低3.10再低就会出各种诡异问题满屏报错却定位不到原因。现在主流的Ubuntu 20.04以上、CentOS 7以上、Debian 11以上基本都满足但新机器上还是要自己确认一下。在终端跑三条命令把架构、内核版本、系统版本都看一眼uname -m uname -r cat /etc/os-release第一条看架构x86_64就是64位第二条看内核版本如果内核只有3.10左右建议先把系统升级到较新版本再装Docker第三条看系统发行版和版本号后面配置软件源要用到对应版本代号。注意如果内核太老你装完Docker之后很有可能出现容器能启动、但网络不通或者存储驱动不对的情况。这不是Docker的问题是内核能力不够。内核太老就老老实实先升系统别硬着头皮往下装。2.2 先卸载系统里可能存在的旧版本Docker这一步很多人直接跳过结果新装的时候要么提示包冲突要么装完发现docker命令指向的还是老一套。如果你这台机器以前装过docker、docker.io、docker-engine之类的包最好先把它们清掉。Debian系的清理命令大概是这样的sudo apt-get remove docker docker-engine docker.io containerd runcCentOS系则用sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine如果你的机器本来就是全新的没装过Docker相关东西这一步可以跳过不影响。这里有个细节要提醒一下卸载旧包不会删掉数据目录 /var/lib/docker。这个是故意的因为里面可能是你之前辛苦拉下来的镜像和容器数据。如果你确定旧数据不要了可以手动删掉它如果要保留就不要动。旧数据目录对安装本身没有影响但如果你发现新装完Docker后docker images里还有旧镜像别慌那是因为镜像数据还在。2.3 把软件源切成更快更稳的镜像源这一步不是Docker专属而是所有Linux软件安装的基本功。你的服务器默认用的软件源可能在国外直接apt-get update或者yum makecache会非常慢甚至超时导致后面添加Docker源的时候半路卡死。我一般都会先把系统源切成距离自己机房比较近的镜像源这个操作因发行版而异。Ubuntu、Debian修改/etc/apt/sources.list或者/etc/apt/sources.list.d/下的文件CentOS则有自己的Base源配置。切源完成后先执行一次更新指令sudo apt-get update或者sudo yum makecache fast这样做的目的不只是为了快更重要的是让系统能够正常访问、安装后面需要的依赖包。3. 一步一步把Docker装上去3.1 Debian/Ubuntu系列用apt安装Ubuntu、Debian以及它们的衍生版最可靠的安装路径是走Docker官方apt源。第一步装几个基础工具sudo apt-get update sudo apt-get install ca-certificates curl gnupg第二步创建目录并导入Docker官方GPG密钥。这个密钥的作用是验证从Docker源下载包的签名防止源被篡改或者下载到伪造包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第三步把Docker官方的apt仓库写入源列表。这一条命令里的版本代号会自动读取系统版本不用手动填echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/null如果你用的是Debian把上面源地址里的/ubuntu换成/debian即可。第四步更新源并安装Docker引擎以及相关的构建和编排插件sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这里安装的不只是docker-ce这个服务还包含了命令行工具、容器运行时、构建插件和Compose插件。Compose是现在编排多容器应用绕不开的工具所以直接一起装上最省事。3.2 CentOS/RHEL系列用yum或dnf安装CentOS 7用yumCentOS 8及以上或新的RHEL系用dnf命令格式差不多。先装配置仓库的工具sudo yum install -y yum-utils然后添加Docker官方yum仓库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如果系统提示依赖冲突或者找不到包仔细看下是不是安装源没有生效或者系统版本代号和源不匹配。CentOS 7在2024年之后官方源逐渐停更了装的时候如果遇到404错误很大概率是源的问题而不是你操作的问题需要适当切换源方式。3.3 启动服务并设置开机自启安装完成以后Docker服务默认不会自动启动需要手动开启。执行sudo systemctl start docker sudo systemctl enable docker第二条命令是设置开机自启非常重要。如果漏了这一步服务器一重启Docker服务就不会自动起来你那些依赖Docker的容器、服务会全部连带挂掉。我见过不止一次线上事故就是因为装完忘记enable机器一重启容器管理器没了业务直接不可用。验证一下服务的运行状态sudo systemctl status docker看到activerunning就说明服务正常。如果你的机器用的是init.d管理方式而不是systemd那就用sudo service docker start来启动老一些的系统会用到。3.4 装完先验证确认这四件事没问题安装完成不是终点验证才是。我建议依次跑下面四组命令docker version docker compose version docker run hello-world docker infodocker version会显示Client和Server两段信息。Server要能看到版本号和平台信息说明Docker进程跑起来了。如果只显示Client、不显示Server说明服务没起来检查systemctl服务状态。docker compose version确认Compose插件安好了。docker run hello-world会拉取一个极小的测试镜像并运行然后打印一串说明文字。这一步验证了镜像拉取、容器创建、运行整个最小链路是通的。docker info则能看到你当前使用的存储驱动、Cgroup驱动、CPU和内存等环境信息。提示如果docker run hello-world卡在拉镜像的地方迟迟不动大概率是网络导致拉不下来先去配置镜像加速器再回来重试。这一步可以放在第四节的配置之后做。4. 安装之后立刻要做的四件事不然用两天就后悔4.1 配置镜像加速器拉镜像速度翻倍Docker默认从Docker Hub拉取镜像国内网络环境下经常会超时、断流。这个问题装完当天就要解决不然你拉一个稍微大点的镜像卡到怀疑人生。办法是在/etc/docker/daemon.json里配置registry-mirrors字段。文件可能不存在直接创建就行{ registry-mirrors: [https://your-mirror-address] }把your-mirror-address换成你自己环境里可用的镜像加速地址。现在很多公有云厂商、容器服务商都提供免费的个人加速地址你可以从当前使用的云服务商控制台里找到也可以在社区里搜“容器镜像加速地址”获取。配置完以后重启Docker服务sudo systemctl daemon-reload sudo systemctl restart docker重启后用docker info查看Registry Mirrors一栏看到配置的地址就说明生效了。这一步是我给所有新装Docker环境的第一条建议别等拉取镜像报错再回来弄。4.2 让普通用户免sudo运行docker命令Docker安装完后docker命令默认需要root权限或者用sudo执行。每次敲命令都要加sudo很烦而且会有权限上的麻烦。更推荐的做法是把需要用Docker的用户加入docker组。执行sudo groupadd docker sudo usermod -aG docker $USER然后退出当前终端、重新登录或者执行以下命令让组变更生效newgrp docker之后直接敲docker ps就能看到结果不需要再带sudo。这里必须强调一个安全点docker组的用户权限约等于root权限因为用户可以通过挂载宿主机目录进入容器进而操作宿主机文件。所以生产环境的服务器上千万不要随便把用户加进docker组只给那些真正负责容器管理的人加。4.3 限制日志大小防止磁盘被写满容器默认的日志驱动是json-file会不断把标准输出写到宿主机文件里。如果不加限制一个频繁打印日志的容器运行几天就能吃掉几十GB磁盘直到磁盘满、服务全部崩溃。这个教训我在真实环境里遇到过不止两次。解决办法是在daemon.json里加上日志相关的全局配置{ log-driver: json-file, log-opts: { max-size: 50m, max-file: 5 } }含义是每个日志文件最大50MB最多保留5个文件超出就滚动清理。配置完后同样需要重启Docker服务。这只影响新建的容器已经存在的容器还是用旧的日志配置需要重建容器才会生效。你也可以在docker run命令行里单独给某个容器配置但既然daemon.json能一次搞定建议直接配全局。4.4 处理好防火墙、SELinux和网络转发服务器上一般都有防火墙策略或者云安全组。Docker端口映射用的是iptables规则如果宿主机的防火墙规则顺序不对或者Docker自带的iptables链和你的安全策略冲突很容易出现容器内部端口通了、外部访问不通的情况。我的排查经验是先确认宿主机防火墙放行了你要映射的端口再确认云安全组放行对应端口最后再看docker port容器名能看到正确映射。很多“容器起不来”的假象其实是安全组或防火墙把流量挡住了。CentOS系还有一个特殊点SELinux。SELinux处于Enforcing模式时容器挂载目录卷可能被拒绝报Permission denied。如果你不走安全加固审计的老路我建议把SELinux先设成permissive来排查确系它阻碍后再调整相应的布尔值不要一上来就禁掉它。5. 卸载、升级和日常维护别等出事才想起来5.1 想要干净卸载Docker这几个残留点都要清卸载Docker比安装容易踩更多坑。如果你只是想换一个版本或者彻底清掉环境执行以下步骤sudo systemctl stop docker sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin用yum的话把apt-get purge换成yum remove。但清理并不止于此。卸载包不会删除镜像、容器、卷和网络数据它们全在/var/lib/docker下面。要彻底清掉手动删除sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd这两个目录删了就找不回来了执行前确认里面没有你需要的镜像或数据卷。另外之前手动添加的源文件和GPG密钥也会留下需要一并清理。Ubuntu/Debian下是/etc/apt/sources.list.d/docker.list和/etc/apt/keyrings/docker.gpgCentOS里是/etc/yum.repos.d/docker-ce.repo。不删的话下次重装时可能因为源重复导致更新报错。5.2 升级Docker版本最稳妥的方式是跟随源升级Docker的升级其实不复杂因为安装源里就有最新稳定版。你只需要执行对应的更新命令sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这样会把Docker相关组件升级到源里的最新版本。CentOS系对应sudo yum update docker-ce docker-ce-cli containerd.io升级完成后重启Docker服务sudo systemctl restart docker有一点要特别提醒升级有风险尤其是在生产环境。Docker的存储驱动、容器运行时不排除有兼容性变化升级之前最好先在一个测试环境跑一遍并且备份好重要容器的数据卷。另外不要在业务高峰期做这件事不怕一万就怕万一。5.3 日常顺手做的维护就三条命令的事很多服务器的Docker环境变成“野山”状态镜像堆成山、日志撑满盘、网络乱七八糟都是因为缺少日常清理习惯。其实三条命令就够用docker system df docker system prune docker system prune -a --volumesdocker system df展示磁盘占用概况让你心里有数。docker system prune清理闲置的构建缓存、停止的容器、没有被使用的网络对象。docker system prune -a --volumes连没有容器引用的镜像和未被使用的数据卷一并清掉。注意prune -a会删除没有任何容器使用的镜像如果你某天想回滚到旧镜像或者重新部署时却发现镜像没了就可能麻烦了。所以这条命令最好只在确定不需要旧镜像时执行如果要留一手就只加--volumes不加-a。6. 常见安装失败问题和排查方法实测过的坑都写在下面6.1 问题速查表现象最可能原因排查方向添加apt源后update报错提示缺少公钥GPG密钥没有导入或权限不对检查/etc/apt/keyrings/docker.gpg是否存在且可读Source列表提示codename不匹配系统版本过旧或/etc/os-release读取异常手动确认版本代号在源地址中写死正确的codenamedocker命令提示权限不足用户不在docker组或Socket权限不对执行usermod -aG docker并重新登录docker: Cannot connect to the Docker daemon服务没启动systemctl start docker并查看status日志拉取镜像超时镜像加速器没配或配错地址改daemon.json里的registry-mirrors重启Docker容器启动后网络不通宿主机防火墙或安全组拦截分别在宿主机和云控制台检查端口放行情况挂载宿主机目录报Permission deniedSELinux或权限配置问题临时用setenforce 0验证再调整对应策略apt安装时提示依赖冲突系统源里的旧依赖与官方Docker包冲突先彻底删除旧版docker、containerd再重装6.2 几个典型问题的排查实录先讲GPG密钥问题。这是我们接触最多的报错现象是apt-get update后半段报“The following signatures couldnt be verified because the public key is not available”一行红字特别吓人。原因多半是keyrings目录权限不对或者密钥下载后usr keyring位置引用不对。处理方法就是按前面第三节的写法严格走install -m 0755创建目录、chmod ar设置读取权限、在source list里用signed-by指明绝对路径。这三样一个都不能少很多人抄命令漏了chmodDebian系的apt在读取keyring时会因为权限过宽报错。再说权限问题。有一种情况是docker ps命令能正常执行但报文里看起来像“permission denied while trying to connect to the docker daemon socket at unix:///var/run/docker.sock”这个非常典型。八成是当前用户不在docker组。有人会用一个临时方案chmod 666 /var/run/docker.sock这样确实能立刻用但等于把Docker Socket的权限完全打开任何人都有可能控制宿主机上的容器风险极高。正确做法就是前面的usermod那套别图省事。我遇到过最隐蔽的问题是host网络模式或者桥接网络模式下容器内访问不到外部网络。查了一圈最后发现是宿主机上的防火墙把FORWARD链给拦截了。Docker默认的桥接网络依赖内核IP转发如果系统里 net.ipv4.ip_forward0或者防火墙策略阻塞了转发流量容器就没有外网。遇到这种情况可以用sysctl查看内核参数顺手在/etc/sysctl.conf里把ip_forward改成1然后sysctl -p生效。这也是安装阶段就该检查的一项基本功。7. 我自己在安装这件事上的三点心得装Docker这件事说起来不难但每个人反复踩的坑就那几个。我个人的习惯是装完以后先在daemon.json里一次性把镜像加速和日志限制配好再启动服务而不是装完默认状态先用等出了故障再回改配置。改daemon.json虽然只需要重启Docker但重启相当于把当前跑着的容器全部中断一次在线环境里这就是一次小事故。第二点是安装Docker之前一定要把当前系统的源、内核、防火墙这些“底层环境”先确认好。很多人连内核版本都不看就装最后容器跑不起来又怀疑Docker本身实际上问题全在系统层。先花三分钟查环境能省后面三小时。最后一个小技巧建议把装完之后初始化系统的过程整理成一个脚本包括配置daemon.json、加docker组、设置日志限制、拉取测试镜像、验证Compose版本。以后换任何一台机器执行一遍就能把Docker环境拉起来效率翻倍。我自己就是这个流程的受益者新环境从零到可以跑容器五分钟以内搞定。