服务器怎么安装Docker

结论: 在服务器上安装 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 或绑定宿主机目录。

第一步:卸载旧版本并安装依赖

如果服务器上曾经装过旧包,先清干净,避免文件冲突:

bash
# 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-release

CentOS 系列对应命令:

bash
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:

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 $(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-plugin

CentOS Stream / Rocky / AlmaLinux:

bash
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

想快速验证环境、不介意用官方一键脚本的,也可以用(生产环境建议仍走仓库安装以便版本管理):

bash
curl -fsSL https://get.docker.com | sudo sh

启动并设置开机自启:

bash
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 守护进程的配置文件,下面是一份可直接使用的生产配置:

json
{
  "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 网段冲突。

改完必须重载配置:

bash
sudo mkdir -p /data/docker
sudo systemctl reload docker      # daemon.json 改完用 reload,不会重启容器
docker info | grep -A5 'Registry Mirrors'

如果要把已有数据迁到新的 data-root,正确顺序是停服务再搬:

bash
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 权限(因为可以挂载宿主机根目录),只应授予可信账号。

bash
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 权限与当前生效组:

bash
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 就直接可用;未安装时手动补装:

bash
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 并挂载宿主机目录):

yaml
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"
bash
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