Teil 1 – CI / CD Docker Composer

Nach langer Zeit und einiges an Informationsverarbeitung, hier ein kleiner Beitrag von mir zum Thema Continuous Integration und Continuous Deployment.

Vermutlich weist du um was es sich handelt. Entwickler schreiben auf Ihren lokalen Arbeitsplätzen hervorragende Anwendungen und Features die irgendwann den Weg auf eine Testumgebung finden. Von dort aus geht es in dann meist auf eine Qualitätsumgebung bis es dann schlussendlich in der produktiven Umgebung landet. Da hier in der Vergangenheit viele manuell Schritte nötig waren, die natürlich nicht immer Fehlerfrei durchlaufen wurden, kann das ganze voll automatisch strukturiert werden. Der Vorteil liegt klar auf der Hand, automatische Prozesse machen immer das gleiche und verringern die Fehleranfälligkeit. Zudem spart man viel Zeit, im vergleich zum manuellen Deployment.

Der Workflow sieht dann im Grunde vor, dass die Entwickler wie gewohnt ihren Programmcode in einer Source Verwaltung ( Beispielsweise GIT ) aufbewahren und dort aktualisieren. Von hier aus kann der automatisch Prozess dann auch schon beginnen.

Ein so genannter Build Service, in meinem Fall Jenkins, bekommt die Information das sich in einem überwachten Branch etwas verändert hat. Nun wird der Programmcode aus dem Source Repository gezogen und „gebaut“. Bauen kann in verschiedenen Programmiersprachen natürlich unterschiedlich aussehen. Gehen wir von einer Java Applikation mit Maven aus dann wird nun ein „mvn clean package“ erzeugt. Während dessen laufen die Tests und mit ein wenig Erweiterungen wird ebenfalls die Code Qualität geprüft und die Testabdeckung berechnet. Diese Information können dann zum Beispiel in SonarQube eingesehen werden. Sollte alles passen wird das Packet weiter verarbeitet und landet in der Testumgebung. Hier können dann Integrations Test gefahren werden. Eine Lösung hierfür wäre zum Beispiel Postman. Zudem können noch Last Test gemacht werden, hier bietet sich JMeter an. All diese Tests lassen sich Problemlos automatisiert durchführen. In der Qualitätsumgebung können dann zum beispiel manuell Test gemacht werden oder noch viel besser, automatisierte Acceptance Tests durchgeführt werden. Sollte hier alles wie gewünscht laufen spricht nichts mehr dagegen die neue Version in die Produktive Umgebung zu liefern.

Wie sieht nun meine Lösung aus. Ich habe schon öfters geschrieben das ich meine Umgebung und mein Server komplett auf Docker ausgelegt habe, daher ist es auch für mich nahelegend das meine Integration dieser Schritte ebenso eine Container Lösung benötigt. Daher habe ich ein einfaches docker-compose.yml erstellt das mir die benötigten Services startet. Leider sind noch nicht alle Schritte automatisch hinterlegt aber diese werden noch im Git Repository aktualisiert und mit einer Beispielanwendung optimiert.

version: '2'
services:
jenkins:
image: jenkins/jenkins:lts-alpine
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 8088:8080
- 50000:50000
links:
- artifactory
- registry
- repository
- sonar
artifactory:
image: docker.bintray.io/jfrog/artifactory-oss
ports:
- 8081:8081
registry:
image: registry
ports:
- 5000:5000
repository:
image: gitlab/gitlab-ee
ports:
- 443:443
- 8000:80
sonar:
image: sonarqube:alpine
ports:
- 9000:9000
- 9092:9092

Hauptbaustelle ist nun die Docker Nutzung im Jenkins Container. Hier wird bereits der docker.sock gemounted aber funktioniert nicht direkt über den Jenkins User im Jenkins Container. Hierfür sind zwei weitere Schritte nötig.
Einmal muss noch die Docker CLI installiert werden:

apk --update add curl \
&& mkdir -p /tmp/download \
&& curl -L https://download.docker.com/linux/static/stable/x86_64/docker-18.06.0-ce.tgz | tar -xz -C /tmp/download \
&& mv /tmp/download/docker/docker /usr/local/bin/ \
&& rm -rf /tmp/download \
&& apk del curl \
&& rm -rf /var/cache/apk/*

zum anderen die Rechte des Users angepasst werden zum Beispiel über die Gruppe Docker:984 oder chmod docker.sock … das ist dir überlassen wie du das am liebsten löst.

Hierfür werde ich in den nächsten Tagen ein eigenes Dockerfile zur Verfügung stellen, natürlich kannst du das auch selbst realisieren und ein Dockerfile bassierend auf das jenkins/jenkins:lts-alpine oder jenkins/jenkins:lts aufbauen. Ich hab mich für die kleinere Variante mit alpine entschieden aber geht natürlich auch mit ubuntu.

Dieser Artikel dient im Ersten Schritt als eine Einführung und es werden sicher noch weitere Beiträge folgen die dieses Paket abrunden. Das Ziel ist es dieses komplette Environment auf einem Kubernetes Cluster auszurollen und in Jenkins am Ende nur noch Jobs angelegt werden müssen die Bereits mit einem Jenkinsfile im Repository liegen.

//TODO an mich: Ein Video erstellen 🙂

Locker mit Docker – Heute Nginx mit RTMP Modul

Als Streamer wünscht man sich natürlich eine große Erreichbarkeit. Viele Zuschauer tummeln sich auf Twitch.tv einige auf Hitbox.tv und einige schauen auf der neuen Gamingplattform von YouTube zu.

Wie soll man die alle erreichen wenn man gerade mal einen Dienst beliefern kann weil die Internet Leitung nicht mehr hergibt.

Die Lösung ist ein NGINX RTMP Server.
Relativ zügig aufgesetzt kann so über einen Server der eigentliche Stream auf viele andere Plattformen verteilt werden.

Und hier nun die erste Video Anleitung zum Thema.

 

 

Locker mit Docker – Nginx Proxy

Einen Docker Container zu starten ist ja kein Problem, wenn dieser dann aber noch auf den Port 80 lauschen soll weil es eine Webseite ist und diese Webseite nur eine von vielen ist… Wird es nervig . Denn jeder Container muss in Nginx eingetragen werden und beim Neustart .. Klar neu eintragen weil er einen neuen Port hat.

In der Praxis sieht das ganze anderes aus. Man automatisiert das natürlich. Mit dem Docker Container Nginx-Proxy und einer Env Variable mit dem Hostnamen im WebContainer werden diese automatisch in Nginx hinzugefügt.

Mein Setup aktuell ist der nginx Proxy und 5 Container mit einer lucee WebApplicationen.

Jetzt fehlt eigentlich nur noch das automatische testen, bauen und deployen der Container bei einem gut Push.

Locker mit Docker – Heute der Mailserver

Ich selbst habe immer Probleme mit den Mailservern. Die mögen mich einfach nicht. Dank dem Tutorial von Tomas Leister konnte ich ihn dann aber doch noch zum laufen bringen.

Nachdem ich aber einen Server Wechsel vorgenommen habe, ging das Spiel von vorn los. Wenn ich den Mist jetzt noch auf anderen Servern machen muss dreh ich am Rad. Also hab ich nun einen Docker Container gebaut der einfach läuft wie ich das gern hätte. Mit Datenbank, Catch all und mehreren Domains. Die Datenbank und Tabellen werden erstellt. Einige Variablen kann man und muss man dem Container mitgeben.

Das ganze steht natürlich in Git und im Docker Hub zur Verfügung.

Hier die Locker mit Docker PlayList auf Youtube

Jahrestag – let´s encrypt locker mit docker

Moin liebe Leser,

heute vor genau 8 Jahren habe ich diesen Blog erstellt. Ich habe damals glaub ich nicht gedacht das ich hier tatsächlich irgendwann man mal was schreibe oder irgendjemand diesen Blog hier überhaupt lesen wird. Aber mit der Zeit habe ich den ein oder anderen Post mit furchtbarer Grammatik und vielen Rechtschreibfehlern veröffentlicht. Hauptsächlich für mich selbst um hin und wieder noch mal was aufzuarbeiten oder mich an Themen und Informationen zu erinnern. Ja ich selbst nutzte mein Blog oft als Quelle für vergessenes, man kann sich ja nicht alles merken. 😉

Mein Thema heute ist auch ganz interessant und den Befehl den ich hier heute Posten werde, benötige ich selbst sicher noch öfter. Jedes mal dann wenn ich meine SSL Zertifikate erneuern muss.

Mein Server lief bis vor kurzem noch auf einem CentOS 7, jedoch hab ich es nicht vernünftig hin bekommen den Mail Server zum laufen zu bringen. Auch war der Server mit der Zeit ehr eine Sandbox mit irgendwelchen installierten Programmen die ich nie wieder brauchte.

Daher habe ich mich dazu entschlossen gehabt, mein System komplett neu aufzusetzen. Das OS ist nun ein Ubuntu LTS 14.04 mit installiertem Docker.IO. Ansonsten läuft auf dem Host selbst nur noch der Mail Server da ich hier nicht konsequent genug war um es in einem Docker Container zu packen den Apache2 selbst hab ich auch noch nicht im Docker.

Den Apache2 Server möchte ich kurzfristig mit einem nginx Docker Container austauschen und entsprechend einen PHP Container daran anpassen. Hier fehlt mir aber momentan die Lust und Zeit das htaccess File entsprechend zu portieren. Dann muss auch noch PHP 5.62 und der MySQL Server entsprechend in Container landen damit die Webseiten auch in einzelne Container laufen.

Desweiteren läuft ein TS3 Docker Container, ein Minecraft 1.9.2 Vanilla Docker Container, ein Minecraft Craftbukkit Docker Container.

Hier gefällt mir besonders gut das diese Software Pakete nicht auf dem Host selbst installiert sind und gekapselt visualisiert auf dem Server verweilen. Demnächst werde ich dann noch ein docker-composer Script schreiben der beim Server Restart entsprechende Container automatisch startet.

Jetzt zurück zum eigentlichen Thema dem Let´s encrypt Zertifikat für SSL.
Mit dem folgenden Befehl wird ein Container gestartet der direkt das let´s encrypt setup tool startet und auf dem Host entsprechende Certifikate ablegt. Den Ordner /var/www hab ich noch als mapping zwischen Host und Container gepackt damit ich diesen als WebRoot im Setup Tool angeben kann. Den 80er Port (HTTP) und 443er Port (HTTPS)  musste ich auch noch entsprechend anpassen da hier ja bereits der apache auf dem Host läuft.

Wenn man den automatischen temporären Webserver nutzten möchte sollte man vorab den apache/nginx stoppen um die ports frei zu haben.

sudo docker run -it –rm -p 443:443 -p 80:80 –name letsencrypt \
-v „/mnt/letsencrypt:/etc/letsencrypt“ \
-v „/mnt/ssl:/var/lib/letsencrypt“ \
quay.io/letsencrypt/letsencrypt:latest certonly –rsa-key-size 4096 -d meinedomain.de

Die noch offenen Container werde ich demnächst erstellen und dann auch auf meiner docker hub seite veröffentlichen.

Dokumentation Docker Befehle

Dies ist eine Sammlung von Docker Befehlen, sie dient eigentlich nur mir damit ich immer weiß wo ich das finde 😉

#Docker befehle

##Container bauen
ins verzeichnis gehen und
docker build .

##Container starten
docker run {containerid}
diese wird beim build am ende angezeigt

##Container verlinken
Beispiel MongoDB
docker run -p 27017:27017 dockerfile/mongodb
docker run -link mongodb:db {containerid}

##Laufende Container anzeigen
docker ps

##Ip alle container anzeigen
docker inspect $(docker ps -q) | grep IPA

##alle Container stoppen
docker stop $(docker ps -a -q)

##alle Container entfernen
docker rm $(docker ps -a -q)

##To only stop exited containers and delete only non-tagged images.:
docker ps –filter ’status=Exited‘ -a | xargs docker stop docker images –filter „dangling=true“ -q | xargs docker rmi

Docker Konfiguration Multi WebApps

Szenario:
Für alle WebApps liegt ein zentraler Core Code bereit den alle WebApps benötigen.

Jede App verfügt über ein eignes Frontend Theme und eine Config. Ebenso soll eine apache config zur Verfügung gestellt werden um die Domain zu verwalten. Die App soll nur über diesen Container gepflegt werden.

Eine WebApp soll zu jeder Zeit durch starten eines containers hinzugefügt werden können und durche stoppen des containers entfernt werden.

Zusätzlich müssen einige der WebApps auf mehreren Servern über ein loadbalancer verfügbar sein jedoch nicht alle. So soll WebApp A und B auf 10 Servern laufen WebApp Z jedoch nur auf einem.

Okay dieses Szenario hat es meiner Meinung nach ganz schön in sich .

Zu erst der Aufbau der Kern Docker Container.

PHP
Apache
Core Code
WebApp A
WebApp B
WebApp C

Was nun?

Mit diesem Beitrag lade ich Euch ein mit euren Kommentaren diesem Problem eine Lösung zu bieten.

Dockerfiles schreiben

Man man man docker ist total cool aber ich scheinbar zu dumm.
Was Docker ist wisst ihr ja schon, wenn nicht hier im Blog nachlesen. Auf jeden Fall besteht ein Dockerfile aus einer Auflistung von Befehle auf der Root Shell .

Will man jetzt einfach nur Eine debian wheezy Umgebung aufbauen gibt man einfach Docker Run -i -t debian:wheezy /bin/bash ein und schonn ist man drauf. Und kann Apt-get nutzten.

Damit läst sich ja alles mögliche installieren zum Beispiel Java apache tomcat PHP teamspeak und und und
Als schreibt man mit Run apt-get install java8 -y in das Docker File und beim nächsten Run des files hat wheezy Java 8 . Bei apache wird es schon komplizierter das ding überhaupt zu starten. Kommt jetzt noch tomcat dabei und eine Java application mit bestimmten configs und Co wir es echt unüberschaubar.

Es läuft .. aber es gefällt mir nicht…

Docker, rumspielen mit Containern

Diese Woche geht’s um Container, Java,  Tomcat, Jetty, Railo , lucee , Enterprise und Amazon.

Eine Enterprise Lösung soll mit docker in eine Testumgebung gebracht werden.

Die Grundlage bildet ein beliebiges Unix in meinem Fall centos oder wheezy (debian). Der erste Container beinhaltet Java 7 und bildet somit einen wichtigen Grundstein. Ich habe Java in einem eigenen Container damit ich diesen leichter verändern kann ohne die anderen Komponenten zu verändern.
                                                                  
Als nächster Container steht Tomcat, alternativ Jetty auf dem Plan. Diese werden furbdie Java compilierung benötigt.

Der dritte Container ist ein servlet für die jvm dies wird benötigt um coldfusion zu interpretieren. Hier kann noch das letzte stabile railo servlet genutzt werden oder schon der Nachfolger lucee verwendet werden.

Der vierte Baustein ist die Enterprise Lösung als application selbst.

Nun können die verschidenen Container wahlweise aufeinander aufbauen um meine Application auf jetty und tomcat zu testen kann ich natürlich auch zwei verschiedene Testsenarien aufbauen eben so die Verwendung von lucee und railo.

Natürlich kann ich auch noch weitere Java Container einrichten um zu sehen wie es mit Java 8 läuft.

Wenn alle Container eingerichtet sind und ich das Produktions System nachgebildet habe können die Tests der enterprise auch schon losgehen.

Durch das flexible tauschen der Container ist es problemlos möglich upgrades von wichtigen Komponenten schnell und einfach in einer testumgebung laufen zu lassen um zu prüfen ob die produktiv Systeme ein entsprechendes upgrade bekommen können.

Entsprechende Dockerfiles und eine Übersicht nützlicher Befehle werden in kürze folgen.

Docker und Amazon Container Service

Ein Wochenende voller WTF ist vorbei. Themen des Wochenendes waren Dicker, AWS und die blaue Wolke (Cloud) .

Zuerst hab ich viel Zeit verbracht mich intensiver mit Docker zu beschäftigen. Zu allererst Docker Registry: Man logt sich mit Hilfe des Befehls „docker login“ ein und kann nun seine Container ins docker hub schieben. Dazu benutzt man den Befehl „docker push myApp“. Und tada das repository wurde auf docker hub angelegt. Jetzt liegen dort als … Was genau.. die lokal gebauten Container. Blöd nur das zum Beispiel mein railo Container der eine Webseite birgt den Source Code von meinem lokalen Windows Platte gezogen hat. Dieser fehlt nun. Also kein Source Code im Container.

Was nun?

Lesen Lesen Lesen Lesen Lesen wtf Lesen Lesen ahhhh :

Automatisches build repository mit github. Fast schon perfekt. also auf github den Source Code des docker container gepushed. Siehe da alle Infos sind im docker hub inklusive der dockerfile. Was fehlt jetzt immer noch der Source Code. 2 Optionen habe ich nun ohne groß zu Überlegen. Entweder den Code mit in das repository … Pfui … Ein eigenes Repository. Besser, also Code pushen docker File anpassen docker pushen. Start build. Sehr gut so geht’s.

Aber nicht das was mir vorschwebte. Am Rande, ich hab es auch bis jetzt noch nicht erreicht. Ich möchte die Container in AWS laufen lassen über den ACS. Mein Quellcode soll nicht in einem public Repro liegen. Dockerfiles auch nicht. Also Setup für ein Closed Projekt.

Ein weiterer Test den ich gemacht habe war das Docker File aus dem automatmischen repository zu ziehen und den Code als Zipfile von aws S3. Zugriff des S3 nur auf aws Ebene. Wtf build fehlgeschlagen… wtf wo findet der build statt? Etwa Auf docker? -.-

Also nächstes Ziel vielleicht ec2 instance fürs docker. s3 als docker register Speicher. Privates repro des Codes auf github mit public key der ec2.

Die nächsten Tage werde ich wohl hier noch am richtigen Entwurf arbeiten. Sobald das passt geht’s an die API. Wer will schon immer klicken.

Trotzdem Erfolge.

Der Spass darf natürlich nicht fehlen. Also habe ich die ACS mit minecraft getestet. Docker gebaut gepushed eingetragen und tada. Erstmal je Runde daddeln. Config anpassen bungecore dazu packen und 10 Server anschmeißen. Gut 10 laufen manuelles anpassen der ips etc… Ne danke morgen vielleicht 🙂 aber nun kann ich auf 10 Servern zocken.

WTF