Slide 1

Slide 1 text

Continuous Deployment mit Docker und Jenkins Martina Kraus 21.11.2016 @wing121 github.com/codekittey

Slide 2

Slide 2 text

Agenda ● Was ist Docker? ○ Einführung ○ Architektur (Technische Details) ○ Basic Usage ● Jenkins ● Continuous Deployment ● Shipyard 2

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Docker Architektur Image: http://www.docker.com 8

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Glücklicher Kunde / Admin / Entwickler 15

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

Shipyard ● Tool zum Managen von ○ Containern ○ Images ○ Registries ○ Events ○ Accounts LIVE DEMO 19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

21 Martina Kraus @wing121

Slide 22

Slide 22 text

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