侧边栏壁纸
博主头像
Setyg的博客

当秋风染红落叶的时候,就是新生~

  • 累计撰写 86 篇文章
  • 累计创建 66 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Ubuntu 使用离线 deb 包安装 Docker 实践

Setyg
2026-09-17 / 0 评论 / 0 点赞 / 5 阅读 / 0 字

在不能使用 Docker 官方 apt 仓库的环境里——内网机器、没有外网的服务器、或者只是 apt 源连不上——可以直接下载 deb 包手动安装。代价是每次升级都要重新下载一遍对应的包。本文整理从下载、安装到配置、验证的完整流程。

一、下载 deb 安装包

1. 找到对应版本的下载路径

入口地址是 https://download.docker.com/linux/ubuntu/dists/,逐级往下选:

  1. 在弹出的目录列表里选择 Ubuntu 版本代号(注意不是版本号);
  2. 进入 pool/stable/;
  3. 选择架构目录:amd64 / armhf / arm64 / s390x。

以 Ubuntu 24.04 为例,完整的下载目录是:

https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/amd64/

常见 LTS 版本与代号对照:

Ubuntu 版本代号(Codename)
18.04 LTSbionic
20.04 LTSfocal
22.04 LTSjammy
24.04 LTSnoble
26.04 LTSresolute

不确定当前系统代号时,可以用 lsb_release -cs 或 cat /etc/os-release 查看。非 LTS 的中间版本同样在 dists/ 列表里,以页面实际列出的代号为准。

官方地址在国内访问可能较慢或不稳定,可以改用清华 TUNA、阿里云等镜像站同步的 docker-ce 仓库(路径结构与官方一致,把域名换掉即可)。

2. 需要下载的五个包

手动安装需要把下面五个包全部下载下来,缺一个都会导致依赖装不上:

包名作用
containerd.io容器运行时,Docker 的底层依赖
docker-ceDocker Engine 本体,提供 dockerd 守护进程
docker-ce-clidocker 命令行客户端
docker-buildx-pluginbuildx 构建插件,docker build 的新一代实现
docker-compose-plugincompose 插件,提供 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>.deb

Ubuntu 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-rootDocker 的数据根目录,镜像、容器、卷都放在这里。默认是 /var/lib/docker
registry-mirrorsDocker 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-world

hello-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 founddocker-ce-cli 没装上;用 dpkg -l | grep docker 逐个确认
Docker 启动失败,日志提示 invalid characterdaemon.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 判断守护进程状态更可靠。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区