结论: 在服务器上安装 Docker 的正确做法是从 Docker 官方仓库安装 Docker Engine(而不是系统自带源里的旧包),然后配置 /etc/docker/daemon.json 设置镜像加速与日志轮转,再安装 docker-compose-plugin 获得 docker compose v2 命令,最后把运维用户加入 docker 组即可免 sudo 使用。全部流程五分钟内可完成。
引言:为什么推荐官方仓库安装
很多教程一上来就是 apt install docker.io,这条命令能用,但装的是发行版维护的旧版本,往往落后官方若干个大版本,且包名、目录结构、compose 插件都和官方文档对不上,照着文档操作会踩一堆坑。生产环境建议一律使用 download.docker.com 官方仓库,版本可控、升级路径清晰。
本文覆盖 Ubuntu 24.04 LTS / Debian 12 与 CentOS Stream 9 / Rocky Linux 9 两大类系统,给出的命令可直接复制执行。截至 2026 年,Docker Engine 的最新稳定版为 27.x / 28.x 系列,Compose 为 v2.x。
安装前先搞清三个概念
结论:Docker 的三层核心是镜像(Image)→ 容器(Container)→ 仓库(Registry),理解它们的区别,后面所有命令的含义就都通了。
| 概念 | 英文 | 是什么 | 类比 | 常用命令 |
|---|---|---|---|---|
| 镜像 | Image | 只读的模板,包含运行环境和程序 | 操作系统的安装光盘 | docker images、docker pull |
| 容器 | Container | 镜像运行起来的实例,可读可写 | 装好的一台电脑 | docker run、docker ps |
| 仓库 | Registry | 存放和分发镜像的服务 | 应用商店 | docker pull、docker push |
| 数据卷 | Volume | 独立于容器生命周期的持久化目录 | 外接移动硬盘 | docker volume ls |
| Compose | — | 用 YAML 描述多容器应用的编排工具 | 批量装机脚本 | docker compose up -d |
需要记住的关键差异:容器销毁后里面的文件就没了,数据库、上传目录这类必须持久化的数据一定要挂 Volume 或绑定宿主机目录。
第一步:卸载旧版本并安装依赖
如果服务器上曾经装过旧包,先清干净,避免文件冲突:
# Ubuntu / Debian
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove -y $pkg
done
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-releaseCentOS 系列对应命令:
sudo dnf remove -y docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
sudo dnf install -y dnf-plugins-core curl第二步:添加官方仓库并安装 Docker Engine
结论:官方仓库提供了 docker-ce(社区版引擎)、docker-ce-cli(命令行)、containerd.io(容器运行时)、docker-buildx-plugin(构建器)、docker-compose-plugin(编排插件)五个包,一次装齐最省事。
Ubuntu / Debian:
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 $(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-pluginCentOS Stream / Rocky / AlmaLinux:
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin想快速验证环境、不介意用官方一键脚本的,也可以用(生产环境建议仍走仓库安装以便版本管理):
curl -fsSL https://get.docker.com | sudo sh启动并设置开机自启:
sudo systemctl enable --now docker
sudo systemctl status docker --no-pager
docker version # 应同时显示 Client 与 Server 两部分
docker compose version # 确认 v2 插件已就绪
sudo docker run --rm hello-world看到 "Hello from Docker!" 说明内核、运行时、网络、镜像拉取四条链路全部正常。
第三步:配置镜像加速与 daemon.json
结论:国内服务器直接拉 Docker Hub 经常超时,必须配置镜像加速器。需要注意的是,截至 2026 年公开的第三方加速地址变动非常频繁,大量早期教程里的公共加速器已经停用,因此最稳妥的做法是使用云厂商为你分配的专属加速地址(例如阿里云容器镜像服务控制台生成的 https://xxxx.mirror.aliyuncs.com),或者为 Docker 守护进程配置 HTTP 代理。
/etc/docker/daemon.json 是 Docker 守护进程的配置文件,下面是一份可直接使用的生产配置:
{
"registry-mirrors": ["https://你的专属ID.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"live-restore": true,
"data-root": "/data/docker",
"default-address-pools": [
{ "base": "172.20.0.0/16", "size": 24 }
]
}各参数含义:
registry-mirrors:镜像加速器列表,按顺序尝试,失效的会自动跳过。exec-opts: native.cgroupdriver=systemd:让容器与 systemd 的 cgroup 驱动一致,是部署 Kubernetes 的前置条件。log-opts:限制单个容器日志 100 MB、最多 3 个文件,不配置的话json-file日志会把磁盘写满。注意它只对新建容器生效,已有容器需重建。live-restore: true:升级或重启 dockerd 时保持容器继续运行,不影响业务。data-root:修改镜像与容器的存储目录,适合系统盘较小、有大容量数据盘的服务器。default-address-pools:自定义容器网段,避免和公司内网或云厂商 VPC 网段冲突。
改完必须重载配置:
sudo mkdir -p /data/docker
sudo systemctl reload docker # daemon.json 改完用 reload,不会重启容器
docker info | grep -A5 'Registry Mirrors'如果要把已有数据迁到新的 data-root,正确顺序是停服务再搬:
sudo systemctl stop docker docker.socket
sudo rsync -aP /var/lib/docker/ /data/docker/
sudo systemctl start docker
docker images # 确认镜像仍在第四步:非 root 用户使用 Docker
结论:把用户加入 docker 组后即可免 sudo 操作,但要注意docker 组的成员等同于拥有 root 权限(因为可以挂载宿主机根目录),只应授予可信账号。
sudo usermod -aG docker $USER
newgrp docker # 立即生效,或退出重登
id -nG # 确认 docker 出现在组列表里
docker run --rm alpine echo "no sudo works"如果仍然报错 permission denied while trying to connect to the Docker daemon socket,检查 socket 权限与当前生效组:
ls -l /var/run/docker.sock
# 若组不是 docker,重启 docker 服务让其重建 socket
sudo systemctl restart docker对安全要求更高的场景,可以启用 Docker 的 rootless 模式(Rootless mode),让守护进程以普通用户身份运行,牺牲少量性能换取权限隔离。
第五步:验证 docker compose v2 与部署第一个应用
结论:Compose v2 的命令是 docker compose(空格),不是老版的 docker-compose(连字符)。二者配置文件格式基本一致,但 v2 是 Go 重写的插件版本,支持 profiles、更快的构建与更完整的 CLI 参数。
若前面已安装 docker-compose-plugin 就直接可用;未安装时手动补装:
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL "https://github.com/docker/compose/releases/latest/download/docker-compose-linux-$(uname -m)" \
-o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
docker compose version用一个最小 compose 文件验证整条链路(部署一个 Nginx 并挂载宿主机目录):
services:
web:
image: nginx:1.27-alpine
container_name: my-nginx
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
- ./conf/nginx.conf:/etc/nginx/nginx.conf:ro
logging:
driver: json-file
options:
max-size: "50m"
max-file: "2"mkdir -p ~/demo/{html,conf} && cd ~/demo
echo 'Docker is running
' > html/index.html
docker compose up -d
docker compose ps
curl -I http://127.0.0.1:8080
docker compose logs -f web
企业QQ咨询




