Die Soft­ware­ent­wick­lung ist dyna­misch und ent­wi­ckelt sich stän­dig wei­ter. Moderne Lösun­gen sind gefragt, um auf­kom­men­den Her­aus­for­de­run­gen zu begeg­nen. Eine sol­che Lösung ist Docker – eine Open-Source Tech­no­lo­gie, die zur Con­tai­ne­ri­sie­rung von Anwen­dun­gen ein­ge­setzt wird. Einige Anwen­dungs­ge­biete sind zum Beispiel:

  • CI/CD-Pipe­lines: Docker kann die Kon­sis­tenz in Con­ti­nuous Inte­gra­tion und Con­ti­nuous Deploy­ment (CI/CD) Pro­zes­sen gewähr­leis­ten. Jeder Build läuft in einem sau­be­ren, iso­lier­ten Con­tai­ner und nicht in einer poten­zi­ell kon­ta­mi­nier­ten oder inkon­sis­ten­ten Umgebung.
  • Micro­ser­vices: Docker ist ideal für eine Micro­ser­vices-Archi­tek­tur, da jeder Micro­ser­vice in einem sepa­ra­ten Con­tai­ner lau­fen kann. Dies erleich­tert die Ska­lie­rung, Aktua­li­sie­rung und Iso­lie­rung ein­zel­ner Services.
  • Test­au­to­ma­ti­sie­rung: Docker kann dazu ver­wen­det wer­den, Test­um­ge­bun­gen auf­zu­bauen. Ein Test kann in einem Con­tai­ner aus­ge­führt wer­den, der genau die Pro­duk­ti­ons­um­ge­bung repli­ziert. Damit wird sicher­ge­stellt, dass Tests unter den glei­chen Bedin­gun­gen durch­ge­führt werden.
  • Anwen­dungs­iso­lie­rung: Docker ermög­licht es, meh­rere Anwen­dun­gen auf einem ein­zi­gen Sys­tem zu betrei­ben, ohne dass sich diese gegen­sei­tig beein­flus­sen. Jeder Con­tai­ner läuft iso­liert und hat seine eige­nen Pro­zesse, Netz­werke und Dateisysteme.
  • Soft­ware-Ver­tei­lung: Docker kann ver­wen­det wer­den, um Soft­ware und ihre Abhän­gig­kei­ten zu ver­pa­cken. Dies erleich­tert den Aus­lie­fe­rungs­pro­zess, da die End­be­nut­zer ledig­lich das Image her­un­ter­la­den und star­ten müs­sen, ohne sich Gedan­ken über die Instal­la­tion von Abhän­gig­kei­ten machen zu müssen.

Im Fol­gen­den füh­ren wir prak­tisch in einige grund­le­gende Kon­zepte von Docker ein und betrach­ten im Anschluss einen bei­spiel­haf­ten Anwendungsfall.

Ein­füh­rung 

Docker besteht seit 2013 und ist eine revo­lu­tio­näre Tech­no­lo­gie, die es erlaubt, Anwen­dun­gen in iso­lier­ten Con­tai­ner-Umge­bun­gen zu betrei­ben. Diese Con­tai­ner beinhal­ten alle benö­tig­ten Res­sour­cen, sodass sicher­ge­stellt ist, dass die Anwen­dung in jeder Umge­bung rei­bungs­los läuft – unab­hän­gig von den spe­zi­fi­schen Ein­stel­lun­gen des zugrun­de­lie­gen­den Systems.

Veranschaulichung der Isolation von Containern.
Abbil­dung 1: Ver­an­schau­li­chung der Iso­la­tion von Containern.

Zwei wesent­li­che Kon­zepte von Docker sind Images und Con­tai­ner.

Ein Image ist eine schreib­ge­schütz­tes Arte­fakt mit Anwei­sun­gen zur Erstel­lung eines Con­tai­ners. Es beinhal­tet alle nöti­gen Infor­ma­tio­nen wie Betriebs­sys­tem, Soft­ware, Anwen­dungs­codes und Umge­bungs­ein­stel­lun­gen, um eine Anwen­dung aus­zu­füh­ren. Images wer­den erstellt durch Docker­files, wel­che eine Docker-eigene Pro­gram­mier­spra­che nut­zen, um die Con­tai­ner zu defi­nie­ren und Code inner­halb des Con­tai­ners zur Bau­zeit auszuführen. 

Ein Con­tai­ner hin­ge­gen ist die Lauf­zeit­in­stanz eines Images. Ein Con­tai­ner ist im Grunde die aus­führ­bare Ver­sion des Images, das heißt, es wird gestar­tet (oder „läuft“), wenn das Image aus­ge­führt wird. Jeder Con­tai­ner hat seine eigene iso­lierte Umge­bung und läuft unab­hän­gig von ande­ren Con­tai­nern, selbst wenn sie vom glei­chen Image erstellt wurden.

Veranschaulichung von Dockerfile, Image und Container.
Abbil­dung 2: Ver­an­schau­li­chung von Docker­file, Image und Container.

Das erste Image – der erste Container

Zunächst muss Docker auf dem Sys­tem instal­liert sein, was in der offi­zi­el­len Docker Doku­men­ta­tion für Linux, Win­dows und Mac im Detail beschrie­ben ist.

Nun wol­len wir, basie­rend auf einem Docker­file, ein Image bauen und anschlie­ßend einen Con­tai­ner mit die­sem Image star­ten. Das Docker­file könnte fol­gen­der­ma­ßen aussehen:

# Nutzen des offiziellen Python Images als Basis
FROM python:3.8

# Setzen des Arbeitsverzeichnisses im Docker-Container
WORKDIR /app

# Installieren von Jupyter
RUN pip install jupyter

# Exposen des Ports 8888 für den Zugang zum Jupyter Notebook
EXPOSE 8888

# Starten des Jupyter Notebooks beim Start des Containers
CMD ["jupyter", "notebook", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"]

Das Image kön­nen wir nun mit

docker build -t my_jupyter_image PATH/TO/DOCKERFILE

bauen und schließ­lich den Con­tai­ner mit

docker run -p 8888:8888 my_jupyter_image

star­ten. Da der Port 8888 expo­sed ist, kön­nen wir einen Brow­ser öff­nen und über „localhost:8888“ bzw. „127.0.0.1:8888“ auf Jupy­ter im Con­tai­ner zugrei­fen und es verwenden!

Diese Anlei­tung zeigt ein ers­tes Bei­spiel. Es wäre jetzt z.B. auch mög­lich einen bestimm­ten Ord­ner als Volume in den Con­tai­ner zu moun­ten. Außer­dem gibt es für Jupy­ter auch bereits vor-kon­fi­gu­rierte Images auf Docker­hub (einer öffent­li­chen Regis­try für Docker-Images).

Ein prak­ti­scher Anwen­dungs­fall: Microservices-Architektur

Ein bei­spiel­haf­ter Ein­satz­be­reich von Docker ist die Unter­stüt­zung einer Micro­ser­vices-Archi­tek­tur. Ange­nom­men, ein Unter­neh­men betreibt eine kom­plexe Web­an­wen­dung, die aus meh­re­ren klei­ne­ren Diens­ten besteht – den soge­nann­ten Micro­ser­vices. Jeder die­ser Dienste hat eine spe­zi­fi­sche Auf­gabe, bei­spiels­weise das Nut­zer­ma­nage­ment, die Bestell­ver­wal­tung oder das Bezahlwesen.

In einer tra­di­tio­nel­len Umge­bung würde ein Update eines die­ser Dienste oft eine umfang­rei­che Abstim­mung und mög­li­cher­weise sogar eine Down­time für die gesamte Anwen­dung erfor­dern. Mit Micro­ser­vices oder eben Docker ändert sich das: Jeder Micro­ser­vice kann in einem eige­nen Docker-Con­tai­ner ver­packt (con­tai­ne­ri­siert) werden.

Abbil­dung 3: Bei­spiel­hafte Anwen­dung, bestehend aus meh­re­ren Micro­ser­vices in sepa­rier­ten Containern.

Das ist in Abbil­dung 3 ver­an­schau­licht. Jeder Micro­ser­vice läuft in sei­nem eige­nen Docker-Con­tai­ner, der unab­hän­gig ska­liert, gebaut, deployed, aktua­li­siert und debug­ged wer­den kann. Jeder Con­tai­ner wie­derum basiert auf einem eige­nem Image (und Docker­file), sodass auch hier eine Iso­la­tion der ein­zel­nen Micro­ser­vices vorliegt.

Vor­teile durch Docker

Durch den Ein­satz von Docker erge­ben sich in unse­rem Bei­spiel meh­rere Vorteile:

  1. Rei­bungs­lose Updates: Da jeder Dienst in einem sepa­ra­ten Con­tai­ner läuft, kann er unab­hän­gig von den ande­ren aktua­li­siert wer­den. Dies mini­miert das Risiko, dass ein Update den Betrieb der gesam­ten Anwen­dung stört.
  2. Ska­lier­bar­keit: Docker-Con­tai­ner sind leicht­ge­wich­tig und benö­ti­gen nur die Res­sour­cen der Anwen­dung selbst. Dadurch kön­nen pro­blem­los mehr Instan­zen eines bestimm­ten Diens­tes gestar­tet wer­den, wenn die Nach­frage steigt.
  3. Sicher­heit: Ein wei­te­rer Vor­teil von Docker ist die Iso­la­tion. Selbst wenn ein Con­tai­ner kom­pro­mit­tiert wird, bleibt der Scha­den auf die­sen Con­tai­ner begrenzt, da er von den ande­ren Con­tai­nern getrennt ist.
  4. Effi­zi­enz in der Ent­wick­lung: Ent­wick­ler kön­nen die glei­chen Docker-Con­tai­ner auf ihren loka­len Maschi­nen, auf Entwicklungs‑, Test- oder Pro­duk­ti­ons­um­ge­bun­gen lau­fen las­sen. Das ver­ein­facht den Test­pro­zess und eli­mi­niert Pro­bleme à la „Es hat auf mei­nem Rech­ner funk­tio­niert“. Außer­dem sind Auto­ma­tis­men (z.B. Tests) auf­grund die­ser Repro­du­zier­bar­keit ein­fa­cher in Pipe­lines integrierbar.

Fazit

Docker ist eine äußerst nütz­li­che Tech­no­lo­gie, die den Pro­zess der Soft­ware­ent­wick­lung und ‑bereit­stel­lung erheb­lich ver­ein­facht. Durch die Mög­lich­keit der Con­tai­ne­ri­sie­rung eröff­net Docker neue Wege, effi­zi­ent und ska­lier­bar zu arbei­ten, Sicher­heits­ri­si­ken zu mini­mie­ren und eine gleich­blei­bende Qua­li­tät ihrer Anwen­dun­gen zu gewährleisten.

Dar­über hin­aus bil­det Docker die Grund­lage für viele moderne Tech­no­lo­gien, Tools und Frame­works. Tech­no­lo­gien wie Kuber­netes, die das Orches­trie­ren von Con­tai­nern in gro­ßem Maß­stab ermög­li­chen und Kon­zepte wie Cloud-native Ent­wick­lung, die die Ska­lier­bar­keit und Agi­li­tät von Anwen­dun­gen ver­bes­sern, sind auf Docker auf­ge­baut und nut­zen seine Mög­lich­kei­ten zur Containerisierung.

Unab­hän­gig von der Art der zu ent­wi­ckeln­den Soft­ware oder den spe­zi­fi­schen Anfor­de­run­gen eines Pro­jekts, bie­tet Docker eine robuste und fle­xi­ble Lösung, die dazu bei­trägt, die Bereit­stel­lung und das Manage­ment von Anwen­dun­gen zu optimieren.

Seit sei­ner Ein­füh­rung im Jahr 2013 hat Docker kon­ti­nu­ier­lich an Popu­la­ri­tät gewon­nen und ist heute ein unver­zicht­ba­res Werk­zeug in der moder­nen Soft­ware­ent­wick­lung und ‑betrieb. Mit sei­ner Hilfe kön­nen Ent­wick­ler und Betriebs­teams bes­ser zusam­men­ar­bei­ten, was letzt­lich zu hoch­wer­ti­ge­ren Pro­duk­ten führt.

Lesen Sie  hier mehr über Lösun­gen im Bereich Cloud Ena­blem­ent oder besu­chen Sie eines unse­rer kos­ten­lo­sen Web­i­nare.