文章来源本文演示如何在Raspberry Pi上使用docker1.12及更新版本。我们使用的是raspberry官方版本(Raspbian)。以下示例适用于raspberry pi Model B
.
文章来源
.本文演示如何在Raspberry Pi上使用docker1.12及更新版本。我们使用的是raspberry官方版本(Raspbian)。以下示例适用于raspberry pi Model B 2/3和Zero.
准备SD卡
下载最新的Raspbian Jessie Lite镜像,网址https://www.raspberrypi.org/downloads/raspbian/.
.Raspberry Jessie Lite 镜像与标准镜像基本一样,但只包含满足基本需求的包。
.这段是说如何将镜像写入sd卡,这里就不提了,linux/mac用户可以用dd命令,windows用户可以使用Win32DiskImager,简单直观,这里有演示
安装Docker
准备阶段
这本分介绍了如何连接树莓派,修改密码,主机名之类的,略过,后面提到了,如果你不准备使用显示器,可以适当调低显卡占用内存。vi /boot/config.txt
,在文档结尾添加一行
gpu_mem=16
其实默认分配给显卡的内存并不多
pi@raspberrypi:~ $ vcgencmd get_mem gpugpu=64M
##开始安装通过Docker project提供脚本可以自动完成创建服务,复制可执行文件到 /usr/bin/
。
$ curl -sSL get.docker.com | sudo sh
.注意 上面的操作不适用非debian类发行版,比如Arch Linux和Fedora.Arch Linux目前仅支持Docker 1.11版,它有自己的包管理工具pacman
。
配置Docker
安装好之后需要进行一些手动配置来增强Docker的体验。
设置Docker自动启动
sudo systemctl enable docker
现在你可以重启Pi来启动docker,也可以通过以下命令启动Docker守护进程
sudo systemctl start docker
配置Docker客户端
Docker客户端只能被root用户和 docker用户组使用,通过以下命令吧Pi用户添加到docker组。
sudo usermod -aG docker pi
之后退出ssh连接,并重新通过ssh连接pi。
使用Dcoker
对ARM和Raspberry Pi的支持还处于xx阶段,所以有些事情你需要了解。重要!!!
拉取镜像
如果你拉取了busybox镜像,它应该不能正常运行。因为它是为标准PC或者x86_64架构设计的。未来版本可能会解决这个问题。
我们只能使用那些为ARM设计的镜像。目前没有官方正式镜像支持arm,但是Docker team维护了一部分体验性质的镜像支持arm,它们都以armfh作为前缀
.armhf表示代码已经移植到Rasberry Pi,hf意思是硬件浮点运算。
.运行你的第一个 镜像
我们试下Docker官方Alphine linux image armhf/alpine。Alpha Linux 镜像只有1.8MB。
docker run -ti armhf/alpine:3.5 /bin/sh
初次运行可能需要拉取的过程,拉取结束以后进入镜像的shell,可以试试下面的命令
cat /etc/os-realeaseecho "Hi, this is a tiny Linux distribution!" | base64 exit
最后一个命令exit
,如果你玩尽兴了就可以exit返回宿主终端。前面的 docker run -ti
,表示以终端交互形式执行/bin/sh,你也可以直接执行命令:
pi@raspberrypi:~ $ docker run armhf/alpine:3.5 dateThu Apr 6 05:40:51 UTC 2017
这些关于docker使用的细节问题可以查阅相关文档。
其他镜像
Resion.io使用这个Build创建的镜像可以在树莓派中使用。它作为一个轻量版本是一个不错的选择。
创建新镜像
你可以使用 resin/rpi-raspbian作为基础镜像创建新镜像。让我们创建一个新镜像,这个镜像安装了curl
和cat-certificates
,并且会用curl命令访问docker.com。下面的代码是构建镜像的dockerfile build
FROM resin/rpi-raspbian:latest ENTRYPOINT []RUN apt-get update && / apt-get -qy install curl ca-certificatesCMD ["curl", "https://docker.com"]
逐行解释
- FROM 支出构建镜像的基础镜像
- ENTRYPOINT [] 进入以后,预定义指令起始位置
- RUN 在命令行中执行的命令.这里执行的是更新apt和安装curl以及ca-certificates
- CMD 镜像编译完成后执行的命令,相当于docker run执行的,不属于镜像部分。
将上面的文件保存为dockerfile,然后构建并执行他
docker build -t curl_docker .docker run curl_docker
将会构建一个镜像,并且启动执行CMD后面的命令
.需要注意的是 docker build -t curl_docker .
后面那个.
表示当前目录,这个当前目录同时指定了Dockerfile的位置,和当前要传送的文件,当前目录下的所有文件、文件夹会传送到docker server进行构建,如果你的当前目录极为庞大,虽然不会影响最终镜像的大小,但是构建过程却是灾难灾难性的, 比如我刚才的构建的最终镜像虽然只有100多M,却传了1.7g的文件,受制于树莓派的sd卡磁盘性能,花了很长时间,建议把Dockerfile移动到一个单独目录进行构建。
构建完镜像以后,可以通过docker images列出你构建的镜像。
从Alphine Linux构建镜像
Alphine没有apt-get包管理工具,它们使用的是apk命令,但是基本操作类似
FROM armhf/alpine:3.5RUN apk add --no-cache curl ca-certificatesCMD ["curl", "https://docker.com"]
构建步骤也与之前相同
docker build -t curl_docker_alphine
构建完以后启动容器检测下刚才的成果
pi@raspberrypi:~/dockerpath $ docker run curl_docker_alpine % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0
创建Node.js应用
跳过
使用GPIO
.没用过GPIO,这段不太懂
.想要使用外部硬件和扩展板,你需要访问GPIO针脚。这需要在启动容器时添加特定参数--privileged
来允许容器读写内存特定区域来管理GPIO。
下面的示例Dockerfile构建了一个包含RPI.GPIO库的镜像
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
构建这个镜像以后,可以作为你日后执行GPIO脚本时的新镜像的基础镜像。
docker build -t gpio-base .
下面这个python脚本可以控制连接到GPIO18号引脚的led登闪烁
#app.pyimport 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)
有了前面构建的基础镜像,再加上这个脚本,咱们的新build只要包含这些内容就可以
#DockerfileFROM gpio-base:latest ADD ./app.py ./app.pyCMD ["python", "app.py"]
上面的脚本,从之前的gpio-base构建,并且吧app.py复制进新镜像的当前目录。编译以后,通过--privileged
附加参数执行
docker build -t blink .docker run -ti --privileged blink
#其他后面还提到了,如果通过web服务控制led闪烁。以及一些相关站点,有兴趣可以看下原文连接
.Get Started with Docker on Raspberry Pi
.我想做用raspberry+docker作两件事情,一个是搭建openvpn,另一个是的ddns,每次配置拿到新机器都要折腾半天,虽然配置客户端比较简单,但也是不小的工作量,更担心初代机器哪天寿终正寝了,从头做起来不知道要花多少时间