After my last two blogposts [1][2], many of you asked “Why Docker on a Raspberry?” if you can install all the software directly (“There are so much tutorials“). Yeah, that’s right – but think how much work you have to invest to get the following setup running:
Raspberry Pi 2 & 2 RTL-SDR Sticks
Nr 1 is monitoring ADSB via dump1090
Nr 2 is monitoring ACARS on 2 frequencies via acarsdec
FR24FEED (www.flightradar24.com) is taking the data from dump1090 and feeds it to FR24
FlightAirMap (PHP/MySQL) is taking the data from acarsdec and dump1090 to generate a comprehensive statistic and live map of your received data.
A Mysql server for storing the Data behind FlightAirMap
You need five services which you have to install/compile, to configure, to link and to manage.
But there is a much more convenient solution: docker-compose and one (!) configuration file 🙂
ACARS is short for Aircraft Communications Addressing and Reporting System, a digital data link between an aircraft and a ground station and/or satellite.
The on-board avionic computer system (aircraft) consists of the ACARS Management Unit (ACARS MU) and a Control Display Unit (CDU) for sending and receiving digital information messages from the ground-based stations.
Ground equipment is made up of a network of radio transceivers managed by a central site computer called AFEPS (Arinc Front End Processor System), which handles and routes messages. Generally, ground ACARS units are either government agencies such as the Federal Aviation Administration, an airline operations headquarters, or, for small airlines or general aviation, a third-party subscription service. Usually government agencies are responsible for clearances, while airline operations handle gate assignments, maintenance, and passenger needs. (Wikipedia)
This is a message send by the CFD (Central Fault Display) of an aircraft 😉
#CFB.1/WRN/WN1511161031 383100506MAINTENANCE STATUS TOILET
You’re now interested how to receive such messages with minimal Hardware? You have your Raspberry Pi 2 ready? Docker installed? RTL-SDR attached? Then read on.
If not, start with my earlier blog posts to get the basics:
Soon after i published my last blogpost (Raspberry Pi + Docker + RTL-SDR) i received a bunch of feedback, questions and critic.
“Why not just compile the applications directly?” – “I may be missing the point here but why bother with Docker on the Pi?” – “It does nothing to help the Dump1090 program at all.”
So I’d like to adress some of the points in this post and explain my motivation for using Docker.
Let’s start right away with the most controversial question: Why Docker on a Pi?
Well, because it’s possible 🙂 About two weeks ago i stumbled over a blog post from the guys at Hypriot. They not only managed to install Docker on a Raspberry, they also packaged a nice and easy to use SD-Card image which i used for my first experiments. I already have some substantial background in terms of Docker as we’re using this in larger scale in our company. The concept of Containers and Images is a nice fit if you want to build an orchestrated and reproducible toolchain for you RTL-SDR – Build your Image, upload it to the docker hub – the next time you’re reinstalling your Pi (or installing a new one) you just have to run one command and the exact same version, incl. all the dependencies will be downloaded from the hub and ready to use in minutes. So no problems with outdated Howtos, updated libraries, missing git repositories etc.
Today, I’ll bring all these Projects together and show you how to build a virtual aircraft radar (screenshot) – so fasten your seatbelt 😉
I’m ready – tell me what I need
You’ll need a Raspberry Pi 2 – yes, 2! – Of course, you can go with a Pi 1 – but to be honest, this thingy has just not enough ram and only one core so it’s not really suitable for docker. But hey, if you like the pain – go on 😉
The Pi has to be prepared to run Docker – You can use the guide from my blog post if you need help
And of course you need a RTL-SDR Stick – so if you ever watched DVB-T on your Laptop, the chances are good that you already have a suitable Receiver. Some people over at Reddit compiled a nice list of sticks which are suitable for our little experiment. Oh, and an Antenna would be awesome 😉
List completed? All points checked? Great, let’s go on!
This Post will not explain how to install Dokku itself – so i assume you have a Dokku environment configured and ready.
Prepare your deployment
The following Dockerfile uses the official RabbitMQ Container and extending it by activating the management and the MQTT plugin. If you don’t need MQTT the you can delete the line
RUN rabbitmq-plugins enable--offline rabbitmq_mqtt .
1
2
3
4
5
6
FROM rabbitmq
RUN rabbitmq-plugins enable--offline rabbitmq_management
RUN rabbitmq-plugins enable--offline rabbitmq_mqtt
EXPOSE15672
Now create a new directory containing the Dockerfile with the above contents and initialize a git repository.
Then add your dokku server via
git remote add dokku dokku@myserver.com:myhostname
DO NOT PUSH(!) your changes now, you have to do some configuration first!
While i am building images for Docker on a Raspberry Pi, I searched for a way to keep my Images as small as possible because of the limited amount of disk space and also because of my $&#@ internet connection at home (really a pain in the $#@ if you want to push bigger images to the docker hub).
Let’s start with the base image for all of my sdr tools. This image derives from resins’s Debian Jessie Image and contains the basic “toolchain” for building/compiling rtl-sdr applications.
So, that’s the original Dockerfile were using to build my Baseimage (sysrun/rpi-rtl-sdr-base):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FROM resin/raspberrypi2-debian:jessie
MAINTAINER Frederik Granna
RUN apt-get update
RUN apt-get install-ylibusb-1.0-0-dev git-core cmake build-essential--no-install-recommends
RUN echo'blacklist dvb_usb_rtl28xxu'>/etc/modprobe.d/raspi-blacklist.conf
WORKDIR/tmp
RUN git clonegit://git.osmocom.org/rtl-sdr.git && \
mkdir rtl-sdr/build
WORKDIR/tmp/rtl-sdr/build
RUN cmake../-DINSTALL_UDEV_RULES=ON-DDETACH_KERNEL_DRIVER=ON&&\
make&&\
make install&&\
ldconfig
WORKDIR/
RUN rm-rf/tmp/rtl-sdr
This Dockerfile gives us a container size of ~307MB.
Optimise the process
We don’t need the package cache (downloaded packages) to be integrated in our container. So adding a apt-get clean after our install will save us some space. The apt-get update is populating the /var/lib/apt/lists/ with stuff we also don’t need after the build. So just remove them
This saves us 22MB – in this case not much. But depending on the packages you install, it could be more.
If you’re doing this for a base container, keep in mind that you have to run apt-get update to repopulate your apt cache. If you miss this step, your apt-get install calls will fail! Also clean up again after you installed the new packages.
This option is the way you should go if you don’t have a spare sd-card around.
You can download a .dep file from this page and install it via dpkg -i package_name.deb
I tried this option on my current Jessie installation and encountered one problem: All docker command had to be issued via sudo. Thats because the docker.sock is only accessible for the root user. I didn’t follow up on this as i am going with option one 🙂
Quick test run? Here we go
After you have installed either the image version or the dep, you should be good to go for a first test.
Log in to your pi and kick of the following command:
docker run -d -p 8080:80 hypriot/rpi-busybox-httpd
Docker is now downloading the webserver image from the docker registry and start the container.
Now start your web browser and open http://<your-pi-ip>:8080
Wait, there is one more thing
They also build an awesome hardware stack called “The Pi Tower” which consists of 4 Raspberry Pi 2 stacked on top of a 5-Port-Switch.
To get WP up and running you have to prepare several things. This guide is based on a Dokku installation on a DigitalOcean Dropplet; for me the most convenient way to get a Dokku platform running.
Prepare your dokku environment
To make sure everything is on place, you should prepare your dokku environment.
1. Add your app
Create a app with the
dokku apps:create<appname> where appname is the sub domain of your dokku server.