Linux服务器如何安装Docker?从环境检查到容器运行的完整教程

拿到一台新的 Linux 服务器,想把 Docker 装上并跑起第一个容器,看起来很简单,但新手常卡在这几步:系统里已经装了旧版 docker 冲突、内核或 cgroup 版本不对、装完拉镜像一直超时、重启后 Docker 没自启、非 root 用户执行 docker 命令报权限错误。这篇文章按真实操作顺序,从环境检查、旧版本卸载、官方仓库安装、配置镜像加速、启动自启、验证运行,到加入 docker 组和 rootless 模式,一步步讲清楚,并同时给出 RHEL/CentOS/Rocky 系和 Debian/Ubuntu 系两套命令。照着做,一台干净的服务器半小时内能跑起容器。

先说明一个原则:安装方式尽量走官方软件仓库,不要用系统自带的 docker.io 包,也不要随手下载来历不明的二进制。官方仓库的版本新、组件完整、升级路径清晰,这是生产环境的稳妥选择。

一、安装前的环境检查

Docker 需要 64 位系统,内核有一定要求。现代 Docker 依赖内核的 cgroup 和 namespaces 能力,内核版本过低会缺功能。经验上,3.10 及以上内核基本可用(CentOS 7 的内核是 3.10),4.x、5.x 内核更完善。先确认系统信息。

# 查看系统与内核版本
uname -r                 # 内核版本,例如 5.15.0-91-generic
cat /etc/os-release      # 发行版与版本,确认是 rhel/centos/rocky/ubuntu/debian
uname -m                 # 架构,通常是 x86_64 或 aarch64

# 检查内核是否启用了 cgroup
mount | grep cgroup
ls /sys/fs/cgroup/       # 应能看到内容;cgroup v2 会大量出现 cgroup.controllers

关于 cgroup:老内核用 cgroup v1,较新的内核(Ubuntu 22.04、Rocky 9、Debian 12 等)默认启用 cgroup v2。Docker 20.10 以后对 cgroup v2 支持良好,一般不用手动切换。但要注意:如果系统里 cgroup 挂载是空的,容器可能起不来,这时需要确认内核启动参数里没有禁用 cgroup,或者系统是否跑在受限的容器里。

另外确认一下有没有装过旧版本,以及磁盘空间是否充足。

# 是否已有 docker 相关包
rpm -qa | grep -E 'docker|containerd'          # RHEL/CentOS/Rocky 系
dpkg -l | grep -E 'docker|containerd'          # Debian/Ubuntu 系

# 磁盘空间,镜像和容器都吃磁盘,建议系统盘留 20G 以上或单独挂载 /var/lib/docker
df -h / /var/lib/docker 2>/dev/null

二、卸载旧版本

如果系统里装过 docker、docker-engine、docker.io、podman-docker 等旧包,强烈建议先清理干净,避免版本冲突。注意:卸载本身不会自动删除 /var/lib/docker 里的镜像和容器数据,如果要彻底清空,需要手动删除该目录(这一步会删除所有镜像和容器,务必确认没有在用)。

# RHEL/CentOS/Rocky 系
sudo yum remove -y docker docker-client docker-client-latest \
  docker-common docker-latest docker-latest-logrotate \
  docker-logrotate docker-engine
# 部分系统 podman-docker 会和 docker 命令冲突,按需卸载
sudo yum remove -y podman-docker

# Debian/Ubuntu 系
sudo apt-get remove -y docker docker-engine docker.io containerd runc

# 谨慎:彻底清除所有镜像与容器数据(不可恢复,请先确认)
# sudo rm -rf /var/lib/docker /var/lib/containerd

上面这条 rm -rf /var/lib/docker 是危险操作,生产环境执行前必须确认里面没有还在使用的数据,并且已经做好备份。删除后所有本地镜像、容器、卷都会消失。

三、配置官方仓库并安装

两套发行版的仓库配置方式不同,分别给出。

RHEL / CentOS / Rocky 系

# 1) 安装仓库管理工具与依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 2) 添加 Docker 官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 3) 安装 Docker 引擎(docker-ce 是引擎,cli 是客户端,containerd.io 是运行时)
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Debian / Ubuntu 系

# 1) 安装依赖并准备密钥
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

# 2) 添加官方 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 a+r /etc/apt/keyrings/docker.gpg

# 3) 添加仓库(Ubuntu;Debian 把 ubuntu 换成 debian)
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

# 4) 安装
sudo apt-get update
sudo apt-get 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 提供 docker compose 子命令(注意这是新版 compose v2,和旧的独立 docker-compose 二进制不同)。

四、配置国内镜像加速

装完先别急着拉镜像。国内直连 Docker Hub 经常超时,需要配置镜像加速器。加速地址由各云厂商提供,请到对应厂商控制台的容器镜像服务页面获取专属加速地址,不要使用来路不明的公共加速器(有安全与稳定性风险)。配置写在 /etc/docker/daemon.json。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "registry-mirrors": [
    "https://<你的加速器地址>.mirror.aliyuncs.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "data-root": "/var/lib/docker"
}
EOF

这里的 log-opts 顺手把日志上限也配了,后面第二十篇会讲为什么这很关键。data-root 用于把镜像存储换到更大的磁盘分区,如果 /var/lib/docker 空间紧张,就把它指到大盘上(注意:切换 data-root 后原有镜像不会自动迁移,需要另行处理)。

改完 daemon.json 后必须重载让配置生效,格式写错会导致 dockerd 启动失败,改前建议先备份原文件。

五、启动服务与设置开机自启

现代发行版都用 systemd 管理服务。

sudo systemctl daemon-reload
sudo systemctl enable --now docker     # 启动并设为开机自启
sudo systemctl status docker           # 查看运行状态

如果服务起不来,用下面命令看日志定位原因(多数是 daemon.json 语法错误或 data-root 目录权限问题)。

sudo journalctl -u docker --no-pager -n 50
sudo dockerd --validate --config-file=/etc/docker/daemon.json   # 校验配置语法

顺便确认一下自启是否真的生效:systemctl is-enabled docker 输出 enabled 才算配好,输出 disabled 说明开机不会自动拉起。这在服务器重启后容器全没了的事故里是最常见的原因之一,值得单独核对一遍。

六、验证安装:跑通第一个容器

docker version           # 客户端与服务端版本
docker info              # 引擎信息,会显示存储驱动、镜像加速地址、cgroup 版本等
docker run hello-world   # 拉取并运行官方测试镜像

docker info 输出里重点看几项:Storage Driver 应为 overlay2(现代默认);Cgroup Version 会显示 1 或 2;Registry Mirrors 应列出你配置的加速地址。hello-world 能打印出说明文字,就代表整套链路(守护进程、运行时、网络、拉取)都正常。

再跑一个真实点的容器试试。

docker run -d --name web -p 8080:80 nginx:alpine
curl -I http://127.0.0.1:8080
docker logs web
docker rm -f web

七、把普通用户加入 docker 组

默认只有 root 能用 docker 命令,普通用户执行会报 permission denied。把用户加入 docker 组即可免 sudo。

sudo usermod -aG docker $USER
newgrp docker        # 当前会话立即生效;或直接重新登录
docker ps            # 不再需要 sudo

必须强调一个安全事实:docker 组的权限等同于 root。因为能操作 Docker 就意味着能挂载宿主目录、能以特权模式运行容器,等于拿到了宿主机的 root。所以只把确实需要的账号加进 docker 组,不要随意扩大。生产环境更稳妥的做法是配合集中式认证、审计和最小权限原则。

八、rootless 模式简述

如果连这个风险都想规避,可以用 rootless 模式:让 dockerd 以普通用户身份运行,容器也在这套用户权限下运行,漏洞影响面被限制在该用户范围内。代价是功能有取舍——比如不能直接用低端口(<1024)、部分网络功能受限、性能略低。

# 安装 rootless 依赖(Ubuntu 示例)
sudo apt-get install -y uidmap dbus-user-session

# 用官方脚本或包管理器提供的 rootless 工具初始化(以 dockerd-rootless-setuptool 为例)
dockerd-rootless-setuptool.sh install
export PATH=/usr/bin:$PATH
systemctl --user enable --now docker

rootless 适合个人开发机、CI 构建节点等场景;对需要完整网络能力、低端口、或对性能敏感的生产服务,还是用常规模式。

九、安装后的目录布局与升级维护

装完之后,了解一下文件都放在哪里,排障时会省很多事。核心的二进制在 /usr/bin/docker(客户端)和 /usr/bin/dockerd(守护进程);配置文件是 /etc/docker/daemon.json;守护进程的系统服务单元是 /lib/systemd/system/docker.service;而真正的数据大头——镜像、容器可写层、卷——都躺在 /var/lib/docker 下。用 docker info 里的 Docker Root Dir 可以确认数据目录的实际位置,这也是磁盘告警时最该盯的目录。

日常升级很简单,因为走的是官方仓库,包管理器会一路处理依赖。

# Debian/Ubuntu:升级 docker 相关组件
sudo apt-get update && sudo apt-get install -y --only-upgrade \
  docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# RHEL/CentOS/Rocky:升级
sudo yum update -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 升级后重启引擎
sudo systemctl restart docker

这里有一条重要提醒:升级 Docker 引擎时,运行中的容器默认会被停掉(大多数发行版的服务脚本会在停止守护进程时停止容器),所以升级要挑业务低峰期,并且确保业务在重启后能自动拉起(用 --restart=unless-stopped 或 Compose 的 restart 策略)。另外要锁定版本、避免无人值守升级把引擎升到未经验证的新大版本,生产环境建议固定到某个小版本。

还有一点容易被忽略:docker 命令和 dockerd 的版本要尽量一致。如果只升级了客户端没升级引擎,或反之,可能出现 API 不兼容的告警。用 docker version 同时看到 Client 和 Server 两段,比对一下版本号即可。

常见问题

Q:装完执行 docker 提示 command not found?
说明包没装上或没进 PATH。检查安装是否成功(rpm -qa | grep docker-ce 或 dpkg -l | grep docker-ce),确认 /usr/bin/docker 存在。若装的是 rootless 或 snap 版本,路径可能不同。

Q:docker info 报 "Cannot connect to the Docker daemon"?
守护进程没运行或当前用户没权限。先 sudo systemctl start docker,再确认是否已在 docker 组(id | grep docker),组权限需要重新登录才生效。

Q:拉镜像一直卡住或超时?
大概率是网络问题。检查 daemon.json 里的 registry-mirrors 是否生效(docker info 能看到),确认加速地址正确,还有本机 DNS 与出网是否正常。也可以换用内网自建仓库。

Q:改完 daemon.json 后 docker 起不来了?
多半是 JSON 语法错误(多了逗号、少了引号)。用 dockerd --validate 校验,或先恢复备份的旧配置再逐项调整。

Q:CentOS 7 上安装会报内核或依赖问题吗?
CentOS 7 内核是 3.10,官方 Docker 仍支持,但该版本系统已停止维护,建议新项目直接上 Rocky 9 / Ubuntu 22.04 及以上。旧系统如需长期使用,注意补丁与内核升级。

总结

安装 Docker 的稳妥路径是:先查内核与 cgroup 环境、清理旧包,再通过官方仓库安装 docker-ce、containerd.io 等组件,而不是用系统自带旧包。

装完第一件事是配置 /etc/docker/daemon.json:既要配国内镜像加速解决拉取慢,也要顺手配日志上限避免日后磁盘被日志撑满。

启动用 systemd 管理,systemctl enable --now docker 同时完成启动与开机自启;起不来就查 journalctl -u docker 和校验配置语法。

验证链路用 docker info 看存储驱动、cgroup 版本和加速地址,用 docker run hello-world 和跑一个 nginx 容器确认端到端可用。

把用户加入 docker 组能免 sudo,但要牢记这等于给 root 权限;对隔离要求高的场景,再考虑 rootless 模式。