如果你已经搜过一轮“安装 Docker”的教程,大概率会看到两种极端:要么是复制粘贴几条命令就完事,要么是一上来就扯容器网络、存储驱动这些还没用到的东西。这篇我打算换个写法,不追求“最快装完”,而是把安装 Docker 的环境这个过程中最容易踩的坑、最容易被忽略的检查项,一个一个说清楚。适合两类人:刚接触容器、想在自己电脑或服务器上把环境一次性装对的初学者,以及要在公司机器上动手前想确认细节的开发者。
我自己在 Ubuntu 和 Debian 系的服务器上装过很多次 Docker,也在 Windows 和 macOS 上折腾过 Docker Desktop,坦白讲大多数失败都不是命令本身的问题,而是装之前少做了一两个检查。这篇会把我在实际安装中遇到的问题和排查方法都放进来,尽量让你照着走就不会翻车。
1. 动手之前先理清:装的到底是什么、有哪些安装路线
1.1 引擎、客户端、容器运行时,先分清楚
很多人以为安装 Docker 就是安装一个叫 docker 的软件,其实装完以后系统里会多出好几个组件。先简单分一下:
- docker engine(守护进程):真正干活的后台服务,负责管理容器生命周期、镜像、网络、存储。名字叫 dockerd。
- docker client(命令行客户端):就是你敲 docker xxx 时调用的那个程序,它把命令发给守护进程执行。
- containerd:底层的容器运行时管理器,dockerd 通过它来真正启动和停止容器。
- docker compose plugin:用来跑 docker-compose.yml 多容器编排的插件,现在官方推荐直接以插件形式安装,而不是单独装 python 版的 docker-compose。
我之前见过有人只安装了 docker-cli,结果 docker info 一直报连不上守护进程,其实就是只装了客户端没装引擎。还有人是只装了老版本的 docker.io 包,能用但不带 compose 插件,后面编排多容器时又得补装。
1.2 两条主流安装路线,怎么选
安装 Docker 的环境,基本就是两条路:
第一条是安装 Docker Engine,也就是直接在 Linux 服务器上装原生容器运行时,最常见。Ubuntu、Debian、CentOS 这些发行版都有对应的安装方式,推荐用 Docker 官方维护的 apt/yum 仓库装,而不是直接用发行版自带的软件包。原因很简单:官方仓库更新快,版本新,修复安全漏洞及时。发行版自带的 docker.io 版本通常比较旧,而且不一定带 compose 插件。
第二条是安装 Docker Desktop,面向 Windows 和 macOS 用户。它本质上是在你的电脑里跑一个轻量虚拟机(Windows 上基于 WSL2 或 Hyper-V,macOS 上基于 Apple 的虚拟化框架),容器其实跑在虚拟机里,只不过对外表现得很“原生”。好处是安装简单、自带图形界面和 Docker Hub 登录,坏处是比 Linux 原生方案多一些资源开销,也不适合生产服务器。
我的建议很简单:如果你有 Linux 服务器,直接用第一条。如果你只是在自己电脑上做开发,Windows 或 macOS 就用 Docker Desktop。千万别在 Linux 服务器上装 Docker Desktop,没必要,还会套一层虚拟机,纯粹浪费资源。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前的一小时避坑:系统检查、旧环境清理、网络准备
2.1 先看系统版本、内核和架构
装 Docker Engine 前,至少确认三件事:发行版和版本号、CPU 架构、内核版本。很多人跳过这步直接复制命令,结果 apt 源配置错、软件包装不上,回头又找不到原因。
查看命令:
bash复制cat /etc/os-release
uname -m
uname -r
- /etc/os-release 会告诉你系统是 Ubuntu 还是 Debian,版本号多少,这决定你用哪个 apt 源路径。
- uname -m 查看架构。绝大多数服务器是 x86_64,树莓派或 ARM 服务器是 aarch64。虽然安装命令本身不分架构,但如果你想确认系统架构是否被 Docker 支持,这一步能看出来。
- uname -r 看内核版本。建议 4.15 以上,太老的系统内核可能不支持 overlay2 存储驱动,虽然 Docker 会自动降级,但性能和稳定性都差一些。
我遇到过一个真实案例:有个同学在 Ubuntu 16.04 上照着 20.04 的教程配源,路径里的版本名写错,apt update 直接 404。所以第一步真的要确认系统版本。
2.2 清理旧版本,避免装完起不来
如果你之前用发行版自带的 docker.io 装过 Docker,或者装过一些来历不明的一键脚本,重新安装前最好先把旧的卸干净。残留的旧配置、旧的 systemd 服务文件,可能让新版本装完以后无法启动。
建议按这个顺序清理:
bash复制sudo apt remove docker docker-engine docker.io containerd runc
注意,这个命令只会卸载软件包,不会自动删除 /var/lib/docker 下的镜像、容器数据。如果你确定旧数据不要了,可以再手动清理:
bash复制sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
这里要提醒一句:rm -rf 这种命令看清路径再执行,不要顺手把别的目录带进去。我自己习惯是在清理之前先把 /var/lib/docker 目录改名备份,比如 mv /var/lib/docker /var/lib/docker.bak,确认新环境没问题再删,多花一分钟买个安心。
2.3 网络和软件源准备:先解决 apt update 的问题
安装过程最卡的一步通常是 apt update 和下载软件包。如果你在服务器上发现 apt update 很慢、超时或者 404,先别急着怀疑 Docker 仓库,先确认两块:
- DNS 是否正常:
ping download.docker.com能通吗,不行先检查 /etc/resolv.conf。 - 系统本身的软件源是否正常:很多国内服务器默认源更新慢,可以换成国内公共镜像源,但换源这件事每个发行版操作不同,不要照搬网上的旧教程。
Docker 官方仓库的地址在国内访问偶尔会慢,这个问题有两个解决办法。一是配置 docker 官方源后直接用,适合网络状况好的场景。二是使用系统所在区域常见的公共镜像仓库服务,这个我会在第 3 节写清楚。
我个人习惯是优先配官方仓库,软件包完整性最有保障。如果确实慢到无法忍受,再换成公共镜像仓库,并注意核对签名密钥。
3. Ubuntu / Debian 系完整安装实操:从配置源到跑通第一个容器
3.1 配置 Docker 官方 apt 源
下面这套命令以 Ubuntu 22.04 为例,Debian 系同理,只是版本代号不同。先安装依赖:
bash复制sudo apt update
sudo apt install -y ca-certificates curl
ca-certificates 用于校验 HTTPS 证书,curl 用来下载密钥。接下来创建密钥目录并下载 Docker 的 GPG 密钥:
bash复制sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
为什么要把密钥放到 /etc/apt/keyrings 而不是直接 apt-key add?这个是我特别想强调的一点。apt-key 是全局信任,旧方法有安全隐患,新版本 apt 也逐步弃用了。放到独立目录然后用 signed-by 指定,是现在官方推荐的做法,只信任这一个源使用的密钥。
接着写入软件源配置。这里我用的是 Ubuntu 的代号 jammy,如果你的系统是 Debian,把 ubuntu 换成 debian,代号换成 bookworm 或 bullseye:
bash复制echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
这段命令稍微拆开解释一下:dpkg --print-architecture 自动识别架构,. /etc/os-release 读取系统的版本代号,避免你手写错。这段配置把 Docker 官方 stable 仓库加到了独立文件 /etc/apt/sources.list.d/docker.list,不动系统主源文件,之后出问题也容易排查。
3.2 安装 Docker Engine 与 Compose 插件
更新源并安装:
bash复制sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
注意这几个包名:docker-ce 是社区版引擎,docker-ce-cli 是命令行工具,containerd.io 是容器运行时,docker-buildx-plugin 是镜像构建插件,docker-compose-plugin 是 Compose 插件。一起装,后面不用再补。
如果你选了国内公共镜像仓库,包名一样,只是源地址不同。安装完成后先别急着跑容器,先启动服务:
bash复制sudo systemctl enable --now docker
enable 是设置开机自启,--now 是立刻启动。然后看下状态:
bash复制sudo systemctl status docker
如果看到 active (running) 基本就成了。这一步如果失败,最常见原因是之前旧容器有残留配置,或者内核模块没加载。排查方法我会放到第 5 节详细说。
3.3 跑第一个容器验证安装
最简单的验证方式是跑官方提供的 hello-world 镜像:
bash复制sudo docker run hello-world
这个命令会先从 Docker Hub 拉取 hello-world 镜像,再创建一个临时容器运行它。如果看到一段英文说明,表示整个链路都是通的。注意第一次拉镜像需要网络能访问 Docker Hub,国内网络可能卡在这里。如果拉取超时,可以先看第 5 节配镜像加速源再回来验证。
验证通过后,不要急着高兴,还有一件事必做:确认 Docker 已经开机自启,避免服务器重启后服务没起来。检查命令:
bash复制sudo systemctl is-enabled docker
输出 enabled 就表示开机自启已生效。这个细节在临时测试机上无所谓,但生产服务器上特别重要,我见过不少机器重启后容器全部消失、服务却不知道去哪儿的现场。
4. Windows / macOS 与 Linux 桌面版的安装要点
4.1 Windows 上安装 Docker Desktop
Windows 上装 Docker 的体验比几年前好多了,现在的标准方案是 Docker Desktop,它依赖 WSL2。安装前先把 WSL2 准备好,否则 Docker Desktop 装完可能起不来。
在管理员 PowerShell 里执行:
powershell复制wsl --install
装完重启后确认 WSL 版本:
powershell复制wsl --status
看到 WSL 2 就对了。如果系统不支持 WSL2,Docker Desktop 会尝试用 Hyper-V,但 Windows 家庭版没有 Hyper-V,只能用 WSL2 这条路。
然后去 Docker 官网下载 Docker Desktop 安装包,双击安装即可。安装界面里保持默认选项,一般不需要改。装完以后它会要求你启动 WSL 后端,跟着向导走就行。
我在 Windows 上踩过一个很典型的坑:WSL2 已经装了,但 Docker Desktop 一直显示无法连接。后来发现是 WSL 内核版本太旧,执行 wsl --update 更新内核后就好了。所以如果遇到 Docker Desktop 连接问题,先别重装,更新 WSL 内核往往就解决了。
4.2 macOS 上的安装与架构选择
macOS 同样推荐 Docker Desktop,注意区分 Intel 芯片和 Apple Silicon 芯片,下载对应的安装包。判断方法很简单,点左上角苹果图标,关于本机里看“芯片”一栏。现在新上市的 Mac 基本都是 Apple Silicon,旧款 Intel Mac 不要下错包。
Docker Desktop for Mac 安装时会在系统偏好设置里请求辅助功能权限,这一步允许即可,别拒绝,否则之后操作可能异常。它还收费吗?个人和小规模使用免费,大企业需要订阅,这个看官网最新政策就行。
关于架构,我多说一句:Apple Silicon Mac 上跑 x86 镜像,Docker 会通过模拟层执行,性能打折且部分老镜像可能跑不起来。遇到这种镜像,优先找 arm64 版本,或者用 buildx 构建多架构镜像。这是开发阶段很实用的经验。
4.3 Linux 桌面版不要乱装 Docker Desktop
Docker Desktop 也有 Linux 版,但我不建议在普通的 Linux 桌面或服务器上装。它需要一套虚拟机环境,在 Linux 上还要额外满足一堆依赖,而 Linux 原生 Docker Engine 完全够用,没必要套娃。
有一种例外情况:你希望用 Docker Desktop 的图形界面管理镜像和容器,并且需要与 Windows/macOS 同事保持一致的开发体验,那可以按官方文档装。但如果是生产服务器,绝对不要装桌面版。原因很简单,生产环境要的是可控、稳定、最小依赖,不是图形界面。
5. 装完后的环境加固:用户权限、镜像加速、故障排查清单
5.1 把当前用户加进 docker 组
安装完成后你会发现,不加 sudo 直接敲 docker 命令会报错:
bash复制docker ps
# Got permission denied while trying to connect to the Docker daemon socket
原因是 Docker 守护进程的 unix socket 默认只允许 root 和 docker 组的用户访问。解决办法是把当前用户加入 docker 组:
bash复制sudo usermod -aG docker $USER
执行完以后,当前终端不会立刻生效,需要重新登录或者开一个新终端。也可以执行:
bash复制newgrp docker
让当前会话立即生效。之后就能直接 docker ps、docker images 了。
这里我要特意说一个安全问题:加入 docker 组相当于给了用户接近 root 的权限,因为 docker 容器可以挂载宿主机目录,绕过硬编码的权限限制。所以生产服务器上,不要为了让所有人免 sudo 就给一堆人加组,这个组只应该给确实需要管理容器的人。如果团队协作,最好配合 sudo 的细粒度规则,而不是一刀切加组。
5.2 配置镜像加速源,解决拉镜像慢
如果你发现 docker pull 特别慢,或者直接超时,大概率是访问 Docker Hub 不顺畅。解决办法是给 Docker 配置镜像加速源。
编辑或创建 /etc/docker/daemon.json:
json复制{
"registry-mirrors": [
"https://你的加速服务地址"
]
}
这个“加速服务地址”怎么来?一般是各大云厂商提供的容器镜像服务控制台里分配给你的专属加速地址,格式类似 https://xxx.mirror.xxx.com。每个厂商分配给你的地址可能不一样,不要随便填一个网上找的通用地址,因为很多公共加速地址不稳定、过期快。
改完以后重启 Docker:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
然后跑 docker info,在输出里找到 Registry Mirrors 一栏,如果能看到你配置的地址,就说明加速源已生效。
我也要说明白:加速源只影响镜像拉取,不影响容器运行。如果你的网络拉 Docker Hub 本来就很快,不改也行。
5.3 安装失败的常见问题排查
整理一份我实际遇到的安装故障速查表,按频率排序:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| apt update 提示 404 | 软件源里的版本代号错误 | 检查 /etc/os-release,重新配置源 |
| apt update 提示公钥错误 | GPG 密钥未导入或指纹不匹配 | 重新下载 docker.asc,确认路径和权限 |
| docker.service 启动失败 | 旧配置残留、内核模块缺失 | 执行 journalctl -u docker 查看详细日志 |
| permission denied 连接 socket | 用户不在 docker 组 | 用 usermod 加入 docker 组并重新登录 |
| docker pull 超时 | 网络访问 Docker Hub 不通 | 配置镜像加速源 |
| WSL2 后端无法启动 | WSL 内核过旧 | 执行 wsl --update |
| 端口被占用导致容器启动失败 | 宿主机端口冲突 | 换端口或用 docker ps 检查占用 |
最值得说的是 docker.service 启动失败这一项。很多人在这一步直接放弃重装,其实大部分是旧版本卸载不干净导致的。遇到这种情况,先执行:
bash复制journalctl -u docker --no-pager | tail -n 50
看输出里有没有 containerd 启动超时、sock 文件冲突、iptables 初始化失败这些关键词。有 iptables 相关的报错,通常是你之前装过其他防火墙管理工具,比如 ufw,并做了复杂规则。解决方法是先停掉 docker,清空冲突规则,再启动 docker。具体规则因系统而异,但排查思路不变:先看日志,别瞎猜。
5.4 验证环境是否真正可用
最后再补一条验证项。很多人跑完 hello-world 就觉得环境没问题了,其实还可以再深一步验证,确保开发环境真正可用。
创建一个最小 Web 服务容器测试一下:
bash复制docker run -d --name test-nginx -p 8080:80 nginx:alpine
curl localhost:8080
看到 nginx 欢迎页说明容器网络端口映射没问题。测试完清理:
bash复制docker stop test-nginx
docker rm test-nginx
另外建议养成定期检查 Docker 环境的好习惯:
bash复制docker system df
这个命令会显示镜像、容器、卷、构建缓存的磁盘占用。容器跑一段时间后构建缓存会越来越占空间,该清理就清理:
bash复制docker system prune -a --volumes
注意这个命令会删除所有未使用的镜像、停止的容器、未使用的网络和卷。如果你有些数据卷里的数据还想留着,别带 --volumes 参数。我每次清理前都会先看一下 docker system df 的输出,再决定删到哪一层。
以我个人的经验,如果把第 2 节的检查做扎实、第 3 节的命令按顺序执行,Linux 服务器上安装 Docker 的环境几乎没有失败过。真正容易出问题的,反而是装完之后不验证权限、不自检服务状态。到最后,这个环境里真正重要的事情其实只剩两件:一是系统重启后 Docker 能自己起来,二是你需要的人能正常操作而不需要找你要 root 密码。这两件事都做到了,后面跑容器、写 compose 才会顺手。
