在不能使用 Docker 官方 apt 仓库的环境里——内网机器、没有外网的服务器、或者只是 apt 源连不上——可以直接下载 deb 包手动安装。代价是每次升级都要重新下载一遍对应的包。本文整理从下载、安装到配置、验证的完整流程。
一、下载 deb 安装包
1. 找到对应版本的下载路径
入口地址是 https://download.docker.com/linux/ubuntu/dists/,逐级往下选:
- 在弹出的目录列表里选择 Ubuntu 版本代号(注意不是版本号);
- 进入
pool/stable/; - 选择架构目录:
amd64/armhf/arm64/s390x。
以 Ubuntu 24.04 为例,完整的下载目录是:
https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/amd64/常见 LTS 版本与代号对照:
| Ubuntu 版本 | 代号(Codename) |
|---|---|
| 18.04 LTS | bionic |
| 20.04 LTS | focal |
| 22.04 LTS | jammy |
| 24.04 LTS | noble |
| 26.04 LTS | resolute |
不确定当前系统代号时,可以用 lsb_release -cs 或 cat /etc/os-release 查看。非 LTS 的中间版本同样在 dists/ 列表里,以页面实际列出的代号为准。
官方地址在国内访问可能较慢或不稳定,可以改用清华 TUNA、阿里云等镜像站同步的 docker-ce 仓库(路径结构与官方一致,把域名换掉即可)。
2. 需要下载的五个包
手动安装需要把下面五个包全部下载下来,缺一个都会导致依赖装不上:
| 包名 | 作用 |
|---|---|
containerd.io | 容器运行时,Docker 的底层依赖 |
docker-ce | Docker Engine 本体,提供 dockerd 守护进程 |
docker-ce-cli | docker 命令行客户端 |
docker-buildx-plugin | buildx 构建插件,docker build 的新一代实现 |
docker-compose-plugin | compose 插件,提供 docker compose 子命令 |
文件名格式统一为 <包名>_<版本>_<架构>.deb,例如 docker-ce_28.0.1-1~ubuntu.24.04~noble_amd64.deb。注意版本号里带 ~ubuntu.24.04~noble 这样的标识,下载时要和系统版本对应上,把别的发行版或别的 Ubuntu 版本的包拿到一起装会直接失败。
二、安装
把下载好的 deb 包放到同一目录下,一次执行:
sudo dpkg -i ./containerd.io_<version>_<arch>.deb \
./docker-ce_<version>_<arch>.deb \
./docker-ce-cli_<version>_<arch>.deb \
./docker-buildx-plugin_<version>_<arch>.deb \
./docker-compose-plugin_<version>_<arch>.debUbuntu 24.04 上的实际例子(Docker 28):
sudo dpkg -i containerd.io_1.7.25-1_amd64.deb \
docker-ce_28.0.1-1~ubuntu.24.04~noble_amd64.deb \
docker-ce-cli_28.0.1-1~ubuntu.24.04~noble_amd64.deb \
docker-buildx-plugin_0.21.1-1~ubuntu.24.04~noble_amd64.deb \
docker-compose-plugin_2.33.1-1~ubuntu.24.04~noble_amd64.deb安装完成后 Docker 守护进程会自动启动。
两点建议:
dpkg -i会按命令行给出的顺序处理,但包之间有依赖关系,稳妥的做法是按 containerd.io → docker-ce-cli → docker-ce → buildx → compose-plugin 的顺序安装,或者干脆一次性给出全部五个包。- 五个包尽量选同一批次的版本。docker-ce 与 docker-ce-cli 版本跨度太大时,容易出现依赖不满足。
三、配置 daemon.json
Docker 默认把镜像和数据放在 /var/lib/docker。如果系统盘空间紧张,或者想自己指定安装目录,需要提前配置 daemon.json。
# 目录不存在就先创建
mkdir -p /etc/docker/
touch /etc/docker/daemon.json
# 编辑
vi /etc/docker/daemon.json写入内容:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"data-root": "/opt/docker",
"insecure-registries": ["docker-registry.zjq.com"]
}| 配置项 | 作用 |
|---|---|
data-root | Docker 的数据根目录,镜像、容器、卷都放在这里。默认是 /var/lib/docker |
registry-mirrors | Docker Hub 的镜像加速地址,只对官方镜像生效,不会代理自建的 Registry |
insecure-registries | 允许以明文 HTTP 访问的仓库地址。不带端口表示走 80 端口;走非 80 端口时必须写成 host:port |
几个容易踩的点:
- daemon.json 必须是合法 JSON,不能写注释、不能有多余的尾随逗号,否则 Docker 会启动失败并报
invalid character。 - 改
data-root之前,如果 Docker 已经用过,要把原来/var/lib/docker下的内容整体迁到新目录,否则之前的镜像和容器会在新路径下"消失"。全新安装的机器不用管。 data-root指向的目录所在分区要有足够空间,镜像堆积起来增长很快。
改完重启生效:
sudo systemctl daemon-reload
sudo systemctl restart docker四、启动与验证
# 设置开机自启并立即启动
sudo systemctl enable docker
sudo service docker start
# 确认守护进程与数据目录是否符合预期
sudo docker version
sudo docker info
# 运行 hello-world 验证
sudo docker run hello-worldhello-world 会去拉取一个测试镜像,拉下来运行后打印一段确认信息就退出。但要注意:如果这台机器完全离线,这一步会因为拉不到镜像而失败,这不是安装有问题。离线环境可以这样验证:
# 守护进程正常时,即使没有镜像也能看到 Server 段信息
sudo docker info
# 检查包是否都装上了
dpkg -l | grep docker如果确实需要在离线机器上跑容器,可以在一台有网的机器上 docker pull 之后用 docker save 导出成 tar,拷过去再 docker load 导入。
五、常见问题
| 现象 | 原因与处理 |
|---|---|
dpkg: dependency problems prevent configuration | 五个包没装全,或版本不匹配。apt-get install -f 需要联网,离线环境要手工补齐缺失的包 |
docker: command not found | docker-ce-cli 没装上;用 dpkg -l | grep docker 逐个确认 |
Docker 启动失败,日志提示 invalid character | daemon.json 里有注释或多余的逗号,用 python3 -m json.tool /etc/docker/daemon.json 校验 |
改了 data-root 后镜像不见了 | 旧数据还在 /var/lib/docker,需要手动迁移到新目录 |
docker compose 命令不存在 | 缺少 docker-compose-plugin;注意插件形式是 docker compose(带空格),独立命令 docker-compose 属于另一个包 |
| pull 镜像超时 | 检查 registry-mirrors 是否配置正确,改完是否重启过 Docker |
小结
离线安装 Docker 本身只有两步:下载五个对应版本的 deb 包,dpkg -i 一次装上。真正需要留心的是后面两件事——daemon.json 要写成合法 JSON 且改完记得重启,以及 data-root 变更前处理好旧数据。验证环节在离线机器上不要依赖 hello-world,用 docker info 判断守护进程状态更可靠。
评论区