Skip to main content

Docker – einfache Beispiel-Container

Hier zeige ich euch beispielhaft einige einfache Container und erkläre kurz die Funktionen.

1. Container mit apache und php

Erstellen Sie im ersten Schritt einen neuen Ordner und wechseln in diesen.

mkdir docker-apache
cd docker-apache

Nun erstellen wir eine php Datei, welche unser Webserver später anzeigen soll. Dazu öffnet ihr den Editor nano und gebt folgendes ein.

nano index.php

Dort gebt ihr folgendes ein:
<!DOCTYPE html>
<html>
<head>
  <title>Hallo Docker</title>
</head>
<body>
<h1>Mein erster Container</h1>
<?php
  $load = sys_getloadavg();
?>
  Serverzeit: <?php echo date("c"); ?><br />
  Serverauslastung (load): <?php echo $load[0]; ?>
</body>
</html>

Nun erstellen wir ein Dockerfile. In dieser Datei sagen wir Docker, was wir tun wollen.

nano Dockerfile

Dort gebt ihr folgendes ein:
FROM php:7-apache
ENV TZ="Europe/Berlin"
COPY index.php /var/www/html

Erklärung:

  • FROM: gibt das Image an, auf dem später unser Server laufen soll. Die Images werden alle von Docker Hub geladen.
  • ENV: Dort legen wir Umgebungsvariablen fest. Hier unsere Zeitzone.
  • COPY: Mit diesem Befehl kopieren wir die Datei index.php in unseren Container.

Nun müssen wir den Container nur noch starten. Dazu gebt ihr folgendes ein:

docker build -t mein-erster-container .

Erklärung:

Der Befehl dient dazu einen Docker Container anhand unseres Dockerfiles zu erstellen. Der Parameter "-t" versieht den Container mit einem Tag. Das erleichtert uns später das Starten. Der Punkt "." am Ende muss gesetzt werden.

Jetzt müssen wir unseren eben erstellen Container nur noch starten. Dazu gebt ihr folgendes ein:

docker run -p 8080:80 mein-erster-container

Erklärung:

Der Befehl "run" startet den Container "mein-erster-container". Der Parameter "-p 8080:80" dient dazu, den Container von außen auf dem Port 8080 erreichbar zu machen. Innerhalb des Containers läuft der Apache Server jedoch auf Port 80. Dies hat für uns hier den Vorteil, dass auf unserem Server noch ein anderer Webserver laufen kann, ohne dass es beim Port-Mapping zu Fehlern kommt.

Wenn ihr jetzt auf eure Homepage und dem Port 8080 (zum Beispiel: www.meinehomepage.de:8080) geht, sollte es so aussehen:

Um den Container zu beenden drückt ihr einfach „STRG+C“ auf der Tastatur.

2. Container mit MySQL Datenbank MariaDB

In diesem Beispiel wollen wir einen Container mit MariaDB erstellen. Diesen gibt es zum Glück schon komplett fertig im Docker Hub. Daher müssen wir diesen nur Starten.

docker run -d --name mariadb-1 --env MYSQL_ROOT_PASSWORD=geheim123 mariadb

Erklärung

  • d: Der Container wird im Hintergrund gestartet
  • name: Wir geben dem Container den Namen „mariadb-1“
  • env: Hier geben wir unser MySQL-Root-Passwort per Umgebungsvariable mit
  • mariadb: Dies ist das Image, welches sich Docker runterlädt

Nun läuft der Container im Hintergrund. Mittels folgendem Befehl könnt ihr dies überprüfen:

docker ps

2.1 Befehle im Container ausführen

Nun ist es euch Möglich Befehle im Container auszuführen. Dazu gebt ihr folgendes ein:

docker exec -it mariadb-1 /bin/bash

Nun könnt ihr auf der Console Befehle innerhalb des Containers ausführen.

Ihr könnt auch mittels der Container ID auf den Container zugreifen (anstatt des Namens). Dies seht ihr hier.

2.2 MariaDB Client aufrufen

Ihr könnt euch auch ganz normal per Console bei MariaDB anmelden. Dazu gebt ihr folgendes ein:

docker exec -it mariadb-1 mysql -u root -p

2.3 Container beenden

Wie ihr sicher festgestellt habt, könnt ihr diesen Container nicht einfach per „STRG+C“ beenden, wie es im ersten Beispiel der Fall war. Hier müsst ihr folgenden Befehl eingeben:

docker stop mariadb-1

Überprüfen könnt ihr es mit folgendem Befehl:

docker ps

2.4 Logdateien des Containers anzeigen

Da der Container im Hintergrund läuft, wird in der Konsole keine Ausgabe angezeigt. Mit diesem Befehl könnt ihr euch alle Logs des Containers anschauen.

docker logs mariadb-1

2.5 Container löschen

Wenn wir unseren Container löschen möchten, so müssen wir nur folgenden Befehl eingeben:

docker rm mariadb-1

2.6 Volume löschen

Neben dem Container wird noch ein Volume erstellt. Das Volume beinhaltet in unserem Fall alle Einträge der Datenbank. Daher wird es nicht direkt mit dem Container gelöscht. Dies müsst ihr noch selbst tun. Mit folgendem Befehl könnt ihr euch alle Volumes anzeigen lassen:

docker volume ls

Mit nachfolgendem Befehl werden ALLE Volumes gelöscht, welche momentan nicht in einen Container eingebunden sind:

docker volume prune

Ihr könnt aber auch ein spezielles Volume mit folgendem Befehl löschen:

docker volume rm <Volume Name>

Als Schutz, dass ihr nicht versehentlich ein Volume löscht, welches noch zu einem Container gehört, verweigert Docker hier das Löschen.

2.7 Eigene Volume Verzeichnisse anlegen

2.7.1 Woher weiß ich, welche Verzeichnisse ich mounten muss?

Mit folgendem Befehl könnt ihr in den ursprünglichen MariaDB Container schauen und da sieht man es.

docker inspect mariadb-1

2.7.2 Volumes mounten

Die Container werden ja regelmäßig gelöscht, wenn ihr beispielsweise eine neue Version installiert. Die Daten der Datenbank sollen jedoch immer erhalten bleiben. Daher kann es sinnvoll sein, Docker den kompletten Pfad zum Verzeichnis mitzugeben. Dies hat den Vorteil, dass ihr dieses Verzeichnis immer weiternutzten könnt, wenn ihr beispielsweise nach einem Update einen neuen Container erstellt.

#Verzeichnis erstellen in eurem Homeverzeichnis
mkdir /home/<euerName>/mariadb-2

docker run -d --name mariadb-2 --env MYSQL_ROOT_PASSWORD=geheim123 --volume /home/<euerName>/mariadb-2/:/var/lib/mysql mariadb

Erklärung:

  • volume: Gibt das Verzeichnis an, welches eingebunden werden und den Ort innerhalb des Containers

Dies können wir nun mittels nachfolgendem Befehl überprüfen.

docker inspect mariadb-2

3. Zwei Container sollen mittels Netzwerk miteinander kommunizieren

In diesem Beispiel sollen zwei Container (MariaDB, phpmyadmin) miteinander kommunizieren. Ein Netzwerk lässt sich mittels Docker mit folgendem Befehl aufbauen. Es soll „lan-intern“ heißen.

docker network create lan-intern

Nun müssen wir unserem MariaDB Container dieses Netzwerk noch mitgeben.

#Verzeichnis für das Volume anlegen
mkdir /home/<euerName>/mariadb-3

docker run -d --name mariadb-3 --network lan-intern --env MYSQL_ROOT_PASSWORD=geheim123 --volume /home/<euerName>/mariadb-3/:/var/lib/mysql mariadb

Als nächstes starten wir phymyadmin als Container. Auch hier gibts bereits ein fertiges Image.

docker run -d --name padmin -p 8081:80 --network lan-intern --env PMA_HOST=mariadb-3 phpmyadmin/phpmyadmin

Erklärung:

  • network: Gibt dem Container das Netzwerk mit.
  • env PMA_Host: Hier wird der MySQL Server angeben. Woher weiß man das? Es steht in der Doku des Containers hier.

Wenn ihr jetzt auf eure Homepage und den Port 8081 geht, solltet ihr folgendes sehen:

Einloggen tut ihr euch mit folgenden Daten, die wir zuvor festgelegt hatten.

  • Benutzername: root
  • Passwort: geheim123

4. WordPress installieren

In den vorherigen Schritten haben wir einen MySQL Container erstellt sowie einen mit phpmyadmin. Nun wollen wir dazu noch einen mit WordPress erstellen. Auch hier werden mittels des Netzwerks Daten ausgetauscht.

#Volume für WordPress anlegen
mkdir /home/<euerName>/wordpress

#Wordpress Container erstellen
docker run -d --name wp --network lan-intern --volume /home/<euerName>/wordpress:/var/www/html -p 8082:80 --env WORDPRESS_DB_PASSWORD=geheim123 --env WORDPRESS_DB_HOST=mariadb-3 wordpress

Nun rufen wir unser WordPress über den Port 8082 auf.

So schnell habt ihr WordPress installiert und könnt direkt damit arbeiten.

Teile diesen Beitrag
Christian

Christian

Ich studiere derzeit Informatik und betreibe in meiner Freizeit diesen Blog. Auf die Idee kam ich, als ich Anleitungen zum Thema Debian gesucht habe. Leider waren viele Anleitungen veraltet und daher nutzlos. Da kam ich auf die Idee selbst Anleitungen zu schreiben. Wenn meine Anleitungen auch veraltet sein sollten, dann schreibt mir das bitte und ich versuche sie zu aktualisieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.