ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Docker CE 安装全攻略:从环境预检到故障排查的完整指南

Docker CE 安装全攻略:从环境预检到故障排查的完整指南 装 Docker CE 这件事网上教程一抓一大把但我实际折腾过好几台机器、也帮人排过不少安装后的疑难杂症之后发现很多人卡住的地方其实根本不是命令敲没敲对而是对“Docker CE 到底是什么”“安装之后该怎么验证它真的能用”缺乏一个完整的概念。这篇文章我就从实际操作角度出发把 Docker CE 的选型逻辑、安装前的环境检查、不同系统的安装路径、装完之后的权限配置、验证方法以及常见故障排查一次性讲清楚。如果你正准备在一台全新的 Linux 服务器或者自己的开发机上安装 Docker CE这篇文章应该能帮你少走不少弯路。1. 为什么是 Docker CE版本选型里的门道1.1 Docker CE 与 Docker EE 的本质区别Docker 从 2017 年开始把版本拆分成了两条线Docker CECommunity Edition社区版和 Docker EEEnterprise Edition企业版。Docker CE 是免费使用的由社区和 Docker 公司共同维护适合个人开发者、小型团队以及大多数中型公司的日常开发和部署场景。Docker EE 则是商业化产品增加了镜像安全扫描、基于角色的访问控制、LDAP/AD 集成、集群管理增强等企业级功能按节点收费。对于绝大部分场景来说Docker CE 的功能已经绰绰有余。它包含了完整的容器运行时containerd、镜像构建工具buildx、容器编排的基础能力docker compose 插件以及 Docker CLI 和 API。很多人会有个误区觉得 CE 版本不稳定或者功能被阉割其实不是这样。Docker CE 的更新节奏是每个月发布一个 Edge 版本每季度发布一个稳定版本稳定性是有保障的。我自己的生产环境服务器跑 Docker CE 跑了三年多从来没有因为 CE 和 EE 的差异出过问题。1.2 版本号背后的含义另外一个容易混淆的点是 Docker 的版本号规则。早期 Docker 的版本号是 1.x比如 1.13后来从 17.03 开始改成了类似年份.月份的命名方式比如 18.09、19.03再后来从 20.10 开始又回到了语义化版本号的风格。所以当你看到 Docker CE 20.10、Docker CE 24.0、Docker CE 26.1 这样的版本号时不要觉得奇怪这只是 Docker 在不同历史阶段的命名习惯。我建议大家在安装时优先选择当前最新的稳定版本而不要贪图省事直接装系统自带的旧版本。比如 Ubuntu 的 apt 源里自带的 docker.io 包版本经常比 Docker 官方源慢了一年以上而且缺少一些新版特性。用官方源安装 Docker CE 才能真正享受到最新的 bug 修复和安全补丁。2. 安装前的环境预检这一步省了后面全是坑2.1 操作系统与内核版本要求Docker CE 对操作系统有明确的支持矩阵。以最常见的 Ubuntu 为例官方支持 Ubuntu 22.04Jammy、24.04Noble等长期支持版本CentOS 方面支持 7 和 8不过 CentOS 8 已经停止维护了现在更多人用 Rocky Linux 或 AlmaLinux 替代Debian 则支持 Bookworm12和 Bullseye11。比操作系统版本更重要的是内核版本。现代 Docker 依赖 Linux 内核的 namespace、cgroups、overlayfs 等特性内核太老会导致容器跑不起来。64 位系统的内核版本要求至少是 3.10但我强烈建议不要低于 4.18最好用 5.x 或更新的内核。怎么查看内核版本执行uname -r如果内核版本太老优先考虑升级内核而不是硬装 Docker。我在一台 CentOS 7 的老机器上试过内核 3.10 勉强能跑 Docker但 overlay2 存储驱动偶尔会出问题换成老旧的 vfs 驱动又严重影响性能那体验真的是一言难尽。2.2 清理历史残留卸载旧版本和冲突软件包这一步是很多人忽略的。如果你的机器上之前用系统自带的包管理器装过 Docker比如 Ubuntu 下的 docker.io、docker-engineCentOS 下的 docker、docker-common或者用 Snap 装过 DockerUbuntu 上很常见这些残留的组件会和 Docker CE 冲突。我遇到过一个典型场景一位朋友在 Ubuntu 上用 snap 安装了 Docker之后想改成官方源安装 Docker CE结果怎么装都不对docker version 显示的始终是旧版本。排查了半天才发现是 snap 版本的 docker 命令优先占据了 PATH 路径。处理办法很简单先把旧的卸载干净# Ubuntu / Debian sudo apt remove docker docker-engine docker.io containerd runc sudo snap remove docker # 如果装过 snap 版 # CentOS / RHEL 系 sudo yum remove docker docker-client docker-common docker-selinux docker-engine注意这一步一般不会删除 /var/lib/docker 目录下的镜像、容器和数据卷所以不用担心数据丢失。但如果你的机器上真的跑着重要的容器卸载前务必确认数据已经备份或迁移。2.3 存储空间与文件系统检查Docker 默认把所有的镜像、容器、数据卷都存放在 /var/lib/docker 目录下。一个完整的开发环境镜像动辄几个 GB如果磁盘空间不够安装时看不出问题等拉镜像的时候就开始报 no space left on device 了。建议安装前用 df -h 检查一下 /var/lib/docker 所在分区的剩余空间至少留出 10GB生产环境建议 50GB 以上。另外如果根分区是 LVM 或者有独立的 docker 分区提前规划好挂在哪个位置。如果想修改 Docker 的数据目录比如放到一块独立的数据盘上可以在 /etc/docker/daemon.json 里配置 data-root 参数这个后面会细说。3. 主流安装路径实操APT 与 YUM 两种仓库安装法3.1 Ubuntu / Debian 系通过官方 APT 仓库安装这是最推荐、也最规范的安装方式。通过官方 APT 仓库安装后续执行 apt update apt upgrade 就能顺带升级 Docker 组件非常省心。步骤如下第一步安装依赖包sudo apt update sudo apt install -y ca-certificates curl gnupg这几个包的作用分别是ca-certificates 提供 CA 证书用于 HTTPS 访问curl 用来下载 GPG 密钥gnupg 用来导入和验证密钥。第二步添加 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这里有个细节值得说一下。以前很多教程用的是apt-key add但 apt-key 在 Debian 11、Ubuntu 22.04 之后被标记为 deprecated 了新办法就是把密钥文件直接放到 /etc/apt/keyrings 目录下。install -m 0755 -d 的意思是创建目录并设置权限确保目录对所有用户可读可执行。chmod ar 是为了让非 root 用户也能读取密钥文件否则 apt 更新时有可能会因为权限问题报错。第三步添加 Docker 仓库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这条命令的信息量比较大我拆开解释一下。$(dpkg --print-architecture) 会自动检测你的系统架构amd64、arm64 等保证源地址正确$(. /etc/os-release echo $VERSION_CODENAME) 是读取系统版本代号比如 Ubuntu 22.04 会读取为 jammy。这样做的好处是脚本化执行的时候不用手动改版本号换机器也能直接用。第四步安装 Docker CEsudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin注意这里装的不是一个孤立软件包而是一整套组件docker-ceDocker 守护进程dockerd本体docker-ce-clidocker 命令行工具containerd.io容器运行时Docker 底层实际调用 containerd 来管理容器生命周期docker-buildx-plugin新版的镜像构建插件docker build 命令背后的实际执行者docker-compose-pluginDocker Compose 的官方插件版支持docker compose子命令如果以后想单独装 Compose插件版用apt install docker-compose-plugin就行不用再像老教程那样下载一个独立的二进制文件了。3.2 CentOS / RHEL 系通过官方 YUM 仓库安装CentOS 系的思路类似只是包管理器和源配置方式不同# 第一步安装 yum-utils 工具集 sudo yum install -y yum-utils # 第二步配置 Docker 官方仓库 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-buildx-plugin docker-compose-pluginCentOS 系装完之后有个额外的步骤启动守护进程并设置开机自启。sudo systemctl start docker sudo systemctl enable dockerUbuntu/Debian 系装完 Docker 后守护进程是自动启动的但 CentOS 系通常需要手动执行这一步。这是很多从 Ubuntu 迁移到 CentOS 的用户最容易漏掉的操作——装完了发现 docker 命令根本不能用一查才发现服务压根没起来。3.3 用官方脚本安装适合快速测试但别用于生产Docker 官方提供了一个自动化安装脚本curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh这个脚本会自动检测系统版本、配置源、安装组件一条命令搞定。我自己在全新机器上做验证的时候用过几次确实方便。但我不建议在生产环境这么干原因有三个一是脚本的安装过程不够透明你不知道它具体执行了哪些操作二是它会把系统级配置改成一刀切的默认值三是出问题的时候排查链路不清晰。生产环境还是老老实实走官方仓库安装每一步都看得见摸得着。另外如果脚本在源配置这一步卡住国内网络访问 download.docker.com 速度不稳定最典型的症状就是脚本执行到配置仓库后长时间停住不动这时候可以 CtrlC 中断然后手动配置镜像加速源或者找个稳定的网络环境再执行。4. 配置镜像加速国内服务器绕不开的一步装完 Docker CE 之后第一件事不是急着拉镜像而是配置 registry mirror。默认情况下Docker 会从 Docker Hub 拉取镜像但 Docker Hub 的服务器主要部署在国外国内网络环境下拉取速度非常不稳定几十 MB 的小镜像等个三五分钟都是常事。解决方案是在 /etc/docker/daemon.json 里配置 registry-mirrors 参数。这个文件是 Docker 守护进程的全局配置文件如果不存在就手动创建。建议先看一下这个文件是否已有内容避免盲目覆盖已有的配置项sudo mkdir -p /etc/docker sudo cat /etc/docker/daemon.json # 先查看已有内容如果文件不存在或者内容为空可以直接写入新的配置。如果有内容则需要手工合并。例如{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.nju.edu.cn ] }修改完配置后重启 Docker 使其生效sudo systemctl daemon-reload sudo systemctl restart docker验证是否生效docker info | grep -A 5 Registry Mirrors镜像加速源的选择有一个规律尽量选择那些运营时间长、更新及时、支持 HTTPS 的源不同时期的可用性差异很大某个源今天好用不代表下个月还好用。配置多个源的意义在于 Docker 会按顺序尝试第一个不可用时自动切换下一个。替换或增加镜像加速源后日常的镜像拉取路径会优先经过加速服务机器上的其他容器和普通应用不会受影响不需要任何额外适配。如果你用的是云厂商的服务器建议优先使用云厂商自带的内网镜像加速服务比如阿里云容器镜像服务生成的专属加速地址稳定性远好于公共源具体配法以该云平台文档为准。提示公共镜像加速源的可用性动态变化如果发现拉镜像速度没有再明显提升可以多维护一两个可用候选源谁通谁上。5. 免 sudo 运行 Docker权限配置的细节5.1 为什么 docker 命令需要 root 权限安装完成后你用 docker version 查看版本时如果输出一切正常但在执行 docker ps 或 docker run 时却提示 permission denied这就涉及 Docker 的权限模型了。Docker 的守护进程 dockerd 本身以 root 身份运行它监听在 /var/run/docker.sock 这个 Unix socket 上。普通用户对这个 socket 没有访问权限所以执行 docker 命令时会报权限错误。让普通用户使用 Docker 的标准做法是把用户加入 docker 组sudo groupadd docker # 如果 docker 组不存在 sudo usermod -aG docker $USER newgrp docker # 或者干脆退出重新登录这里有个关键细节usermod -aG 修改用户组后需要重新登录会话才能生效。newgrp docker 命令可以临时切换当前会话的组身份不用退出登录就能测试但重启终端后效果更彻底。如果不执行任何一步直接继续用 docker 命令大概率还是报同样的权限错误。5.2 关于 docker 组权限的安全边界把用户加入 docker 组本质上等于授予了这个用户 root 级别的能力。因为 docker 组用户可以通过挂载宿主机目录的方式比如 docker run -v /etc:/host_etc拿到宿主机任意文件的读写权限甚至直接以特权模式启动容器。所以在多用户服务器上docker 组的成员要谨慎管理不要随便把普通用户加进来。如果只是自己单机开发用加入 docker 组是最方便的方案如果是团队共用的服务器建议用 sudo 管理 docker 命令或者配合 sudoers 细粒度控制。6. 验证安装与守护进程工作机制6.1 跑通 hello-world 的意义很多人装完 Docker 后习惯性执行 docker run hello-world看到 Hello from Docker! 就算验证成功。这个验证确实有效但它的完整意义值得展开说说。当你执行 docker run hello-world 时实际发生了以下事件Docker CLI 通过 /var/run/docker.sock 向守护进程发送请求守护进程检查本地有没有 hello-world 镜像没有则尝试从镜像仓库拉取拉取完成后创建容器容器内的 main 进程hello-world 的可执行文件打印一段说明文字后退出容器进入 Exited0状态也就是说如果 docker run hello-world 能顺利打印出那一段英文说明说明 Docker 的 CLI、守护进程、镜像拉取、容器运行时这整条链路都是通的。它验证的不仅是安装成功更是整个容器执行链路没有故障。如果只想验证守护进程是否在运行用 docker info 就能看到系统信息和存储驱动等状态。6.2 systemd 管理 Docker 的常用操作Docker CE 装好后会注册为 systemd 服务这意味着你可以用标准的 systemctl 命令管理它systemctl status docker # 查看守护进程运行状态 sudo systemctl restart docker # 重启守护进程 sudo systemctl enable docker # 设置开机自启部分系统安装后默认已启用如果你修改了 /etc/docker/daemon.json 配置注意先执行 sudo systemctl daemon-reload 再执行 restart确保 systemd 重新加载了配置。这一点很多人会忽略导致改了 daemon.json 后 restart 不生效白折腾半天。6.3 daemon.json 里值得初始化的配置项除了镜像加速源daemon.json 里还有几个值得在生产环境提前配置的参数{ registry-mirrors: [你的加速地址], log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, data-root: /data/docker }log-driver 和 log-opts 配置的是容器日志的大小轮转。默认情况下 Docker 把容器日志全量写到 /var/lib/docker/containers 下对应的 json 文件里如果容器里有个程序疯狂打日志磁盘很快就会被写满。max-size 和 max-file 相当于日志文件大小上限和保留份数配好之后 Docker 会自动做日志切割。data-root 则是把镜像和容器数据挪到其他分区适合根分区空间不足的场景。7. 常见安装后故障排查实录7.1 Cannot connect to the Docker daemon这个错太经典了。症状是执行 docker ps 时报Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?遇到这个提示按下面顺序排查首先确认守护进程是否起来了sudo systemctl status docker如果显示 active (running)说明守护进程正常问题多半在 socket 权限上按照上面免 sudo 运行 Docker那一节处理即可。如果显示 inactive (dead)先尝试手动启动sudo systemctl start docker启动后立刻查看状态如果仍然失败执行 journalctl -xu docker.service 查看守护进程的详细日志。我见过最多的原因有daemon.json 格式写错了少了一个逗号或引号不配对导致 JSON 解析失败、系统防火墙占用了 2375/2376 端口如果配了远程访问、以及磁盘空间不足导致 containerd 启动失败。7.2 内核兼容性与 iptables 问题在 CentOS 7 等老系统上Docker 启动后容器网络不通排查到最后往往发现是 Docker 默认依赖 iptables 来管理容器网络规则而系统自带的 iptables 版本和内核特性不匹配或者 firewalld/nftables 规则和 Docker 生成的 iptables 规则冲突。我处理过的实际案例里有个服务器在重启后所有容器外网全部失联最后定位是 firewalld 优先加载时把 Docker 的 FORWARD 链规则覆盖了。临时解决办法是sudo firewall-cmd --permanent --zonepublic --add-masquerade sudo firewall-cmd --reload生产服务器建议结合系统防火墙文档规划好 Docker 使用的网段与端口放行的对应关系并在配置完成后做一轮重启验证。7.3 拉取镜像超时与回归基础排查镜像拉取报dial tcp: lookup registry-1.docker.io: no such host或者一直转圈最后 timeout这在国内网络环境下很常见。处理思路就两条一是给 Docker 配镜像加速源前面说过的方法二是如果是 DNS 解析问题检查系统 /etc/resolv.conf 的 DNS 配置手动改为 223.5.5.5阿里 DNS或 119.29.29.29腾讯 DNS这种国内公共 DNS 再试试。docker pull 本身没有单独的 --retry 参数如果拉取中途断开直接重新执行 docker pull 命令即可Docker 会复用已下载的镜像层不用全部重新拉。7.4 老规矩查看日志是最好的排查起点排错的时候不要瞎猜。Docker 守护进程的日志通过 journald 管理执行 journalctl -u docker.service --since today 能看到今天所有的守护进程日志。如果某个容器反复启动失败宿主机日志未必能看到详细信息可以用 docker logs 查看该容器的日志如果容器连起都起不来用 docker ps -a 找到容器 ID 后执行 docker inspect 查看退出原因码。这一套组合拳解决了大部分安装后的问题。8. 安装完成后的周边配套到这里 Docker CE 本身已经安装完了但一个能真正用起来的 Docker 环境还差两件事。第一是 Docker Compose。新版 Docker CE 安装包已经集成了 compose 插件也就是 docker compose 这个子命令。确认是否可用docker compose version如果输出版本号就说明插件版 Compose 已就绪。不建议再用传统方式单独下载 docker-compose 二进制文件除非你的脚本有历史依赖。第二是容器的开机自启策略。Docker 容器的 restart 策略需要配置在 run 或 compose 文件里常见的是docker run -d --restart unless-stopped nginx也就是说与系统上的 Docker 服务是否开机自启无关容器自身的重启策略要靠 docker inspect ContainerName 或 docker inspect --format {{.HostConfig.RestartPolicy.Name}} ContainerName 来确认。最后分享一个实际操作中的心得很多人为了图省事安装时直接用了老教程里的 apt-get install docker.io后面想换官方 Docker CE 时发现卸载不干净、源冲突、版本混乱折腾的成本比一开始好好装还要高得多。所以如果可以尽量装最新稳定版 Docker CE一套配置沉淀下来既能少踩兼容性坑也能让后续的自动化部署脚本少很多对比分支。这次把安装 Docker CE 从选型到验证再到排错讲了一整圈希望你在自己机器上操作时能少一点困惑。如果装的过程中遇到某个报错让你百思不得其解不妨回到 daemon.json 和 systemd 日志这两个基础点重新审视——大部分表面复杂的故障底层原因往往很简单。
返回列表