Skip to content

树莓派 Docker 化网页服务器(2):从系统镜像到 Docker 底座 —— 烧录即得运行环境

前言

第1篇我们探讨了服务增长带来的两个致命问题——镜像打包的组合爆炸、单服务链路无法一步到位——并由此引入了Docker,建立了“系统镜像管底座,Docker管服务”的认知框架。

这一篇,我们来完成容器化的第一个落地实践:在旧专栏第3篇的基础上,制作一个预装Docker Engine和Docker Compose插件的纯净系统镜像。这个镜像不包含任何应用服务(Nginx、ddns-go等),只提供一个“烧录即得Docker运行环境”的底座。它是整个容器化改造的起点,也是后续所有容器得以运行的基础。

一、前置准备

沿用 旧专栏第3篇 制作的基础镜像,该镜像应当完成如下配置:

  • 开启SSH
  • 配置Wi-Fi或有线网络
  • 设置主机名(如jiejinx,)
  • 设置用户名和密码(如用户名为pi

建议主机名和用户名与旧专栏第3篇基础镜像保持一致,否则后续 compose 里 volume 权限会乱

将该镜像烧录到树莓派TF卡后开机,首先更新系统:

bash
sudo apt update && sudo apt full-upgrade -y

更新系统国内网络可能出现卡慢的情况,可以参考 旧专栏第4篇第三节 配置国内镜像源,进行配置加速。

二、Docker的安装与配置

1. 安装Docker引擎

用官方脚本安装,国内执行安装脚本网络较慢,推荐使用阿里云镜像:

bash
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

2. 安装Docker Compose插件

较新版本的Docker Engine已自带docker compose插件,验证方式:

bash
docker compose version

如果未安装,手动安装:

bash
sudo apt install docker-compose-plugin

3. 配置用户组与开机自启

将当前用户加入docker组(免sudo),设置后需完全退出SSH重新登录生效:

bash
sudo usermod -aG docker $USER

设置Docker开机自启:

bash
sudo systemctl enable docker

4. 验证安装

查看Docker版本:

bash
docker --version

# Docker Compose插件版本
docker compose version

5. 本次安装包含哪些组件

通过官方脚本 get.docker.com --mirror Aliyun 安装后,系统中会引入以下组件:

组件名安装形式用途是否必需
docker-ceapt 包Docker 引擎主体,负责镜像管理、容器生命周期、网络、存储驱动必需
docker-ce-cliapt 包Docker 命令行客户端(docker 命令),与引擎通过 /var/run/docker.sock 通信必需
containerd.ioapt 包底层容器运行时,真正负责镜像拉取、解包、容器进程启动;Docker 引擎把它当底层用必需
runc随 containerd 附带OCI 运行时,真正创建容器进程、设置 namespace/cgroup必需(隐藏依赖)
docker-compose-pluginapt 包 / 独立插件提供 docker compose 子命令(注意不是老版独立二进制 docker-compose推荐(本专栏必需)
docker-buildx-plugin部分版本随 CE 附带提供 docker buildx 多架构构建能力可选
/etc/docker/daemon.json手动创建Docker 守护进程配置(镜像源、IPv6 开关等)配置项
docker 系统组安装时创建加入该组的用户可免 sudo 访问 /var/run/docker.sock权限机制

说明:旧专栏里我们装 Nginx 是 apt install nginx,一个包搞定;Docker 不是“一个软件”,而是一组引擎+运行时+CLI+插件的协作体。这也是为什么底座镜像会比纯系统大 300MB+ 的原因——多出来的主要是 docker-ce + containerd + 各类 arm64 库。

6. 配置国内镜像源

国内网络环境下,直接拉取Docker Hub镜像极易超时。编辑Docker配置文件:

bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me"
  ],
  "ipv6": false,
  "ip6tables": false
}
EOF

说明:不少国内镜像源在2024–2025年陆续停更Docker Hub同步,上面三个是2026年社区反馈仍可使用的公共源。
阿里云用户建议把自己的专属加速地址放第一个,公共源放后备

重载并重启Docker:

bash
sudo systemctl daemon-reload
sudo systemctl restart docker

验证镜像源是否生效:

bash
docker info | grep -A3 "Registry Mirrors"

7. 拉取测试镜像

bash
docker run --rm hello-world

看到Hello from Docker!即为成功。

三、制作Docker底座系统镜像

清理Docker缓存

拉取测试镜像产生的缓存可以清掉,保持底座纯净:

bash
docker system prune -a -f

打包镜像

参考 旧专栏第3篇 的缩容和打包方法,完成含Docker底座的系统镜像制作。清理apt缓存、日志、临时文件后,关机取出存储介质,用7-zip打包成.xz格式。

注意:由于Docker引擎、containerd及Compose插件等arm64二进制文件的体积,底座镜像的压缩包大小约为900MB,相比旧专栏纯净系统镜像有所增大,这是容器化必须支付的固定成本,后续所有服务容器都将共享这个底座,不会再重复占用。

总结

本篇完成了容器化改造的第一个落地实践:

项目完成内容
Docker引擎已安装并验证运行正常
Docker Compose已安装插件版
国内镜像源已配置三个可用镜像源
用户权限已加入docker组,免sudo运行
底座镜像已清理并打包成带Docker的纯净系统镜像

至此,你手中的树莓派已经从一个“装了特定服务的服务器”,升级为一个“烧录即得Docker运行环境”的通用底座。后续无论要跑Nginx、数据库、音乐服务还是AI模型,都不需要再重复安装Docker这一步。

下一篇预告:我们将开始容器化第一个应用组件——把旧专栏第4篇的Nginx从apt安装迁移到Docker容器运行,配置挂载、端口映射、日志管理一次到位。