在Raspberry Pi2运行Docker

好久没来当门外汉撞牆了,最近想到将自己的一些虚拟机(环境)需求,移到 Raspberry Pi 2 上有没有可能,于是就想到在 Raspberry Pi 2 上跑 Docker,只是,自己既不熟 Raspberry Pi,也不熟 Docker,这次的门外汉撞牆撞得还真是不少 …

既然如此,这牆都撞了就别白撞了,就来记录一下撞牆的经验如何!照例,因为是门外汉,看到有错还请鞭小力一点 … XD

Pi 运行 Docker 的几个方案

搜寻了一下网路,要在 Pi 上运行 Docker 的方案,最常见的作业系统推荐是 Archlinux,既然如此,就先照著 Archlinux 上的 〈Raspberry Pi〉进行作业系统安装。

我先用已经有的 Raspbian 来做 Archlinux 的 SD Card,基本上只要照著网页做就没什麽问题,要注意的是使用 fdisk 时,如果 SD Card 是位于 /dev/sda1,那麽一开始要下的指令是 fdisk /dev/sda(而不是 sda1),分割完成后使用 fdisk -l 就可以看到 SD Card 被分割的两个磁区装置名称(例如 /dev/sda1、/dev/sda2),建立与 mount 档案系统时,就使用这两个名称。

只不过安装好之后,我才想到,因为是使用手机无线分享,所以没办法接网路线进行接下来的动作了,因而我转而寻找安装完就可以设定无线网路的方案,如果你对 Archlinux 上安装 Docker 仍有兴趣,可以参考〈在树莓派 2 (Raspberry Pi 2) 安装 docker 并执行范例〉,在该讨论串中也有提到,Raspberry Pi 2 现在可以安装 Ubnutu 14.04,然后在上头安装 Docker,这我没试过,纯綷记录一下,你可以自己试试看。

使用 HypriotOS

我后来找到〈HypriotOS: Back Again and Better then Ever〉这篇文章,採用了当中提供的 Docker-Pi Image,这就方便多了,Windows 使用者也可以使用 Win32DiskImager 将映像档写到 SD Card 中,这个映像档是基于 Raspbian,里头包括了 Docker 1.5。

不过,中间发生了点小插曲,我用来写映像档的 SD Card 跟 Raspberry Pi/Raspbian 打架了,启动会失败,错误讯息就像是〈Raspberry Pi 2 B SD card problem on boot〉,不是每个 SD Card 都会发生这个错误,不过我就是遇上了。

没办法,就像 qrtt1 说的:「门外汉都比较带赛一点xd」。

遇上了总得解决问题,在〈Raspberry Pi 2 B SD card problem on boot〉中最后有提到,可以使用 rpi-update 更新 kernel 与靭体,问题是没办法开机啊?不过,讨论中也有提到,可以使用另一台 Linux 来对 SD Card 中第二个磁区做 fsck(例如 fsck -f /dev/sda2),这样就可以开机(不过后续仍有可能开机错误),我后来就趁 fsck 过开机成功那次,做了 rpi-update,后来就没有开机错误的问题了。

安装完成之后,先在 Raspberry Pi 上接上键盘,开机后登入的名称是 pi,密码是 raspberry,执行 docker –version,你就可以看到以下的画面:

Docker on Raspberry Pi

设定密码与网路

要修改 pi 的密码,可以执行 raspi-config,在里头进行修改,顺便也扩充一下档案系统,运用整个 SD Card 容量:

Docker on Raspberry Pi

至于无线网路设定的部份,我是参考〈Java Embedded(3)Raspberry Pi 硬体週边与作业系统设定〉中的设定,修改 /etc/network/interfaces,请执行:

sudo nano /etc/network/interfaces

将里头的内容修改为:

auto lo

iface lo inet loopback

auto wlan0

iface wlan0 inet static
    address 想要的 IP 位址
    netmask 子网路遮罩
    gateway 预设闸道/路由器
    wpa-ssid 无线网路的名称
    wpa-psk 无线网路的密码

修改完成以后,依序按下「Ctrl+X」、「Y」与「Enter」储存档案,接著修改 DNS Server 设定,因为我实际上运行时,预设的 DNS Server 设定没有用,请执行:

nano /etc/resolv.conf

加入新的 DNS Server 设定,例如:

nameserver 8.8.8.8
nameserver 8.8.8.4

同样依序按下「Ctrl+X」、「Y」与「Enter」储存档案,接著 sudo poweroff 关机,拔除电源与 USB 键盘,重新接上电源开机完成后,你就可以 SSH 至方才指定的 IP 位址,使用 pi 与自设的密码登入。

建立映像档

接下来就可以开始使用 Docker 建立映像档了,很奇怪,我第一次要 Pull 映像档时,Docker 服务并没有启动,只好先 sudo service docker start 手动一下,之后倒是就没有这个问题。

接下来的问题是,遇上了 x509 证书过期的错误讯息?这 … 查了一下网路,结果是时间同步上有点问题,于是执行 sudo ntpclient -s -h pool.ntp.org 同步一下时间。

接下来就开始要 Pull Image 了,Raspberry Pi 是 ARMv7,可用的映像档可以在 Docker 上查询 rpi 寻找,我选择从 resin/rpi-raspbian 开始建置,我第一个想建置的就是 Java 8 与 Gradle 2.6 的环境,我最后整理出的 Dockerfile 是:

FROM resin/rpi-raspbian
MAINTAINER Justin Lin <caterpillar@openhome.cc>

# Basic tools
RUN apt-get -qq update && \
    apt-get -qqy install wget && \
    apt-get -qqy install vim && \
    apt-get -qqy install unzip && \
    apt-get -qqy install git

# Java 8
WORKDIR /opt
RUN wget http://your-url/jdk-8u60-linux-arm32-vfp-hflt.gz && \
    tar zxvf jdk-8u60-linux-arm32-vfp-hflt.gz && \
    rm jdk-8u60-linux-arm32-vfp-hflt.gz

ENV JAVA_HOME /opt/jdk1.8.0_60

# Gradle
RUN wget https://downloads.gradle.org/distributions/gradle-2.6-bin.zip && \
    unzip gradle-2.6-bin.zip && \
    rm gradle-2.6-bin.zip

ENV GRADLE_HOME /opt/gradle-2.6

# PATH
ENV PATH $PATH:$JAVA_HOME/bin:$GRADLE_HOME/bin

WORKDIR /

要注意使用的 JDK 是 Linux ARM v6/v7 Hard Float ABI,这可以在 Oracle 网站下载,为了安装方便,我是下载后放在自己的伺服器上,因此,想要使用以上的 Dockerfile 的话,可以将其中「your-url」改为实际上 JDK 的档案所在网址。

最后,终于在 Raspberry Pi 上把想要的东西搞定了(初步啦!) … 懒得自己 build 的话,就直接 pull 我的 caterpillar/rpi-gradle 吧! … XD

Docker on Raspberry Pi
来源:https://openhome.cc/Gossip/CodeData/DockerLayman/DockerLayman2.html

发表评论