Docker ist einer der beliebtesten und bekanntesten Implementation von einer „containerized software“ welches eine Cross-Platform und skalierbare Umgebung zur Software Entwicklung bieten.
Warte… was ist „containerized software“?
Starten wir mit einem Beispiel. Sagen wir einmal deine Haupt-Entwicklungsmachine läuft auf Ubuntu und du möchtest eine eine simple Webseite erstellen. Natürlich kannst du auf dieser Maschine einen nativen Web-Server installieren aber dieser funktioniert dann nur auf dieser Maschine mit diesem Betriebssystem.
Container sind prinzipiell ein sehr reduziertes Betriebssystem auf dem nur das minimalste installiert ist, um die darin verwendete Software zum laufen zu bringen. Also in unserem Beispiel könnten wir einen NGINX Webserver in unserem container installieren mit dem wir dann unsere Webseite aufbauen.
Der Hauptvorteil hier ist, dass das ganze Docker Eco-System mit unterschiedlichen Betriebssystem kompatibel ist. Das heist deine im Linux entwickelte Webseite kann auch unter MacOS oder in einer Windows Maschine gestartet und weiterentwickelt werden.
Also geht es prinzipiell nur um Container?
Nicht ganz. Wir müssen noch klären was „images“ sind.
Wie vorhin schon beschrieben beinhaltet ein Container die Implementation deiner App mit allem drum herum fertig konfiguriert. Aber was ist wenn du noch eine weitere Webseite aufbauen willst?
Damit du nicht jedes mal immer von 0 anfange musst gibt es vordefinierte „images“ welche ein vor-konfiguriertes System zur Verfügung stellen in dem du dann nur mehr deinen Code hinzufügen müsst.
„Images“ können also sozusagen als Entwürfe für Container gesehen werden.
Alle verfügbaren offiziellen Images können hier gefunden werden: https://hub.docker.com/search?q=&type=image
Ich möchte meinen ersten eigenen Container erstellen!
Zuerst muss sichergestellt sein, dass die aktuellste Version von Docker installiert ist: https://docs.docker.com/get-docker/
Danach kann folgender Befehl in der CLI ausgeführt werden
docker run --name some-nginx -v /Users/kevin/dockertest:/usr/share/nginx/html:ro -d -p 8080:80 nginx
- docker: Docker CLI Befehl welcher allgemein zur Docker-Verwaltung in der CLI dient
- run: Erstelle einen neuen Container
- –name: Gib dem Container einen Namen
- some-nginx: Der Name
- -v: Verbinde einen lokalen Order mit einem Ordner im Container
- /Users/kevin/dockertest:/usr/share/nginx/html:ro
- /Users/kevin/dockertest: Der absolute Pfad auf dem Host-System der gemounted werden soll
- /usr/share/nginx/html: Der absolute Pfad im Container
- ro: read-only mode (Siehe hier)
- -d: Lass den Container außerhalb der aktuellen Shell laufen (Siehe hier)
- -p: Verbinde einen Host Port mit einem container internen port
- 8080: Der Port, der im Host-System verwendet wird
- 80: Der Port, der im Container-System verwendet wird
- nginx: Der Name des image auf dem der Container aufbaut
Bitte passe /Users/kevin/dockertest an deinen absoluten Pfad an
Falls du mit Linux oder MacOS arbeitest solltest du nun folgenden CLI Output sehen
-> % docker run --name some-nginx -v /Users/kevin/dockertest:/usr/share/nginx/html:ro -d -p 8080:80 nginx
1d7b787fcbe8d6ee71b9e09908a2027c48d5c4b6cd146eb26314a0dacf763f2a
Nun können wir eine index.html in unserem Ordner erstellen.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>It works!</title>
</head>
<body>
<h1>Hello!</h1>
</body>
</html>
Wenn wir nun folgende URL aufrufen http://localhost:8080 sollten wir folgenden Output sehen.
Du kannst nun ebenso alle laufenden Docker Container im Docker Dashboard (sollte mit Docker mitinstalliert worden sein) sehen oder über folgenden Befehl in der CLI:
-> % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6ee6e327100 nginx "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 0.0.0.0:8080->80/tcp some-nginx
Hier sehen wir also einen benannten Container some-nginx welcher vor 12 Minuten erstellt wurde und ein Port Mapping vom Host-Port 8080 auf den Container-Port 80 aktiv hat.
Weitere nützliche CLI Befehler
- docker images: Zeige alle installierten Images
- docker rmi %image-name%: Lösche ein definiertes Image
- docker pull %image-name%: Aktualisiere ein Image auf die aktuellste Version
- docker ps: Zeige alle aktiven Container
- docker ps -a: Zeige alle Container (auch gestoppte)
- docker rm %container-name%: Entferne einen speziellen container