3、Docker环境搭建:在树莓派上安装Docker和Docker Compose,配置镜像加速器,验证环境可用性。

好,咱们继续。上一节我们把树莓派系统跑起来了,SSH也能连上。现在要干正事了——装Docker。

为什么非要用Docker?说白了,智能家居这摊子事,依赖关系太乱了。你装个Home Assistant,它要Python 3.9;装个Mosquitto,它又要OpenSSL某个特定版本。手动折腾一圈下来,系统就成浆糊了。Docker把每个应用装进独立的小盒子,互不干扰。我个人的习惯是:能用Docker跑的,绝不直接装系统里。

3.1 一键安装Docker

树莓派是ARM架构,和咱们平时用的x86电脑不一样。好在Docker官方对ARM支持得不错。别用apt装,那个版本太老。用官方脚本最省心。

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

等个一两分钟,脚本跑完就装好了。我记得第一次在树莓派3B+上跑这个脚本,等了快五分钟,那时候还是机械SD卡。现在用树莓派4或5,配合SSD,快多了。

装完把当前用户加到docker组,省得每次敲sudo:

sudo usermod -aG docker $USER
newgrp docker

嗯,这里要注意:加完组要重新登录才生效。你可以退出SSH再连一次,或者直接执行newgrp docker临时切换。

3.2 验证Docker是否装好

跑个经典hello-world容器试试:

docker run hello-world

如果看到一段欢迎信息,说明Docker能正常工作了。我曾经遇到一个坑:树莓派上跑这个命令,半天没反应。后来发现是SD卡IO瓶颈,Docker拉镜像时卡住了。换张高速卡就解决了。

再查一下版本:

docker --version
docker info | grep "Architecture"

确认Architecture显示的是aarch64armv7l,说明架构识别正确。

3.3 安装Docker Compose

Docker Compose是管理多容器应用的利器。Home Assistant、Mosquitto、Zigbee2MQTT这几个容器,用Compose一个文件就能全部拉起。

新版Docker自带Compose插件,直接这样装:

sudo apt-get install docker-compose-plugin

验证一下:

docker compose version

如果显示Docker Compose version v2.x.x,就对了。注意是docker compose(中间没横杠),不是老版的docker-compose

我个人建议用插件版,因为它和Docker引擎集成更好,升级也方便。

3.4 配置镜像加速器

这是国内用户绕不开的坎。Docker Hub的镜像下载速度,有时候慢得让人抓狂。我曾在项目部署时,拉一个200MB的镜像等了半小时——后来配了加速器,两分钟搞定。

编辑Docker配置文件:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

这里用了中科大和网易的镜像站。你也可以用阿里云的(需要登录后获取专属地址)。

改完重启Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

验证加速器是否生效:

docker info | grep "Registry Mirrors" -A 1

如果看到你配置的地址,说明加速器生效了。

注意:镜像加速器只对Docker Hub的镜像有效。如果你从GitHub Container Registry(ghcr.io)或其他源拉镜像,加速器不管用。这时候可以试试代理,或者换个时间段再拉。

3.5 完整验证环境

我们来跑一个完整的测试:拉一个Nginx镜像,启动容器,访问看看。

docker pull nginx:alpine
docker run -d --name test-nginx -p 8080:80 nginx:alpine

然后在浏览器里访问 http://树莓派IP:8080。看到Nginx欢迎页,就说明Docker网络、端口映射都正常。

测试完删掉这个容器:

docker stop test-nginx
docker rm test-nginx

最后检查一下Docker服务是否开机自启:

sudo systemctl is-enabled docker

如果显示enabled,就对了。不是的话手动开一下:

sudo systemctl enable docker

3.6 避坑指南

我整理了几个常见问题,你遇到了可以对照排查:

问题 原因 解决办法
docker run 卡住不动 镜像下载慢或网络不通 检查加速器配置,或手动ping registry-1.docker.io
权限不足(permission denied) 用户没加到docker组 执行 usermod 并重新登录
容器启动后马上退出 端口被占用或架构不兼容 检查端口占用,确认拉的是arm镜像
docker compose 命令找不到 Compose插件没装 安装 docker-compose-plugin

我曾经在树莓派上遇到过最诡异的问题:Docker能跑,但容器里时间总不对。后来发现是树莓派没有硬件时钟,系统时间没同步。加一行timedatectl set-ntp true就解决了。

小技巧:树莓派SD卡寿命有限,频繁读写容易坏。建议把Docker的数据目录挪到外接SSD或U盘上。具体做法:在daemon.json里加一行 "data-root": "/mnt/ssd/docker",然后重启Docker。

好了,Docker环境搭好了。下一节我们就要正式部署Home Assistant了。到时候你会看到,有了Docker,部署一个智能家居平台就跟装个App一样简单。