Continuous Deployment mit Docker und Jenkins (DE)

Continuous Deployment mit Docker und Jenkins (DE)

E54070c941e73381a3473df8e2aab667?s=128

Martina Kraus

November 21, 2016
Tweet

Transcript

  1. Continuous Deployment mit Docker und Jenkins Martina Kraus 21.11.2016 @wing121

    github.com/codekittey
  2. Agenda • Was ist Docker? ◦ Einführung ◦ Architektur (Technische

    Details) ◦ Basic Usage • Jenkins • Continuous Deployment • Shipyard 2
  3. Warum Docker? Seit Beginn (März 2013): (https://github.com/docker/docker) • > 37,

    000 stars • > 1000 Kontributoren • > 2000 dockerisierte Applikationen und Images: ◦ Redis, Node.js, Hadoop, MySQL, PostgreSQL • Integration in Jenkins, Travis, Chef, Puppet, Vagrant und OpenStack • Docker-Meetups auf der ganzen Welt: ◦ Docker-Mentor Week (letzte Woche) ◦ Docker Online Meetups 3
  4. Warum Docker? Image: http://www.docker.com 4

  5. Image: http://www.docker.com Warum Docker? 5

  6. Für Entwickler: Build once … run anywhere: • Sichere, performante,

    skalierbare und portable Applikation. • Keine Gedanken um fehlende Dependencies, Packages oder Libraries. • Applikation läuft in ihrem eigenen isolierten Container: ◦ Testen verschiedener Versionsstände einfach möglich. • Nur der Entwickler selbst kann entscheiden mit welchen Abhängigkeiten seine Software läuft: ◦ MySQL Version, Node.JS Version usw. 6
  7. Für Admins: Configure once … run anything: • Reduzierung von

    Inkonsistenzen verschiedener Laufzeitumgebungen: ◦ Development, ◦ Staging, ◦ Production. • Günstige “Virtualisierung” ohne den Overhead einer VM. • Einfach Skalierung: ◦ Ausrollen neuer Versionen durch einfach stoppen/ starten eines Containers 7
  8. Docker Architektur Image: http://www.docker.com 8

  9. Docker Architektur (LXC) • Lightweight Containers mithilfe von LXC (Linux

    Containers) ◦ Verfahren zur Virtualisierung. ◦ Ermöglicht mehrere voneinander isoliert laufende Linux-Systeme auf einem Host. ◦ Lange Zeit deswegen nur auf Linux nativ möglich. ◦ Durch cgroup und namespaces gruppierung/ kategorisierung der Prozesse. • Seit v0.9 werden libcontainer als Laufzeitumgebung verwendet ◦ Bringt sämtliche Features (cgroups, Linux namespaces) out-of-the-box mit. ◦ Unabhängig von der LXC implementierung. 9
  10. Technische Details • Isolierter Prozess-Speicher, • Eigenes Netzwerk, • Container

    === isolierter Prozess, • Container teilen sich den Kernel, • Docker ist in Go geschrieben • Mittlerweile auch nativ auf Mac OS und Windows möglich 10
  11. Grundlagen: Docker-Images • Bildet Grundlage jedes Containers. • Mehrere Container

    des selben Images können parallel betrieben werden. • Basic Images werden über Docker-Hub zur Verfügung gestellt. ◦ Nginx, ◦ Node.JS, ◦ MySQL, • Container isoliert von Host und anderen Containern: ◦ Kommunikation nach Außen nur nach Freigabe möglich: ▪ Ports, ▪ Volumes (persistente Daten die auch beim Löschen eines Containers erhalten bleiben), ▪ Netzwerke, 11
  12. Docker-compose Tool zum Definieren und Starten von multi-container Anwendungen, mehreren

    “Services” • Aktuell: v1.9.0 • Bietet Tools zum Verwalten der Container: ◦ Start ◦ Stop ◦ Rebuild 12
  13. Jenkins • Webbasiertes Software-System für Continuous Integration • Konfiguration Build

    Steps: ◦ automatisierte Tests / statische Code-Analyse angestoßen, ◦ Eigene Shell-Skripte ausführen, ◦ Post-Build Step: Email-Notification/ Report-Data, ◦ Weitere Builds automatisch anstoßen. 13
  14. Das Ziel: Continuous Deployment • Entwickler pushed Code in VCS

    (Git/ Mercurial). • Jenkins Build wird angestoßen: (Tests/ Code Analyse). Unicorn Magic BAM alles Deployed 14
  15. Glücklicher Kunde / Admin / Entwickler 15

  16. Unicorn Magic Nach den Build Steps: • Wird ein neues

    Docker-Image der Software erstellt, • Das Image in eine private Docker-Registry gepushed, • ssh auf den Test-Server: ◦ Stoppen und löschen des aktuellen Containers ◦ Pullen des neuen Images von der privaten Docker-Registry ◦ Starten des Containers anhand des neuen Images 16
  17. Herausforderungen • IPs und Ports eines Containers müssen an Ports

    des Hosts “gebunden” werden. • Innerhalb des docker-compose-Files werden diese Ports definiert. • Diese können allerdings bereits auf dem Host belegt sein. Abhilfe: nginx-proxy -Tool (Reverse Proxy) von Jason Wilder: https://github.com/jwilder/nginx-proxy • Triggert bei jedem starten und stoppen eines Containers eine neue Konfiguration des Nginx an. 17
  18. 18

  19. Shipyard • Tool zum Managen von ◦ Containern ◦ Images

    ◦ Registries ◦ Events ◦ Accounts LIVE DEMO 19
  20. 20

  21. 21 Martina Kraus @wing121

  22. Further Readings • http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/ • http://www.onwerk.de/2016/11/05/with-docker-in-5-minutes-from-developer-to-test-server/ • https://docs.docker.com/registry/deploying/ • https://shipyard-project.com/

    • https://docs.docker.com/swarm/overview/ • https://github.com/wsargent/docker-cheat-sheet 22