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

Docker su architettura ARM

Avatar for weLaika weLaika
December 29, 2016

Docker su architettura ARM

Avatar for weLaika

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