树莓派使用docker
本文翻译自https://blog.alexellis.io/getting-started-with-docker-on-raspberry-pi/
仅翻译了部分内容,在树莓派3b+上进行的试验。
在树莓派上安装docker使用基本教程
http://shumeipai.nxez.com/2019/05/20/how-to-install-docker-on-your-raspberry-pi.html
这里使用教程里的第一种方法,输入如下脚本自动安装
sudo
curl -sSL https:
//get
.docker.com | sh
安装完docker 输入sudo
docker run hello-world 进行测试,如果出现hello from docker说明安装成功
#推荐下载 Docker 图形化界面 portainer进行维护
sudo
docker pull portainer
/portainer
#创建 portainer 容器
sudo
docker volume create portainer_data
#运行 portainer
sudo
docker run -d -p 9000:9000 --name portainer --restart always -
v
/var/run/docker
.sock:
/var/run/docker
.sock -
v
portainer_data:
/data
portainer
/portainer
再浏览器中输入localhost:9000界面
加入docker用户组
docker客户端客户端只能被root或者docker组的成员使用,使用下面的命令实现jian将pi或者你的yon用户添加进docker组
sudo usermod -aG docker pi
从Hub上拉去镜像
如果你从Docker Hub的上拉取busybox,在树莓派上它不能工作,因为这些镜像是为X86_64的架构而设计的,
我们必须使用ARM架构的docker镜像,例如docker团队的arm32v6,arm32v7 等镜像官方网站
https://hub.docker.com/ 中搜索你需要的镜像。
运行第一个ARM镜像
使用docker官方的Alpine Linux image镜像arm32v6/alpine
$ docker run -ti arm32v6/alpine:3.5 /bin/sh
/ # cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.5.2
PRETTY_NAME="Alpine Linux v3.5"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
/ # echo "Hi, this is a tiny Linux distribution!" | base64
SGksIHRoaXMgaXMgYSB0aW55IExpbnV4IGRpc3RyaWJ1dGlvbiEK
/ # echo "SGksIHRoaXMgaXMgYSB0aW55IExpbnV4IGRpc3RyaWJ1dGlvbiEK" | base64 -d
Hi, this is a tiny Linux distribution!
其他的镜像
Resin.io 支持树莓派的使用
构建一个新的镜像
使用dockerfile 继承镜像实现创建自己的镜像,首先建立一个文件夹,在文件文件dockerfile输入如下内容,在基础镜像的基础上增加了curl 和ca-certificates工具
FROM resin/rpi-raspbian:latest
ENTRYPOINT []
RUN apt-get update && \
apt-get -qy install curl ca-certificates
CMD ["curl", "https://docker.com"]
FROM - 继承的镜像
ENTRYPOINT [] -容器默认的运行时启动的命令和下面的CMD类似
RUN - 镜像中安装各种工具在这里an'z安装
CMD -容器的开始运行时默认的执行命令,每个docker 容器至少需要一个前台主进程,主进程退出,docker容器退出
构建镜像并运行,使用docker images可以查看本地已经生成了自定义的镜像
$ docker build -t curl_docker .
$ docker run curl_docker
docker run curl_docker 默认会执行CMD 定义的curl https://docker.com
使用命令docker rmi curl_docker 实现删除生成的镜像
创建一个ndoejs的镜像
Dockerfile文件如下:
FROM resin/rpi-raspbian:latest
ENTRYPOINT []
RUN apt-get update && \
apt-get -qy install curl \
build-essential python \
ca-certificates
WORKDIR /root/
RUN curl -O \
https://nodejs.org/dist/v4.5.0/node-v4.5.0-linux-armv6l.tar.gz
RUN tar -xvf node-*.tar.gz -C /usr/local \
--strip-components=1
CMD ["node"]
构建并运行镜像:
$ docker build -t node:arm .
$ docker run -ti node:arm
构建使用GIPIO的镜像
为了使用硬件的内存区域,在使用docker run时必须加上 --privileged 参数
Dockerfile的内容如下:
FROM resin/rpi-raspbian:latest
ENTRYPOINT []
RUN apt-get -q update && \
apt-get -qy install \
python python-pip \
python-dev python-pip gcc make
RUN pip install rpi.gpio
构建镜像
$ docker build -t gpio-base .
新建文件led.py 实现点亮led
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
led_pin = 17
GPIO.setup(led_pin, GPIO.OUT)
while(True):
GPIO.output(led_pin, GPIO.HIGH)
time.sleep(1)
GPIO.output(led_pin, GPIO.LOW)
time.sleep(1)
再继承你刚刚构建的gpio-base生成一个新的镜像放入你的python代码,当然也可以直接使用gpio-base 镜像将 led.py拷贝进容器中运行
FROM gpio-base:latest
ADD ./app.py ./app.py
CMD ["python", "app.py"]
构建并运行docker容器
$ docker build -t blink .
$ docker run -ti --privileged blink
如果docker 容器提供了外网访问,记得启动容器是加上端口映射
如:docker run -it --name test1 --privileged -p 5000:5000 -p 50001:50001 image1 /bin/bash
这样通过访问docker所在机器的ip:port便可访问docker 容器里的端口
balenaLib docker镜像
https://www.balena.io/docs/reference/base-images/base-images/#features-overview
访问这个网站获取需要的适合树莓派等嵌入式系统的docker基础镜像
下面是一个使用balenalib/armv7hf-debian-python:3.6.9的例子,使用了python3环境 并安装了一些python依赖
并将工程拷贝到sensorapp文件夹中,使用CMD命令CMD ["sh","/app/sensorapp/runsensor.sh"] 启动程序,注意CMD里程序使用绝对路径。
FROM balenalib/armv7hf-debian-python:3.6.9
ENV UDEV=1
WORKDIR /app
COPY Sensor2 ./sensorapp
RUN chmod u+x ./sensorapp/runsensor.sh
RUN apt update
RUN apt -qy install build-essential vim
RUN pip3 install rpi.gpio paho-mqtt Adafruit_DHT pyserial flask flask_cors wiringpi
CMD ["sh","/app/sensorapp/runsensor.sh"]