Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker su architettura ARM

weLaika
December 29, 2016

Docker su architettura ARM

weLaika

December 29, 2016
Tweet

More Decks by weLaika

Other Decks in Technology

Transcript

  1. Giampaolo Mancini – @mancho_z www.trampolineup.com 13 + 15 Dicembre 2016

    Dai Server ad Alta Densità fino a Internet delle Cose TORINO HACKNIGHT
  2. Giampaolo Mancini – @mancho_z www.trampolineup.com Chi siamo • Trampoline SRL

    – est. Jan 2010 • Ex I3P – 2010/2014 • Premi, premini, premietti vari – StartCup, Premio Perotto, ecc. Giampaolo Mancini + Francesco Varano • Ing. Informatici • Ricercatori @ PoliTO • R&D WiNext • Trampoline
  3. Giampaolo Mancini – @mancho_z www.trampolineup.com Prodotti (as-a-service) Placejam Social WiFi

    – Identità + Presenza + Interazione • ~500.000 utenti in Italia su ~300 hotspot (da bar a comuni) • Valentino/VFG, Swatch Group, Lindt Italia, IREN, Ativa, Elmec, etc. Nuovi Prodotti/Servizi – IoT + Cloud • 11Probes – Contapersone + Analisi flussi + Posizionamento • Printercast – Cloud printing open con accounting e billing (senza Domini) "Roba che ti fa guadagnare mentre dormi"
  4. Giampaolo Mancini – @mancho_z www.trampolineup.com Networking + Cloud and distributed

    computing • GNU/Linux e Software Libero (dal 1996) – C#/.NET/Mono, Python, Web • Networking carrier-grade (wired, wireless, LPWAN) • Applicazioni web e back-end ad alte prestazioni/alta affidabilità/alta usabilità • API Cloud – Amazon AWS, Google, etc. • Container – Docker • Search, analytics, streaming data – PGSQL, ELK, InfluxDB, ZeroMQ, MQTT • GNU/Linux Embedded/ARM, Python + MicroPython
  5. Giampaolo Mancini – @mancho_z www.trampolineup.com Docker su ARM - Perché

    TL;DR Domare l'incubo degli upgrade da remoto dei dispositivi IoT
  6. Giampaolo Mancini – @mancho_z www.trampolineup.com Architettura ARM (Cortex-A) • ARM-A

    (CPU/SoC General Purpose) vs ARM-M (embedded propriamente detto) • Smartphone • Single Board Computer: Raspberry Pi & Co. ◦ Supporto per 29 nuove board ARM in Linux 4.9 • Hardware "embedded" di nuova generazione ◦ Videocamere ◦ Microserver ◦ Networking • Server/Hosting bare-metal ◦ Low cost ◦ Alta densità ◦ Consumi ridotti
  7. Giampaolo Mancini – @mancho_z www.trampolineup.com Docker su ARM - Server/Hosting/Cloud

    • Sistema operativo di base stabile stateless • Servizi/applicazioni indipendenti dal SO/Distribuzione • Hosting bare-metal + alta densità = Containers-as-a-Service • Architettura di riferimento per cloud-on-premises? • Hosting bare-metal ARM ◦ scaleway.com ◦ packet.net
  8. Giampaolo Mancini – @mancho_z www.trampolineup.com Docker su ARM - IoT

    • Sistema operativo di base stabile (e stateless) • Servizi/applicazioni indipendenti dal SO/Distribuzione • Update OTA granulare dei (micro)-servizi • Architettura a micro-servizi -> nodi stateless ◦ Storage read-only ◦ Corruzioni SD Card ◦ Provisioning a run-time ◦ ...
  9. Giampaolo Mancini – @mancho_z www.trampolineup.com Docker su ARM - Dove

    si può arrivare? ESEMPIO: Microservizi Python in immagini docker • Sandbox (solo applicazione, immagine FROM SCRATCH) • Solo binari (solo eseguibile o solo runtime) • Applicazione cifrata (riduzione di problemi di IP infringement/sicurezza) • 10-20MB vs 180-250MB immagine Python ufficiale
  10. Giampaolo Mancini – @mancho_z www.trampolineup.com Da dove si parte? -

    Server Macchina ARM con GNU/Linux per ARMHF/AARCH64 • Distribuzioni ◦ Tutte le maggiori ◦ Consiglio: supporto UFFICIALE per Docker ◦ Consiglio: kernel aggiornato con driver per storage OverlayFS ◦ Installazione da package manager o "curl | sh"
  11. Giampaolo Mancini – @mancho_z www.trampolineup.com Da dove si parte? -

    IoT Macchina ARM con distribuzione GNU/Linux per IoT • Caratteristiche raccomandate della distribuzione ◦ SUPPORTO e pacchetti ◦ SUPPORTO per le board o dai produttori ◦ Linux 4.x • Distribuzioni ◦ Raspbian ◦ Arch Linux ◦ HypriotOS ◦ C.H.I.P. OS ◦ ResinOS
  12. Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – Arch Linux

    ARM • Arch Linux For ARM ◦ Distribuzione rolling ◦ Supporto ottimo ◦ Documentazione ottima ◦ Ottimo supporto delle board supportate ufficialmente ◦ Kernel sempre aggiornato ◦ Pacchetti "vanilla"
  13. Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – Raspbian •

    Raspbian ◦ Una delle distro per Raspberry Pi ◦ Supporto ufficiale di Docker ◦ Collaborazione Raspberry Pi Foundation e Docker ◦ Diversi Docker Captain coinvolti ◦ "curl | sh"
  14. Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – HypriotOS •

    HypriotOS ◦ Dieter Reuter (@Quintus23M) ◦ Basata su Raspbian: solo per Raspberry Pi ◦ Docker ottimizzato pre-installato ◦ Versioni future basate su Debian per ARMHF/AARCH64: altre schede ◦ La distribuzione più ottimizzata e production-ready per Docker su ARM so far. ◦ Tool di contorno per flash delle SD e provisioning di base. ◦ http://blog.hypriot.com
  15. Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – C.H.I.P. OS

    • C.H.I.P. OS ◦ Per C.H.I.P. – board ARM più economica disponibile (la mia preferita) ◦ WiFi + BLE integrati ◦ Basata su Debian: solo C.H.I.P. ◦ Tool di contorno per flash delle SD. ◦ "curl | sh" ◦ Supporto ufficiale Docker dal 2016-12-11
  16. Giampaolo Mancini – @mancho_z www.trampolineup.com GNU/Linux IoT – ResinOS •

    ResinOS ◦ Basata su Yocto ◦ Supporto per molte board "serie" ◦ Approccio "boot to docker": systemd + qualche servizio al contorno + docker ◦ Tool CLI per provisioning ◦ Storage read-only e supporto per OTA del SO (bootloader + partizioni ridondate sulla SD) ◦ Basata sull'esperienza di resin.io: molto promettente
  17. Giampaolo Mancini – @mancho_z www.trampolineup.com Workflow di sviluppo • FROM

    <immagine base per ARMHF/AARCH64 su hub.docker.com> • FROM scratch • NATIVO: Build su board ARM • CROSSBUILD: su GNU/Linux e MacOS (forse anche su Windows)
  18. Giampaolo Mancini – @mancho_z www.trampolineup.com Nativo – Immagini ARM da

    Hub • Solito caos di hub.docker.com • Repository consigliati ◦ https://hub.docker.com/u/container4armhf/ ◦ https://hub.docker.com/u/resin/ ◦ https://hub.docker.com/u/aarch64/ • Raccomandate immagini basate su Alpine Linux ◦ Immagine base ufficiale ◦ Occhio a musl-libc
  19. Giampaolo Mancini – @mancho_z www.trampolineup.com Nativo – Immagini FROM SCRATCH

    • Generare un rootfs per ARMHF/AARCH64 • Dockerfile FROM scratch ADD rootfs / • docker build -t myrepo/myimage .
  20. Giampaolo Mancini – @mancho_z www.trampolineup.com Nativo – Immagini "FROM scratch"

    • Easy way: script in docker/contrib ◦ mkimage.sh <opzioni deboostrap per debian/ubuntu> ◦ mkimage-alpine.sh ◦ mkimage-arch.sh ◦ … • Veri duri ◦ debootstrap ◦ pacstrap ◦ (Alpine Linux') apk ◦ …
  21. Giampaolo Mancini – @mancho_z www.trampolineup.com Nativo – Alpine FROM SCRATCH

    su GNU/Linux $ export ALPINE_ARCH=$(uname -m) $ export BUILD_DIR=$(mktemp -d -p . -u apk-XXXXXXXX) $ export CHROOT_DIR=${BUILD_DIR}/rootfs-${ALPINE_ARCH} $ export ALPINE_MIRROR="http://dl-cdn.alpinelinux.org/alpine" $ export ALPINE_REPO=${ALPINE_MIRROR}/edge/main $ export APK_URL=${ALPINE_REPO}/${ALPINE_ARCH}/apk-tools-static-2.6.8-r1.apk $ curl -fsSL ${APK_URL} | tar xz --strip-components 1 sbin/apk.static $ sudo ./apk.static -X ${ALPINE_REPO} \ --arch ${ALPINE_ARCH} -U --allow-untrusted \ --root ${CHROOT_DIR} --initdb add alpine-base
  22. Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild • Generazione delle immagini

    per ARM su PC/Mac AMD64/X86_64 • Esecuzione dei container ARM su PC/MAC • Possibile incremento di prestazioni • (Emulazione ARM su PC/Mac con Qemu) • In generale, consiglio board ARM da build/sviluppo (tanta CPU/RAM). • GNU/Linux ◦ Qualsiasi distro con pacchetti per qemu-user-static e binfmt-misc ◦ Debian/Ubuntu, Arch, … • Docker for Mac
  23. Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild – Prerequisiti Un po'

    di chroot voodoo magic vecchia scuola: qemu-user-static + binfmt-misc (host == macchina di sviluppo, target == macchina di deployment) Usiamo binfmt-misc per far credere al docker del host (su Mac, al docker che gira sul GNU/Linux che gira in xhyve) di poter eseguire nativamente i binari per ARM. In realtà i binari vengono eseguiti da qemu-arm-static e qemu-aarch64-static.
  24. Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild – Primi passi su

    GNU/Linux mancho@phaeton:~$ uname -a Linux phaeton 4.5.7-std-3 #1 SMP Tue Jul 12 09:56:30 UTC 2016 x86_64 GNU/Linux mancho@phaeton:~$ docker run --rm -ti container4armhf/armhf-alpine /bin/sh mancho@phaeton:~$ sudo apt update && sudo apt install qemu-user-static binfmt-misc mancho@phaeton:~$ docker run --rm -ti \ -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static \ container4armhf/armhf-alpine /bin/sh
  25. Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild - Strategie per GNU/Linux

    • A runtime -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static • Build di nuova immagini con: FROM container4armhf/armhf-alpine COPY qemu-arm-static /usr/bin # Oppure RUN di script che fa check dell'architettura # e scarica qemu-user-static RUN rm /usr/bin/qemu-arm-static # ...
  26. Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild - RootFS Cross su

    GNU/Linux $ export HOST_ARCH=$(uname -m) $ export TARGET_ARCH="armhf" $ export BUILD_DIR=$(mktemp -d -p . -u apk-XXXXXXXX) $ export CHROOT_DIR=${BUILD_DIR}/rootfs-${TARGET_ARCH} $ export ALPINE_MIRROR="http://dl-cdn.alpinelinux.org/alpine" $ export ALPINE_REPO=${ALPINE_MIRROR}/edge/main $ export APK_URL=${ALPINE_REPO}/${HOST_ARCH}/apk-tools-static-2.6.8-r1.apk $ curl -fsSL ${APK_URL} | tar xz --strip-components 1 sbin/apk.static $ mkdir -p ${CHROOT_DIR}/usr/bin $ cp /usr/bin/qemu-arm-static ${CHROOT_DIR}/usr/bin $ sudo ./apk.static -X ${ALPINE_REPO} \ --arch ${TARGET_ARCH} -U --allow-untrusted \ --root ${CHROOT_DIR} --initdb add alpine-base
  27. Giampaolo Mancini – @mancho_z www.trampolineup.com Crossbuild - Tips & Tricks

    • RootFS Cross su Mac: container ARM/X86_64 per generare rootfs cross $ docker run --rm -ti -v tools:/tools alpine:edge \ /tools/bootstrap-cross-rootfs.sh • Cross-compilare prima tutto quello che si può: ◦ Python – generare wheel per ARM di tutti i pacchetti (pip wheel) ◦ … • GPIO, PiCamera, ecc. ◦ --privileged per test ◦ --device in produzione