手动装Docker这件事,看起来是件基础活,但真到自己动手的时候,往往会卡在版本选择、镜像源、权限这些细节上。特别是当你决定装一个指定版本,比如标题里这个 docker-26.1.4,如果只是跟着网上教程一路“下一步”,大概率会踩到几个不大不小的坑。这篇就把我从零开始安装 Docker 26.1.4 的完整过程、版本选择逻辑,以及装完之后的必要配置和常见故障排查一起讲清楚,给你一份可以直接照着操作的手册。
这篇内容适合这几类人:刚接触 Docker 想在自己服务器或本机装一个稳定版本的初学者;被网上各种 docker 安装教程搞晕,想踏实锁定版本号的运维朋友;以及已经装过 Docker 但遇到启动失败、权限报错、镜像拉不动等问题,想系统排查一遍的人。我尽量不堆术语,遇到必要概念会用大白话解释,你可以放心往下看。
1. Docker 26.1.4 的版本定位与选择逻辑
1.1 版本号里藏着什么信息
Docker 的版本号遵循主版本.次版本.补丁版本的规则。26.1.4 里的“26”是大版本,“1”是小版本,“4”则是针对 26.1 这条线的补丁版本。也就是说,26.1.4 是 26.1 系列在某个时间点上的维护版本,它的定位是修复前面版本中暴露的部分问题,而不是引入激进的新特性。
所以如果你追求的不是“最新最新”的每月尝鲜版,而是一个相对稳定、社区反馈成熟、兼容性经过验证的版本,类似 26.1.4 这种“次新维护版”反而是更合理的选择。我在生产环境里一般不太会用刚发布的 .0 版本,通常会等补丁版出来之后再考虑升级,这次在测试机上装 26.1.4 也是基于同样的思路。
1.2 为什么很多教程不敢锁定版本
你去搜索引擎搜 docker 安装教程,十篇里有八篇是直接 apt install docker.io 或者用官方脚本一键装最新版。这样当然方便,但有一个问题:你无法确定装出来的具体版本是什么。今天装是 26.1.x,三个月后再执行一遍同样的命令,可能就变成了 27.x。
版本一旦漂移,随之而来的可能是配置文件格式变化、命令行参数废弃、容器运行时行为差异。比如之前遇到过一个案例,某环境里旧版本能正常运行的 compose 文件,升级后因为 version 字段被标记废弃,启动时直接报警告甚至报错。所以在需要长期维护、需要保证多台机器行为一致的时候,锁定版本号安装是更规范的做法。
1.3 什么场景适合装 26.1.4
- 个人开发机:需要一个稳定 Docker 环境跑 MySQL、Redis、Nginx 等容器
- 公司内网服务器:多台机器需要统一版本,方便统一维护
- 学习 Docker Compose、Docker 网络、数据卷等进阶功能
- 已有旧版本 Docker,想平滑升级到 26.x 系列
如果你打算用 Docker 跑一些比较重的服务,比如 MySQL 8.0、Redis 主从、微服务项目打包等,26.1.4 这个版本在稳定性上是够用的。本篇后续的每一步操作,都是针对这个版本进行验证过的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前的环境检查与旧版本清理
2.1 先确认操作系统和内核版本
安装 Docker 之前,先看一眼系统环境。我这次用的是一台 Ubuntu 22.04 LTS 的机器,内核版本是 5.15。你可以通过下面两条命令确认:
bash复制cat /etc/os-release
uname -r
Docker Engine 对 Linux 内核有最低要求,通常内核版本需要在 3.10 以上,但太老的内核可能导致存储驱动、网络功能受限。如果你的内核低于 3.10,建议先升级系统,而不是强行装 Docker。另外,Docker 官方对 CentOS 7 也能支持,但因为 CentOS 7 自带的内核和 iptables 版本较老,装新版 Docker 后有时会遇到 networking 相关的问题,这一点后面排查章节会提到。
2.2 检查是否有残留的旧 Docker
如果机器之前装过 Docker,不管是 docker.io、docker-ce 还是 docker-engine,最好先清理干净。残留的旧版本配置、systemd 服务文件、网络规则,都可能和新版本打架。
先看有没有装过:
bash复制which docker
systemctl status docker
dpkg -l | grep -i docker
如果确认有旧版本,用对应方式卸载。以 apt 安装的 docker.io 为例:
bash复制sudo apt remove --purge docker.io docker-ce docker-ce-cli containerd runc -y
sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker
注意,/var/lib/docker 是 Docker 默认的数据目录,里面存放镜像、容器、数据卷。如果里面有你需要保留的数据,不要直接删,先拷贝出来。如果是纯测试机,那直接清理干净最省心。
2.3 存储驱动与数据目录的预规划
Docker 的存储驱动默认推荐 overlay2,它比老式的 aufs、devicemapper 在性能和稳定性上好很多。Ubuntu 22.04 的内核默认就支持 overlay2,所以基本不用额外配置。
数据目录这一点容易被忽略。默认 Docker 会把所有数据放到 /var/lib/docker,如果你的根分区不大,装几个镜像加容器日志可能就把磁盘塞满了。我自己习惯在安装前就把数据目录规划到独立数据盘,比如挂载到 /data/docker。规划好之后,后面在 /etc/docker/daemon.json 里通过 data-root 参数指定即可,具体配置在第 4 章。
建议:先用
df -h看一下根分区和数据盘的空间,别等到磁盘告警了才想起来挪数据目录。
3. 正式安装:从 apt 源到二进制包两种方式
3.1 方式一:通过官方 apt 源安装并锁定版本
这是最推荐的方式,因为 apt 源会自动处理依赖关系,升级和卸载也更规范。整套流程分为三步:安装依赖、添加 Docker 官方源、安装指定版本。
第一步,安装基础依赖:
bash复制sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
第二步,添加 Docker 官方 GPG 密钥和软件源。这里的 $(. /etc/os-release && echo "$UBUNTU_CODENAME") 会自动获取当前系统的代号,比如 jammy(22.04)、noble(24.04),不需要手动写死:
bash复制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 a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$UBUNTU_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
第三步,更新源后,先查看仓库里有哪些版本,再锁定安装 26.1.4:
bash复制sudo apt update
apt-cache madison docker-ce | head -20
apt-cache madison 会列出所有可用的 docker-ce 版本,找到形如 5:26.1.4-1~ubuntu.22.04~jammy 的那一条,然后安装:
bash复制sudo apt install -y docker-ce=5:26.1.4-1~ubuntu.22.04~jammy docker-ce-cli=5:26.1.4-1~ubuntu.22.04~jammy containerd.io docker-buildx-plugin docker-compose-plugin
这里把 docker-ce 和 docker-ce-cli 都锁到同一个版本,避免出现服务端和客户端版本不一致的情况。如果你不用 buildx 和 compose,最后两个插件可以不装,但装了也不碍事,而且后面用 docker compose 会方便很多。
3.2 方式二:通过静态二进制包安装
如果你所在环境无法访问 Docker 官方 apt 源,或者你想把 Docker 装到一个非常精简的系统上,可以选择静态二进制包方式。
先去 Docker 官方 GitHub Release 页面下载对应架构的压缩包。比如 x86_64 架构:
bash复制wget https://download.docker.com/linux/static/stable/x86_64/docker-26.1.4.tgz
tar xzvf docker-26.1.4.tgz
sudo cp docker/* /usr/bin/
这样 docker、dockerd、docker-init 等二进制文件就都拷到了 /usr/bin。之后还需要配置 systemd 服务文件。你可以从 Docker 官方仓库里拿现成的 containerd.service 和 docker.service,或者手动写一个最简单的 systemd unit 文件。
二进制方式适合对系统洁净度要求很高的场景,但依赖关系需要自己处理,比如 iptables、cgroups 相关组件必须提前装好。对于绝大多数普通用户,我更推荐方式一,方便省事。
3.3 启动服务并设置开机自启
无论用哪种方式装好之后,都要启动 Docker 服务并设置开机自启:
bash复制sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
看到 active (running) 就说明服务正常了。然后执行:
bash复制docker version
重点看 Server 部分有没有正常显示,如果 Server 那一段没有内容,说明 dockerd 没有起来,需要去看日志排查,具体见第 6 章。
4. 安装完成后的必做配置实战
4.1 配置镜像加速源,解决拉取慢
Docker 装好后,如果不配置镜像源,直接从 Docker Hub 拉镜像在国内网络环境下通常非常痛苦,一个几百 MB 的镜像可能拉到超时。这个问题的解决办法是配置 registry mirror。
编辑 /etc/docker/daemon.json:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
EOF
这里我列了几个当前可用的公共镜像源。需要说明的是,公共镜像源的可用性变动很快,今天能用不代表下周还能用,建议你配置两到三个备用。配置完成后重启 Docker:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
验证镜像源是否生效:
bash复制docker info | grep -A 5 "Registry Mirrors"
注意:不要盲目相信网上所有镜像源地址。最好选择更新时间近、口碑好的源。配置后如果拉镜像仍超时,可以换一组源再试。
4.2 让普通用户免 sudo 执行 docker
Docker 安装完后,普通用户执行 docker 命令会提示权限不足,因为 docker 守护进程的 socket 文件 /var/run/docker.sock 默认属于 root 用户和 docker 组。解决办法是把当前用户加入 docker 组:
bash复制sudo usermod -aG docker $USER
newgrp docker
执行完再运行 docker ps 试试,如果正常显示列表,说明权限配置生效。注意加入 docker 组后,该用户实际上拥有了等同于 root 的容器管理权限,所以这个操作更适合个人开发机,如果是多人共用服务器,要谨慎分配。
4.3 在 daemon.json 中规划数据目录和日志大小
在 2.3 里提到过数据目录规划,现在可以落实到配置。如果你的数据盘挂载在 /data,可以这样配置:
json复制{
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
max-size 和 max-file 的作用是限制单个容器日志文件的大小和数量。很多服务器磁盘被写满,罪魁祸首就是容器日志无限增长,这个配置能有效避免。日志驱动选 json-file 是默认行为,你也可以换成 local 驱动,更省空间,但如果你后续要接日志采集系统,可能 json-file 更通用。
修改完同样重启 Docker:
bash复制sudo systemctl restart docker
4.4 配置合法性检查工具
每次改完 daemon.json,为了防止配置错误导致 dockerd 无法启动,可以先做一次配置校验:
bash复制dockerd --validate
如果配置有问题,它会直接告诉你解析失败或字段非法。虽然 docker 服务启动失败后也能通过日志排查,但提前校验能省不少事。
5. 实测跑通一个完整容器流程
5.1 hello-world 验证最小可用
先跑个最小的容器,验证整个链路是通的:
bash复制docker run --rm hello-world
这条命令的执行流程是这样的:先检查本地有没有 hello-world 镜像,没有就去配置好的镜像源拉取,拉下来之后由 containerd 创建容器,最终容器输出一段欢迎信息然后退出。--rm 参数表示容器退出后自动清理,比较适合测试用。
执行后能看到输出:
code复制Hello from Docker!
This message shows that your installation appears to be working correctly.
到这一步,基本可以确定 Docker 引擎没有任何大问题。
5.2 用 Nginx 测试端口映射与后台运行
hello-world 只验证了“能跑”,接下来用 Nginx 验证端口映射、后台运行和容器生命周期管理。
bash复制docker run -d --name web-test -p 8080:80 nginx:alpine
拆解一下这段命令:
-d:后台运行--name web-test:给容器命名-p 8080:80:把宿主机的 8080 端口映射到容器的 80 端口nginx:alpine:镜像名加标签,alpine 版本体积小,适合测试
跑起来之后,docker ps 能看到容器状态是 Up。然后访问 http://服务器IP:8080,能看到 Nginx 的欢迎页就说明一切正常。
如果需要进入容器内部看看环境:
bash复制docker exec -it web-test /bin/sh
进入之后可以看下 /etc/nginx 目录结构,或者直接退出。exec -it 里的 -i 是保持标准输入打开,-t 是分配一个伪终端,两个参数配合起来才能进入交互式 shell。
5.3 配置容器重启策略
跑 Nginx 这类常驻服务时,容器如果因为异常退出,我们希望它能自动重启,而不是每次都手动起。用 --restart 参数解决:
bash复制docker run -d --name web-test --restart unless-stopped -p 8080:80 nginx:alpine
unless-stopped 的意思是:除非你手动执行 docker stop,否则容器无论怎么崩溃、机器怎么重启,都会被自动拉起来。这个参数对于生产环境跑服务几乎是必须的。
如果你已经在运行的容器没加这个参数,可以这样更新:
bash复制docker update --restart unless-stopped web-test
6. 安装过程中的高频故障排查手册
6.1 Permission denied while trying to connect to the Docker daemon socket
这个报错通常长这样:
code复制permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
原因就是第 4.2 节说的,当前用户不在 docker 组里。解决方案就是加入 docker 组并重新加载组权限。如果加了组还是不行,注意有没有执行 newgrp docker,或者干脆重新登录一次 SSH。
6.2 dockerd 启动失败,服务一直 starting
如果你发现 systemctl status docker 一直卡在 activating,先看日志:
bash复制journalctl -u docker --no-pager -n 50
常见的原因有几个。一是 daemon.json 写错了 JSON,导致 dockerd 直接退出,这时用 dockerd --validate 检查;二是 iptables 相关异常,某些云服务器或 CentOS 7 上会遇到,可以尝试:
bash复制sudo systemctl stop docker
sudo iptables -t nat -F
sudo systemctl start docker
三是使用了不支持的存储驱动,老内核环境可能出现,报错里会直接提到 overlay 或 vfs,这时候要么升级内核,要么在 daemon.json 里明确指定一个兼容的存储驱动。
6.3 镜像拉取超时或极慢
如果 docker pull 一直卡住或报 timeout,优先排查镜像源。执行 docker info 看 Registry Mirrors 是否已经配置并生效。如果配置了还是慢,换个源试试,有时候某些源高峰期速度就是不行。
另外注意一点,如果配置了镜像源,拉取 Docker Hub 官方镜像时走的是镜像源地址,但如果你拉取的是第三方仓库镜像(比如某个私有仓库或 gcr.io 开头的镜像),镜像源是不管的,需要单独配置或者使用代理。这个情况比较进阶,新手先掌握官方镜像的加速即可。
6.4 Windows 下 Docker Desktop 的典型报错
虽然这篇主要讲 Linux 上的 Docker Engine,但如果标题里的版本你是打算装在 Windows 上,大概率会碰到 Docker Desktop 相关的报错。比如热词中常见的:
- Docker Desktop failed to start because virtualisation support wasn't detected
- We've detected that you have an incompatible version of Windows
第一个报错说明 Hyper-V 或 WSL2 虚拟化平台没有开启,需要在 BIOS 里打开虚拟化(Intel VT-x / AMD-V),然后在 Windows 功能里勾选“虚拟机平台”和“适用于 Linux 的 Windows 子系统”。第二个报错是 Windows 版本太老,Docker Desktop 新版本要求 Win10 2004 或更高版本,建议先升级系统。
如果你只需要在 Windows 上跑 Linux 容器,更推荐的方式是安装 WSL2,然后在 WSL2 的 Linux 发行版里按本篇第 3 章的步骤安装 Docker Engine,这样比 Docker Desktop 更省资源,也少很多 GUI 层面的麻烦。
6.5 docker 命令执行后一直无响应或卡住
这种情况通常发生在 dockerd 没有正常运行,或者 socket 文件异常。先确认 dockerd 进程:
bash复制ps aux | grep dockerd
如果进程存在但 docker 命令依然卡住,可以看下 /var/run/docker.sock 是否存在。确认失败后尝试重启服务,一般能解决。
7. 后续用起来才省心的几个习惯
Docker 装好只是第一步,真正顺手的关键在于后续习惯。我这里分享两个我在实操中觉得特别值得坚持的做法。
一是给所有关键路径做标记。比如数据目录放在 /data/docker,就在 /etc/docker/daemon.json 里写清楚,同时在这个文件边上留一个注释文件,记录什么时候改过、为什么改。Docker 的配置文件本身不支持注释,所以我习惯在 /etc/docker/ 下放一个 README.md,方便维护。
二是不要频繁升级 Docker 版本。很多问题不是 Docker 本身的问题,而是版本跳变带来的配置不兼容。装好 26.1.4 之后,除非有明确的安全修复或功能需求,否则可以在较长一段时间内保持这个版本。升级前先备份 /etc/docker/daemon.json 和 /var/lib/docker 里的重要数据卷,同时用 docker save 备份镜像,这些都是可以提前做好的预案。
最后再分享一个小技巧:如果你不确定某个环境能不能顺利装 Docker,可以先起一台临时虚拟机或云主机,完整跑一遍装机和容器运行流程,确认没问题后再在生产机器上操作。整个过程熟练之后,从零装好一个可用的 Docker 环境,十分钟之内完全可以搞定。
