+ Docker-Compose
12. Webmontag Kassel, 25.11.2016
Über mich
- Web-/Softwareentwicklung
- Linux (und BSD) "Serverkram" (lies: DevOps)
- aus Paderborn
- 13 Monate Zürich
- jetzt Kassel ;)
Projekt in Zürich
- (neben NodeJS)
- Docker: CI + internes Test-Deployment
- ab ~ Oktober 2014 docker-compose (release: 1.0)
- Docker für Entwicklungsinfrastruktur
- später mehr…
Was ist Docker?
- Tool zur Isolation von Anwendungen
- Paketierung samt aller Abhängigkeiten (libraries, module)
- damit portable Images (Voraussetzung: Docker-Engine)
- "Framework" für skalierbare Deployments (docker-machine,
docker-swarm)
- …auch unter Mac und Windows "irgendwie" möglich
Funktionsweise
- Images ("Blaupause") werden erstellt (docker build)
- Container ("Instanz", basierend auf Image) starten (docker run)
- Container-Prozess isoliert vom Hostsystem
- Veränderung nur im Overlay-Dateisystem
(Pseudo-) Live-Coding
[:~] % docker run -it centos:latest /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
fa5be2806d4c: Pull complete
2bf4902415e3: Downloading [=======================> ] 65.4 MB/70.51 MB
86bcb57631bd: Download complete
c8a648134623: Pulling fs layer
[root@5906c1e05931 /]# cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
[root@2f8abb19aec1 /]# ls -d /home
/home/
[root@2f8abb19aec1 /]# rm -rf /home/
[root@2f8abb19aec1 /]# ls -d /home
ls: cannot access /home/: No such file or directory
was ist passiert?
- Image geladen vom Docker Hub
- andere Distribution
- eigenes Dateisystem
- (Docker-) internes Netzwerk
Overlay Dateisysteme
Analogie: Ebenen in Bildverarbeitung
Dies gibt uns:
- Schnelles instanziieren ("klonen")
- Verwerfen/Rollback
- geringer Speicherbedarf
Isolation vs Virtualisierung
Virtualisierung
- "virtueller Computer"
- eigener Kernel
- eigenes Userland
- recht hoher Overhead
- flexibel: fast jedes Betriebssystem lässt sich ausführen
Typische Vertreter: VMWare, Virtualbox, KVM
Isolation
- gleicher Kernel
- eigenes Userland
- kaum Overhead
Typischer Vertreter: Solaris Zones, FreeBSD Jails, LXC, OpenVZ, "docker"
docker nutzt Kernel-Namespaces und cgroups (früher LXC)
Raus aus der Isolation!
- Ports von außen weiterleiten
- Volumes (Dateien) einbinden (z.B. Webserver)
- Verbindung von Container untereinander
Ports Weiterleiten
…vom Host-Interface zum Docker-Container
docker run -d --name rabbitmq-master \
-p 8080:15672 \
rabbitmq:management
Container untereinander
# zuerst noch ein paar benötigte Container starten
docker run -d --name mongo-master mongo:2
docker run -d --name redis-master redis
# nun unsere Anwendung
docker run -d -p 80:3000 --name app-master \
--link redis-master:redis \
--link mongo-master:mongo \
--link rabbitmq-master:rabbitmq \
-e NODE_ENV=production \
myApp:master
Environment Variablen nun z.B.:
- RABBITMQ_PORT_5672_TCP_ADDR=172.17.0.2
- RABBITMQ_PORT_15672_TCP=tcp://172.17.0.2:15672
Commands eintippen ist mühsam…
Man stelle sich vor… jetzt kommt noch der
ELK-Stack obendrauf…
docker-compose!
docker-compose.yml für unser Beispiel von vorhin:
rabbitmq:
image: rabbitmq:management
ports:
- "8080:15672"
mongo:
image: mongo:latest
redis:
image: redis
app:
image: myApp
environment:
- NODE_ENV=production
links:
- rabbitmq
- mongo
- redis
Alles starten:
$ docker-compose -p master up -d
Was haben wir jetzt?
Entwicklungs-Umgebung
- docker-compose.yml in VCS einchecken ("Infrastructure as code")
- keine Installationsorgien
- jeder Entwickler hat die gleiche Version (und immer die passende für das jeweilige Projekt)
- passende Konfiguration kann mitgeliefert werden (siehe ELK-Stack)
- disposable — Dev-Umgebung kann leicht resettet werden
- Services laufen nicht ständig (Resourcen auf Workstation)
CI
- beliebig viele Instanzen können nebeneinander getestet/gestartet werden (Isolation!)
- Workflow: Image auf Herz und Nieren testen, dann exakt das Image deployen
- Selenium (UI-Tests) im Docker Container (kein X auf dem Server installieren!)
- Build-Agent hat nur docker als Abhängigkeit
Deployment
- Images können an den Prod-Server geschickt werden
- einfache "INSTALL.md"
- "linken" von Containern ist Netzwerk-Transparent
- einfachere Konsolidation mehrerer Anwendung auf einem Server (Isolation!)
Hands-on
- Docker-Compose für Dev-Infrastruktur
- Docker für CI Workflow
- docker build
- Docker auf BTRFS!
- Security
- (Image-) Updates