2. Erste Beispiele

Wir wollen ein Gefühl für die Docker-Technik bekommen - „Learning by Doing

Fertige „Hello World“ Beispiele (inkl. Dockerfile Nutzungen) nach „Öggl/Kofler“ (siehe Literatur)

Tipp

Anm.: möglichst erst später im Seminar - wir wollen uns herantasten

  • apache2/php

  • node.js

  • python

Hier beispielhaftes Dockerfile für das Hello-World apache2/php Image:

Dockerfile apache2/php
1
2
3
FROM php:7-apache
ENV TZ="Europe/Amsterdam"
COPY index.php /var/www/html

Mehr dazu aber - wie bereits gesagt - erst später!

2.1. Beispiel Hello World!

Kein Seminar oder Scripting ohne ein „Hello World!“ Beispiel!

Erste Aufrufe also:

1
2
3
docker run hello-World
docker ps -a
docker images

2.2. Basis-Images

Beispielhafte Suche nach offiziellen Basis-Images: Docker Hub - Offizielle Basis Images

z.B. Ubuntu https://hub.docker.com/_/ubuntu

also:

docker run -it ubuntu

Bestehende Container nutzen:

docker start -i <name>  (oder die ID)

Anm.: bei Namen funzt Completion

Besser beim Erstellen der Container auf Namen achten: (hier für Container und Docker-„Maschine“)

docker run -it --name meinubuntu -h meinubuntuhostname ubuntu

Gleichzeitiges Ausführen von Kommando in laufendem Container:

docker exec -it meinubuntu /usr/bin/top

2.3. Beispiel MariaDB

Das Image stellt mit dem MariaDB-Service einen Background Prozesse zur Verfügung! Anm./Erinnerung: Container ohne Prozess(e) wird gleich wieder beendet! (siehe: hello-world)

docker run -d --name mariadb-test1 -e MYSQL_ROOT_PASSWORD=geheim mariadb

Stoppen eines Containers:

docker stop mariadb-test1

Containerinfos auslesen:

docker inspect maria-db-test1

Beachten: MariaDB Datenbank Verzeichnis /var/lib/mysql liegt im Docker-Container!

docker inspect maria-db-test1 | less

und die Zeilen mit Mounts analysieren.

Die Datenbank (wenn diese läuft) mit MySQL/MariDB-Client checken:

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

Den Container analysieren:

docker exec -it mariadb-test1 /bin/bash
# Aufrufe:
cat /etc/os-release
ps ax
mysqld --version
exit

Das Logging übernimmt Docker für den Hintergrund-Daemon Mysqld:

docker logs mariadb-test1

Jetzt erweitern wir das Beispiel mit eigenem Volume im Userdir Home:

mkdir /home/joeb/varlibmysql     # manuelles mkdir (ggf.) nicht nötig!
docker run -d --name mariadb-test2 \
    -e MYSQL_ROOT_PASSWORD=geheim \
    -v /home/joeb/varlibmysql/:/var/lib/mysql  mariadb

So jetzt haben wir einen neuen Container mariadb-test2 mit den DB-Dateien im Homedir eines Users.

Hinweis

Diese Umleitung für Volumes kann bei Nicht-Linuxen problematisch sein!

Jetzt noch ein Container - hier mit Portumleitungen:

docker run -d --name mariadb-test3 \
    -v /home/joeb/varlibmysql/:/var/lib/mysql \
    -p 13306:3306 mariadb

Und jetzt klappt der Zugriff auch direkt über den Docker-Host:

mysql -u root -p --port 13306 --protocol=tcp

2.4. Beispiel Networking

Mit Ports kann man also (in)direkt auf die Dockerdienste / Dockerprozesse zurgreifen. Besser ist es allerdings mit eigenen Dockernetzwerk die nötigen Container zu verbinden.

Anm.: bitte (immer) vorher alle beteiligten „MariaDB-Container“ stoppen.

Neues Netzwerk erstellen und und neuen MariaDB-Container mit PhpMyAdmin nutzen:

docker network create test-net
docker run -d --name mariadb-test4 \
    -v /home/joeb/varlibmysql/:/var/lib/mysql \
    --network test-net mariadb
docker run -d --name pma -p 8080:80 \
    -e PMA_HOST=mariadb-test4 \
    --network test-net phpmyadmin/phpmyadmin

Anm.: beim letzten Aufruf ist der volle Name für das PhpMyAdmin-Image zu beachten.

Siehe: PhpMyAdmin Image auf Docker Hub

Docker-Netzwerke erledigen selbstständig die Namensauflösungen! Aber: es werden die mit der Option -- name erstellten Bezeichner verwendet.

2.5. Beispiele WordPress

Vor der Bereitstellung von WordPress benötigen wir eine MySQL/MariaDB-Docker-Instanz und ein passendes Dockernetzwerk.

Infos zum Wordpress Image siehe: Wordpress Image auf Docker Hub

Auf dem Docker Hub Portal zu Wordpress finden sich auch die Erläuterungen für die speziellen WordPress Umgebungsvariablen (siehe Parameter -e).

Hier die vollständigen Konfigurationen…

Lokale Verzeichnisse für DB und WordPress-Website: (Anm.: ich habe gerne ein Hauptverzeichnis für die Docker-Dirs, die Unterverzeichnisse würde Docker heute auch selber anlegen!)

mkdir -p /home/joeb/docker/varlibmysql
mkdir /home/joeb/docker/wp-html

Test-Netzwerk:

docker network create test-net
docker network list

DB MariaDB bereitstellen: (bei Tests auf Name –name achten - Nummerierungen)

docker run -d --name mariadb-test5 \
    -e MYSQL_ROOT_PASSWORD=geheim --network test-net \
    -v /home/joeb/docker/varlibmysql/:/var/lib/mysql  mariadb

Und jetzt noch WordPress:

docker run -d --name wp-test1 --network test-net \
    -v /home/joeb/docker/wp-html:/var/www/html -p 8081:80 \
    -e WORDPRESS_DB_PASSWORD=geheim \
    -e WORDPRESS_DB_HOST=mariadb-test5 wordpress

Und natürlich lässt sich auch der PhpMyadmin Zugriff bereitstellen:

docker run -d --name pma -p 8080:80 \
    --network test-net -e PMA_HOST=mariadb-test5 phpmyadmin/phpmyadmin

Hinweis

Bitte immer auf die Ports achten!

Soweit ein kleiner Überblick mit praktischen Beispielen.

2.6. Vertrauenswürdige Images

Wir nutzen bisher einfach öffentliche Images aus möglichst offiziellen Quellen.

Wie sieht es aber mit echt vertrauenswürdigen Images aus?

Eigenes Basis-Image

Wir erstellen/installieren ein Template-System und erstellen hieraus einen Tarball.

Dieses lässt sich dann auf dem Docker-Host wieder Importieren.

Image-Erzeugung per Skript

Beispiel: YUM-Based mit Skript online

Images from Scratch

Siehe Docker Registry: Offizielles Image Scratch

SUSE/SLES sle2docker

Auf Ruby basierendes spezielles Tool mit speziellen Registries für Suse-Plattformen.

2.7. Faktoren für Security

Ganz wichtige aber eben auch ganz dicke Bretter…

  • AppArmor (Application Armor)

  • SELinux (Security Enhanced Linux) - wollen wir für Test auf permissive

    Status ermitteln mit: sestatus oder ls -Z (bei CentOS; bei Debian, openSUSE sollte SELinux deaktiv sein)

    (Auszug/Zeile:) Current Mode: enforcing

    Ausschalten mit setenforce 0

    Dauerhafte Konfiguration in /etc/sysconfig/selinux

  • Netfilter/iptables (bzw. Dienste firewalld, ufw)

    Anm.: auch immer mal verantwortlich bei vermeintlichen Docker Technik Problemen!