Raspberry pi with Docker Swarm 跨網域溝通使用 network

之前在 Container Summit 2015: 以 Docker Swarm 打造多主機叢集環境 分享過在一般運用情狀下使用 docker swarm,這次要介紹在 Raspberry pi 如何進行。

首先,在 Raspberry pi 跟在一般 PC 的環境上有所不同,主要還是 ARM 架構,所以需要使用相關的 OS 才能驅動 Docker,當然若已經有人包好就不用在自造輪子,下面將先介紹如何在 Raspberry pi 將 docker 環境安裝完成

hypriot

hypriot 是個已經打包好 docker 的 image

http://blog.hypriot.com/

flash

用來安裝 hypriot 所使用的 command line tool

https://github.com/hypriot/flash

Hypriot Image Download

下載相關 image 可以在下面連結取得

http://blog.hypriot.com/downloads/

一旦所有需要的東西備齊後,就可以開始進行 image 的安裝,首先我們必須要先設定好 wifi 連接方式,若本身 Raspberry pi 已有皆有線網路就不需要,設定內容如下。

occidentalis.txt

hostname=hypriot-pi  
wifi_ssid=my-wifi  
wifi_password=12345678  

準備好設定檔之後,就可以透過 flash 來進行安裝

flash install

若不使用設定檔的話,可以使用下面指令:

flash -n hypriot-pi \  
-s TrunkStudio-Internal \ 
-p 22019020 \ 
hypriot-rpi-20151115-132854.img /dev/disk2s1  

使用設定檔的情形,指令如下:

flash --config occidentalis.txt hypriot-rpi-20151115-132854.img /dev/disk2s1  

如此安裝完成後就有 docker 可以進行操作

edit wifi

安裝完成後,若要更新 wifi 可以 ssh 到 pi 上面進行檔案修正

ssh into pi: vim /boot/occidentalis.txt

一旦更新完後再將 pi reboot 新的設定檔就會生效

到這邊算是把 pi 的 docker 環境準備好了

Hypriot Docker Images

在這裡可以找到使用 ARM 建置完成的 docker images

https://hub.docker.com/u/hypriot/

大部分需要的都可以在這邊取得。

再來,我們為了方便進行 docker 操作可以在安裝下列相關工具,分別是 docker-compose 以及 docker-machine

Docker Compose install

https://github.com/hypriot/arm-compose

install docker-machine for pi

curl -o docker-machine http://downloads.hypriot.com/docker-machine_darwin-amd64_0.4.1

chmod +x ./docker-machine

alias docker-machine-pi='./docker-machine'  

有了上述工具的安裝後,我們就可以開始重現 Raspberry pi with Docker Swarm 跨網域溝通使用 network 的建置過程。

建立 consul

docker-machine-pi create -d hypriot --hypriot-ip-address=192.168.168.120 swl-consul  

docker $(docker-machine-pi config swl-consul) run -d --restart=always -p 8500:8500 -h consul nimblestratus/rpi-consul -server -bootstrap

建立 swarm master

docker-machine-pi create -d hypriot \  
--hypriot-ip-address=192.168.168.120 \
--swarm --swarm-master \
--swarm-discovery="consul://$(docker-machine-pi ip swl-consul):8500" \
--engine-opt="cluster-store=consul://$(docker-machine-pi ip swl-consul):8500" \
--engine-opt="cluster-advertise=eth0:2375" swl-master

其中 cluster-advertise=eth0:2375 中的 2375 會根據妳設置的 DOCKER_OPTS 而定,其設定在 /etc/default/docker

如下:

DOCKER_OPTS='-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375'  

節省資源:使用 master 當作 consul

docker run -d --restart=always -p 8500:8500 -h consul nimblestratus/rpi-consul -server -bootstrap  

建立 slave

docker-machine-pi create -d hypriot \  
--hypriot-ip-address=192.168.168.134 \
--swarm  \
--swarm-discovery="consul://$(docker-machine-pi ip swl-consul):8500" \
--engine-opt="cluster-store=consul://$(docker-machine-pi ip swl-consul):8500" \
--engine-opt="cluster-advertise=eth0:2375" swl-slave

查看一下目前的 docker info

eval $(docker-machine-pi env --swarm swl-master)  
docker info  

手上 Raspberry pi 有限,所以 master 也是 node 節點,不過可以看到,swarm 叢集已正確建立完成。

建立 overlay network

eval $(docker-machine-pi env --swarm swl-master)  
docker network create -d overlay pi-net  

Docker run on Raspberry pi

server web

docker run -itd --name=web --net=pi-net --env="constraint:node==swl-master" hypriot/rpi-nano-httpd  

client

docker run -it --rm --net=pi-net --env="contraint:node=swl-slave" hypriot/armhf-busybox wget -O- http://web  

運行結果

可以看到運行結果雖然都是在 swl-master 上面,但基本上已經是在 swarm 叢集下進行。

結論

Raspberry pi 一直以來就很想嘗試看看,但礙於總覺得使用起來很麻煩,一直遲遲沒有嚐試,有了 docker 之後,可以在本機測試之後放到 pi 上面運行。

不過對於 Raspberry pi 的運行,也算是第一次嘗試,應該需要再好好熟悉了。

若對 Raspberry pi 使用有興趣的,參考看看囉!

同場加映:docker 存取 usb

因為目前進行的案子需要用到 serialPort 的操作,也剛好嘗試看看直接存取 usb,compose 設定檔如下

web-arm:  
  container_name: hmi-web
  image: hypriot/rpi-node:4
  command: "/bin/bash -l -c 'npm start'"
  ports:
    - "3000:3000"
  working_dir: /app
  volumes:
    - ./:/app
  devices:
    - /dev/ttyUSB0:/dev/ttyUSB0
  environment:
    SERIALPORT: '/dev/ttyUSB0'

實際測試結果,確實可以對 USB 進行操作,也給需要的人參考

注意地雷

後來有機器可以真的嘗試 master slave 使用兩台機器,一直沒辦法成功,後來透過 docker logs 檢視 swarm master 的 log 發現出現下列錯誤訊息

time="2015-05-05T11:39:33Z" level=error msg="ID duplicated. AGM4:Z2ZA:NQW3:ZQ9K:IX34:JQJ1:SCAO:ECQL:PY4W:JVC3:C1YB:RZT6 shared by 172.30.5.100 and 172.30.5.101"  

解法參考

http://www.before.no/2015/05/docker-swarm-cluster-missing-nodes/

參考資料

https://gist.github.com/StefanScherer/c3890d8277455e6c257d

http://blog.hypriot.com/post/let-docker-swarm-all-over-your-raspberry-pi-cluster/

https://github.com/docker/swarm/blob/master/scheduler/filter/README.md

http://www.informaticslab.co.uk/infrastructure/2015/12/09/raspberry-pi-docker-cluster.html

https://github.com/hypriot/cluster-lab