2026 在树莓派/JetsonNano安装docker

2026 在树莓派/JetsonNano安装docker

docker是一款流行的应用程序开发,发布和运行平台。Docker 能够帮助你将应用程序与基础架构分离,以便快速交付软件。使用了Docker,你可以不用担心应用软件和操作系统不兼容或者缺少某些特定的库文件的问题,因此它特别适合在微型电脑上使用。本文介绍通用的安装Docker方法,在树莓派和Jetson Nano上都测试过,能成功安装。

第一步,更新apt repository

sudo apt-get -y update && sudo apt-get -y upgrade

第二步,从官网下载脚本并运行

curl -s https://get.docker.com | bash

运行成功是这个样子的

第三步,检查docker版本

sudo docker version

安装正常的话应该是这样子的 运行docker info获得更详细的系统信息

sudo docker info

第四步,设置开机自动运行docker,并且启动它

sudo systemctl enable docker
sudo systemctl start docker

检查是否运行成功

sudo docker ps

成功的样子是这样的

第五步,从docker hub下载hello-world来测试一下

sudo docker pull hello-world

成功的样子是这样的 如果出现这样的提示,“Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit” ,你可以尝试在docker hub注册一个账号,然后登录后再pull,因为docker hub现在限制了匿名pull的频率。

sudo docker login

登录成功是这样子的,

第六步,运行hello-world

sudo docker run hello-world

成功运行是这样子的, 看看我们的image list里面是否有这个hello world

sudo docker images

第七步,清理hello-world

虽然这个hello world只有几k,但有最求整洁的我要把它删掉

sudo docker image rm --force 1ec996c686eb

再看看images

安装成功了!

接下来让我们深入了解一些常用的Docker概念和命令,帮助你更好地在树莓派和Jetson Nano上使用Docker。

Docker 与 Docker Compose 的区别

很多初学者会混淆Docker和Docker Compose,简单来说:

  • Docker:是一个容器化平台,用于创建、运行和管理单个容器。你通过docker run命令启动容器,通过命令行参数来配置端口映射、环境变量等。
  • Docker Compose:是一个用于定义和运行多容器Docker应用的工具。通过一个YAML文件(docker-compose.yml)来配置应用的所有服务,然后使用一条命令就能启动所有服务。

当你需要在设备上运行多个服务(比如同时运行数据库、Web服务器和消息队列)时,Docker Compose能大大简化你的工作流程。

安装Docker Compose:

sudo apt-get install -y docker-compose-plugin

常用Docker命令速查

以下是日常使用中最常见的Docker命令:

命令说明示例
docker run运行容器docker run -d -p 8080:80 nginx
docker ps查看运行中的容器docker ps -a(包括已停止的)
docker stop停止容器docker stop container_id
docker rm删除容器docker rm container_id
docker images列出本地镜像docker images -a
docker logs查看容器日志docker logs -f container_id
docker exec在运行中的容器里执行命令docker exec -it container_id bash
docker pull下载镜像docker pull ubuntu:latest

一个典型的工作流程:

# 启动一个nginx容器,后台运行,映射8080端口
sudo docker run -d --name my-nginx -p 8080:80 nginx

# 查看运行中的容器
sudo docker ps

# 查看容器日志
sudo docker logs my-nginx

# 停止并删除容器
sudo docker stop my-nginx
sudo docker rm my-nginx

ARM架构特别说明

树莓派和Jetson Nano都是ARM架构的处理器,与常见的x86(Intel/AMD)处理器不同。在选择Docker镜像时需要注意:

  • 树莓派(32位):使用arm32v7/前缀的镜像,例如arm32v7/nginx
  • 树莓派4(64位系统)Jetson Nano:使用arm64v8/前缀的镜像,例如arm64v8/nginx
  • 很多官方镜像现在支持多架构(multi-arch),会自动识别你的平台并拉取对应版本,比如nginxpythonnode

查看当前系统架构:

uname -m
# 输出 aarch64 表示64位ARM,armv7l 表示32位ARM

查找支持ARM架构的镜像,可以到Docker Hub上搜索时留意”ARM”标签。

常见问题解决

问题1:permission denied(权限被拒绝)

如果每次运行docker命令都需要加sudo,非常不方便。解决方法是将当前用户加入docker用户组:

# 创建docker用户组(通常安装时已自动创建)
sudo groupadd docker

# 将当前用户加入docker组
sudo usermod -aG docker $USER

# 重新登录或执行以下命令使组权限生效
newgrp docker

# 测试是否生效(不需要sudo)
docker run hello-world

问题2:Docker pull速度太慢

由于Docker Hub服务器在国外,国内用户拉取镜像速度可能很慢。可以配置镜像加速器:

# 创建或编辑daemon.json配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
EOF

# 重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

问题3:容器时间不正确

ARM设备有时会出现容器内时间与宿主机不一致的问题,可以挂载本地时区文件:

docker run -v /etc/localtime:/etc/localtime:ro -d nginx

一个简单的docker-compose.yml示例

下面是一个使用Docker Compose搭建简单Web服务的例子,包含一个nginx Web服务器和一个Redis缓存服务:

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    restart: always

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
    restart: always

创建一个html文件夹,放入一个index.html文件:

<!DOCTYPE html>
<html>
<head><title>Hello Docker</title></head>
<body><h1>Hello from Docker on ARM!</h1></body>
</html>

然后启动所有服务:

docker-compose up -d

查看运行状态:

docker-compose ps

停止所有服务:

docker-compose down

Docker Compose非常适合在嵌入式设备上部署多服务应用,通过一个文件就能管理所有依赖关系和配置。希望这篇教程能帮助你更好地在树莓派和Jetson Nano上使用Docker!


Docker 进阶使用

Docker 网络配置

Docker 提供了多种网络模式来满足不同的应用场景:

1. Bridge 网络模式(默认)

# 创建自定义 bridge 网络
docker network create mynetwork

# 运行容器并连接到自定义网络
docker run -d --name web --network mynetwork nginx

# 查看网络详情
docker network inspect mynetwork

# 将运行中的容器连接到网络
docker network connect mynetwork container_name

使用场景

  • 容器间需要通信
  • 需要DNS解析容器名称
  • 隔离不同应用的容器

2. Host 网络模式

# 使用主机网络
docker run -d --network host nginx

特点

  • 容器直接使用主机网络栈
  • 性能最好,无网络开销
  • 端口直接暴露在主机上
  • 适合网络密集型应用

3. None 网络模式

# 禁用网络
docker run -d --network none alpine

使用场景

  • 完全隔离的应用
  • 安全敏感的任务
  • 批处理作业

Docker 数据持久化

1. 数据卷(Volumes)

# 创建命名卷
docker volume create mydata

# 使用命名卷
docker run -d -v mydata:/var/lib/mysql mysql:latest

# 查看卷信息
docker volume inspect mydata

# 列出所有卷
docker volume ls

# 删除未使用的卷
docker volume prune

优点

  • 由Docker管理,跨平台兼容
  • 性能优于绑定挂载
  • 易于备份和迁移

2. 绑定挂载(Bind Mounts)

# 挂载主机目录
docker run -d -v /home/user/data:/app/data nginx

# 只读挂载
docker run -d -v /home/user/config:/etc/nginx:ro nginx

使用场景

  • 开发环境代码同步
  • 配置文件管理
  • 日志收集

3. tmpfs 挂载

# 使用临时文件系统
docker run -d --tmpfs /tmp:rw,size=100m nginx

特点

  • 数据存储在主机内存中
  • 容器停止后数据丢失
  • 适合敏感数据或临时文件

Docker 资源限制

1. CPU 限制

# 限制使用2个CPU核心
docker run -d --cpus="2.0" nginx

# 设置CPU份额(相对权重)
docker run -d --cpu-shares=512 nginx

2. 内存限制

# 限制内存使用512MB
docker run -d --memory="512m" nginx

# 设置内存交换限制
docker run -d --memory="512m" --memory-swap="1g" nginx

3. 综合资源限制

# 同时限制CPU和内存
docker run -d \
  --cpus="1.5" \
  --memory="1g" \
  --memory-swap="2g" \
  nginx

Docker 日志管理

1. 查看容器日志

# 查看实时日志
docker logs -f container_name

# 查看最近100行
docker logs --tail 100 container_name

# 查看特定时间后的日志
docker logs --since "2024-01-01" container_name

# 查看特定时间前的日志
docker logs --until "2024-12-31" container_name

2. 配置日志驱动

# 使用JSON文件日志驱动
docker run -d \
  --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

# 使用syslog日志驱动
docker run -d \
  --log-driver=syslog \
  --log-opt syslog-address=udp://localhost:514 \
  nginx

3. 日志轮转配置

/etc/docker/daemon.json 中配置全局日志轮转:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

重启Docker服务:

sudo systemctl restart docker

Docker 安全最佳实践

1. 使用非root用户运行容器

# Dockerfile 示例
FROM nginx:latest

# 创建非root用户
RUN useradd -m -s /bin/bash nginx

# 切换到非root用户
USER nginx

# 设置工作目录
WORKDIR /home/nginx

CMD ["nginx", "-g", "daemon off;"]

2. 限制容器能力

# 删除所有Linux capabilities
docker run -d --cap-drop=ALL nginx

# 只添加必要的capabilities
docker run -d --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

3. 使用只读文件系统

# 使容器文件系统只读
docker run -d --read-only nginx

# 允许特定目录写入
docker run -d --read-only --tmpfs /tmp nginx

4. 扫描镜像漏洞

# 安装trivy
sudo apt install trivy

# 扫描镜像
trivy image nginx:latest

# 扫描容器
trivy container container_name

5. 使用镜像签名

# 启用Docker Content Trust
export DOCKER_CONTENT_TRUST=1

# 拉取签名镜像
docker pull nginx:latest

Docker 监控和运维

1. 使用 ctop 监控容器

# 安装ctop
sudo wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 -O /usr/local/bin/ctop
sudo chmod +x /usr/local/bin/ctop

# 运行ctop
ctop

2. 使用 Prometheus + Grafana 监控

# docker-compose.yml
version: '3'
services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
  
  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
  
  cadvisor:
    image: gcr.io/cadvisor/cadvisor
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

3. 自动清理未使用的资源

# 创建cron任务
crontab -e

# 添加以下行(每天凌晨2点清理)
0 2 * * * docker system prune -f

Docker 在嵌入式设备上的应用

树莓派上的Docker优化

1. 使用轻量级基础镜像

# 使用Alpine Linux
FROM alpine:latest

# 或使用ARM特定的镜像
FROM arm32v7/alpine:latest

2. 优化镜像大小

# 多阶段构建
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

FROM alpine:latest
COPY --from=builder /app/myapp /myapp
CMD ["/myapp"]

3. 使用Docker Swarm进行集群管理

# 初始化Swarm集群
docker swarm init

# 加入Worker节点
docker swarm join --token <token> <manager-ip>:2377

# 部署服务
docker service create --replicas 3 --name web nginx

常见问题解决

问题1:容器无法访问外网

解决方案

# 检查DNS配置
docker run --rm alpine nslookup google.com

# 配置Docker DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker

问题2:端口冲突

解决方案

# 查看端口占用
sudo netstat -tulpn | grep :80

# 使用不同端口
docker run -d -p 8080:80 nginx

问题3:容器启动失败

排查步骤

# 查看容器日志
docker logs container_name

# 检查容器状态
docker inspect container_name

# 进入容器调试
docker run -it --entrypoint /bin/sh image_name

问题4:磁盘空间不足

解决方案

# 查看Docker磁盘使用
docker system df

# 清理未使用的资源
docker system prune -a

# 移动Docker数据目录
sudo systemctl stop docker
sudo rsync -aP /var/lib/docker/ /new/path/docker/
sudo sed -i 's|/var/lib/docker|/new/path/docker|g' /etc/docker/daemon.json
sudo systemctl start docker

总结

Docker 是现代软件开发和部署的重要工具,特别是在树莓派和Jetson Nano等嵌入式设备上,它能帮助我们:

快速部署应用:一键启动复杂的应用栈 ✅ 环境一致性:开发、测试、生产环境完全相同 ✅ 资源隔离:不同应用互不干扰 ✅ 易于管理:通过Docker Compose管理多容器应用 ✅ 跨平台兼容:在ARM和x86架构上都能运行

学习建议

  1. 从简单的单容器应用开始
  2. 逐步学习Docker Compose多容器编排
  3. 掌握网络和数据持久化配置
  4. 了解安全最佳实践
  5. 学习监控和运维技巧

推荐资源

希望这篇教程能帮助你更好地在树莓派和Jetson Nano上使用Docker!如果遇到问题,欢迎在评论区讨论。


相关资源: