Bis vor kurzem lief dieser Blog auf einem CoreOS-Host bei DigitalOcean. Er läuft immer noch bei DigitalOcean, aber der Prozess zur Aktualisierung des Blogs hat sich geändert.
Wann immer ich etwas ändern musste, habe ich
- mich eingeloggt, entweder direkt per SSH oder mit docker-machine,
- das Git-Repository gepullt,
- das Docker-Image neu gebaut und
- den Container aktualisiert.
Nicht sehr elegant. Zeit für eine Änderung und Vereinfachung.
Wie mache ich es jetzt? Ganz einfach…
- Den Blogbeitrag fertigstellen.
- Das Docker-Image erstellen, das im Wesentlichen nginx und den Inhalt enthält.
- Das Docker-Image in die Docker-Registry pushen.
- Ein wenig warten.
- Den neuen Blogbeitrag online lesen.
Wie bin ich dahin gekommen? Ganz einfach…
Als intensiver Nutzer von docker-compose kam alles zusammen, als ich Docker Cloud und seine Service Stacks nutzte. Anstatt eine docker-compose.yml zu schreiben, erstellt man eine sehr ähnlich aussehende docker-cloud.yml. Ich hatte bereits eine virtuelle Maschine bei DigitalOcean, also verknüpfte ich meine beiden Konten und holte mir den docker-cloud Client:
alias docker-cloud="docker run -it -v ~/.docker:/root/.docker:ro -v `pwd`:/root --rm dockercloud/cli"
Ein Service kann auf Redeploy eingestellt werden, sodass bei jeder Änderung des Images der Service-Container mit dem neuen Image aktualisiert wird.
Alles in allem erfolgt die Erstellung des Blogbeitrags vollständig mit Docker. Ich brauche kein Jekyll-Tooling auf meinem Mac - nur einen Editor zum Schreiben des Textes und Docker selbst.
Hier sind einige Befehle, die den Workflow detaillierter beschreiben.
Die initiale Erstellung des Service Stacks (die docker-cloud.yml ist sehr ähnlich zu einer docker-compose.yml):
docker-cloud stack create -f /root/docker-cloud.yml
docker-cloud stack start root
Das kann in einem Befehl erfolgen, aber ich bevorzuge zwei separate Schritte.
Wann immer sich der Service Stack selbst durch Änderung der docker-cloud.yml ändert, muss ich nur Folgendes ausführen - zum Beispiel beim Ändern einer Konfiguration des Load Balancers:
docker-cloud stack update root -f /root/docker-cloud.yml
docker-cloud service redeploy lb-prod
Warum benutze ich einen Load Balancer? Ganz einfach…
Ich betreibe zwei Container, die zwei verschiedene Versionen des Blogs bereitstellen: eine ist die Live-Version, die du jetzt siehst, und die andere ist eine Vorschau, in der ich Entwürfe überprüfe, bevor ich sie fertigstelle.
Der Load Balancer prüft die Subdomain und leitet die Anfrage an den entsprechenden Container weiter.
Das ist nicht genau “echtes” Continuous Deployment. Es ist kontinuierlich ab dem Punkt des Image-Pushes, aber nicht ab Quelländerungen. Als Nächstes werde ich das mit Docker Clouds Build-Jobs adressieren.
Das war’s für heute!