Eine Docker-Umgebung bietet viele Vorteile, aber mit zunehmender Anzahl von Containern empfiehlt es sich, die Umgebungen auf eine zentrale Datenbankumgebung zu migrieren, anderenfalls hat man x verschiedene Datenbankcontainer für unterschiedliche Software. Es ist möglich einen zentralen Container für PostgreSQL und MariaDB zu erstellen. Viele Container bieten die Möglichkeit den Host, den Benutzer, das Passwort und die Datenbank anzugeben.
1. Grundvoraussetzung
- Docker & Docker Compose v2 (Debian / Ubuntu )
- Traefik V3 Installation, Konfiguration und CrowdSec-Security
2. Verzeichnisse anlegen und Berechtigungen setzen
Wir erstellen als erstes ein Verzeichniss datenbank_container und wechsel in jenes, dort werden weitere Ordner angelegt
mkdir -p /opt/containers/datenbank_container && cd /opt/containers/datenbank_container/ mkdir -p compose data/{mariadb,postgresql,pgadmin,phpmyadmin} chown -R 5050:0 data/pgadmin chown -R 70:0 data/postgresql chown -R 999:101 data/mariadb
3. Anlegen und bearbeiten der Dateien
Um mit dem Stack fortzufahren erstellen wir noch einige Dateien, dazu nutzen wir folgenden Befehl
touch docker-compose.yml .env touch compose/{.mariadb.env,.postgresql.env,.pgadmin.env,.pma.env}
3.1 DOTENV anpassen
In diesem Schritt passen wir alle .env – Dateien an
3.1.1 Anpassen der allgemeinen .env Datei
Bearbeiten wir nun die Allgemeine .env Datei mit folgendem Befehl
nano /opt/containers/datenbank_container/.env
COMPOSE_PROJECT_NAME=datenbanken ABSOLUTE_PATH=/opt/containers/datenbank_container/
3.1.2 Anpassen der .env Datei von mariaDB und PHPmyadmin
Passen wir als erstes passen wir die Dateien für mariaDB und PHPmyadmin an
3.1.2.1 .env für mariaDB
Anpassen der mariaDB .env
nano /opt/containers/datenbank_container/compose/.mariadb.env
MYSQL_ROOT_PASSWORD=deinstarkesrootpassword
3.1.2.2 .env für PHPmyadmin
Anpassen der PHPmyadmin .env:
nano /opt/containers/datenbank_container/compose/.pma.env
PMA_HOST=db-mariadb #PMA_ABSOLUTE_URI=https://domain.de
Bei Probleme mit PHPmyadmin bitte in der .pma.env die Zeile 2 auskommentieren und die Domain dementsprechend anpassen
3.1.3 Anpassen der postgresql und pgadmin .env Datei
Nun passen wir die .env Dateien für postgresql und pgadmin
3.1.3.1 .env für postgresql
Anpassen der postgresql.env:
nano /opt/containers/datenbank_container/compose/.postgresql.env
POSTGRES_PASSWORD=deinsichereskennwort POSTGRES_HOST_AUTH_METHOD=trust
3.1.3.2 .env für PGadmin
Nun kommen wir zur .env Datei von PGadmin
nano /opt/containers/datenbank_container/compose/.pgadmin.env
PGADMIN_DEFAULT_EMAIL=deine@email.de ##bitte anpassen PGADMIN_DEFAULT_PASSWORD=deinkennwort ##bitte anpassen PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION=True PGADMIN_CONFIG_CONSOLE_LOG_LEVEL=10
Tief durchatmen, Tee oder Kaffee trinken, wenn nötig.
Wenn du jetzt so weit bist, kommen wir zum eigentlichen Teil.
4. Docker Compose Datei anpassen
Kommen wir zum letzten Teil der Anleitung, dem Erstellen und Starten der Services. Mit dem folgenden Befehl öffnen wir die Datei docker-compose.yml und editieren sie:
nano /opt/containers/datenbank_container/docker-compose.yml
services: ### Datenbank Server ### db-mariadb: image: mariadb:lts restart: always container_name: db-mariadb hostname: db-mariadb env_file: ${ABSOLUTE_PATH}/compose/.mariadb.env networks: - db-net volumes: - ${ABSOLUTE_PATH}/data/mariadb:/var/lib/mysql db-postgresql: container_name: db-postgresql hostname: db-postgresql image: postgres:16-alpine env_file: ${ABSOLUTE_PATH}/compose/.postgresql.env restart: always volumes: - ${ABSOLUTE_PATH}/data/postgresql:/var/lib/postgresql/data networks: - db-net ### Verwaltung ### ui-pgadmin: restart: always image: dpage/pgadmin4 hostname: ui-pgadmin container_name: ui-pgadmin env_file: ${ABSOLUTE_PATH}/compose/.pgadmin.env labels: - "traefik.enable=true" - "traefik.http.routers.pga-rtr-ui.rule=Host(`domain.de`)" - "traefik.http.routers.pga-rtr-ui.entrypoints=websecure" - "traefik.http.routers.pga-rtr-ui.tls=true" - "traefik.http.routers.pga-rtr-ui.tls.certresolver=tls_resolver" - "traefik.http.routers.pga-rtr-ui.service=pga-svc-ui" - "traefik.http.services.pga-svc-ui.loadBalancer.server.port=80" - "traefik.http.routers.pga-rtr-ui.middlewares=default@file" volumes: - ${ABSOLUTE_PATH}/data/pgadmin:/var/lib/pgadmin networks: - db-net - proxy ui-phpmyadmin: image: phpmyadmin restart: always container_name: ui-phpmyadmin hostname: ui-phpmyadmin env_file: ${ABSOLUTE_PATH}/compose/.pma.env labels: - "traefik.enable=true" - "traefik.http.routers.pma-rtr-ui.rule=Host(`domain.de`)" - "traefik.http.routers.pma-rtr-ui.entrypoints=websecure" - "traefik.http.routers.pma-rtr-ui.tls=true" - "traefik.http.routers.pma-rtr-ui.tls.certresolver=tls_resolver" - "traefik.http.routers.pma-rtr-ui.service=pma-svc-ui" - "traefik.http.services.pma-svc-ui.loadBalancer.server.port=80" - "traefik.http.routers.pma-rtr-ui.middlewares=default@file" volumes: - ${ABSOLUTE_PATH}/data/phpmyadmin/:/sessions:rw networks: - db-net - proxy networks: proxy: external: true db-net: external: true
Anpassungen deinerseits
1. ersetze jeweils domain.de durch deine Wunschdomain
2. passe ggf. die Routernamen an
Das Netzwerk “db-net” sollte im Normalfall automatisch angelegt werden sollte dies nicht der Fall sein kann dies mit folgendem Befehl getan werden. Das Subnet ist freiwählbar.
docker network create db-net --subnet=10.10.0.0/16
5. Starten der Containerpaare
Man kann nun wählen, ob man alle 4 Container starten möchte oder nur 2 der 4:
docker compose up -d db-mariadb ui-phpmyadmin
docker compose up -d db-postgresql ui-pgadmin
docker compose up -d
Die jeweiligen Management-Schnittstellen sollten nun zugänglich sein. Auf die Einrichtung der Management-Schnittstellen gehe ich hier nicht näher ein, da sie meines Erachtens leicht zu erklären sind.
6. Sichern der Oberflächen via htaccess (Optional)
Um die Oberflächen von PGadmin und PHPmyadmin mit einem zusätzlichen Kennwort zu sichern kann eine htpasswd Datei angelegt werden. Doch zu allererst installieren wir die benötigten Pakete:
command -v htpasswd >/dev/null 2>1 || apt update && apt install -y apache2-utils
Nun generieren wir ein Kennwort für unseren Benutzer, diesen integrieren wir direkt in Traefik. Ich gehe hier von der Traefik Installationsanleitung aus Punkt 1 aus.
htpasswd /opt/containers/traefik-crowdsec-stack/data/traefik/.htpasswd-datenbanken <deinBenutzername>
Benutzername und Passwort sind “case-sensitive”, das bedeutet, Groß- und Kleinschreibung müssen exakt übereinstimmen. Sollte Traefik laufen muss dieser neugestartet werden. Wir erstellen eine passende Datei für PGadmin und phpmyadmin:
Wir nennen diese http.middlewares.datenbank-dashboard-auth.yml (Vorlage galt hier folgender Punkt: Klick hier)
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.datenbank-dashboard-auth.yml
http: middlewares: datenbank-dashboard-auth: basicAuth: realm: "Datenbank Dashboard" usersFile: "/etc/traefik/.htpasswd-datenbanken"
Nun muss in der docker-compose.yml folgendes angepasst werden
nano /opt/containers/datenbank_container/docker-compose.yml
Folgende Änderung wird gemacht -> aus default@file” wird default@file, datenbank-dashboard-auth@file”
services: ### Datenbank Server ### ------ ### Verwaltung ### ui-pgadmin: restart: always image: dpage/pgadmin4 ------ - "traefik.http.services.pga-svc-ui.loadBalancer.server.port=80" - "traefik.http.routers.pga-rtr-ui.middlewares=default@file" volumes: - ${ABSOLUTE_PATH}/data/pgadmin:/var/lib/pgadmin networks: - db-net - proxy ui-phpmyadmin: image: phpmyadmin ------ - "traefik.http.services.pma-svc-ui.loadBalancer.server.port=80" - "traefik.http.routers.pma-rtr-ui.middlewares=default@file" volumes: - ${ABSOLUTE_PATH}/data/phpmyadmin/:/sessions:rw ------
services: ### Datenbank Server ### ------ ### Verwaltung ### ui-pgadmin: restart: always image: dpage/pgadmin4 ------ - "traefik.http.services.pga-svc-ui.loadBalancer.server.port=80" - "traefik.http.routers.pga-rtr-ui.middlewares=default@file, datenbank-dashboard-auth@file" volumes: - ${ABSOLUTE_PATH}/data/pgadmin:/var/lib/pgadmin networks: - db-net - proxy ui-phpmyadmin: image: phpmyadmin ------ - "traefik.http.services.pma-svc-ui.loadBalancer.server.port=80" - "traefik.http.routers.pma-rtr-ui.middlewares=default@file, datenbank-dashboard-auth@file" volumes: - ${ABSOLUTE_PATH}/data/phpmyadmin/:/sessions:rw ------
Anschließend muss Traefik und die jeweiligen Container von pgadmin und phpmyadmin neustarten
docker compose -f /opt/containers/traefik-crowdsec-stack/docker-compose.yml restart traefik && docker compose -f /opt/containers/datenbank_container/docker-compose.yml restart ui-pgadmin ui-phpmyadmin
7. Anpassen der WordPress Installation (Optional)
Damit ein vorhandener Container mit der Datenbank reden kann, müssen einige Änderungen vorgenommen werden. Ich werde dies anhand der Anleitung für WordPress machen, Dort wird im Abschnitt 2 die Docker-compose.yml angelegt. Diese muss wie folgt angepasst werden :
nano /opt/containers/wordpress/docker-compose.yml
services: wordpress: image: wordpress restart: unless-stopped container_name: wordpress environment: WORDPRESS_DB_HOST: db-mariadb WORDPRESS_DB_USER: exampleuser ## Hier Benutzer eingeben ## WORDPRESS_DB_PASSWORD: examplepass ## Hier Passwort eingeben ## WORDPRESS_DB_NAME: wordpress volumes: - ./app:/var/www/html labels: - "traefik.enable=true" - "traefik.http.routers.wordpress.entrypoints=websecure" - "traefik.http.routers.wordpress.rule=Host(`wordpress.euredomain.de`)" - "traefik.http.routers.wordpress.middlewares=default@file" - "traefik.http.routers.wordpress.tls=true" - "traefik.http.routers.wordpress.tls.certresolver=http_resolver" - "traefik.http.routers.wordpress.service=wordpress" - "traefik.http.services.wordpress.loadbalancer.server.port=80" - "traefik.docker.network=proxy" networks: - proxy - default wordpress-db: image: mariadb:10.6-focal container_name: wordpress-db restart: unless-stopped environment: MYSQL_DATABASE: wordpress MYSQL_USER: exampleuser ## Hier selben Benutzer eingeben ## MYSQL_PASSWORD: examplepass ## Hier selbes Passwort eingeben ## MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - ./database:/var/lib/mysql networks: - default networks: proxy: external: true
services: wordpress: image: wordpress restart: unless-stopped container_name: wordpress environment: WORDPRESS_DB_HOST: db-mariadb WORDPRESS_DB_USER: exampleuser ## Hier Benutzer eingeben ## WORDPRESS_DB_PASSWORD: examplepass ## Hier Passwort eingeben ## WORDPRESS_DB_NAME: exampleuser volumes: - ./app:/var/www/html labels: - "traefik.enable=true" - "traefik.http.routers.wordpress.entrypoints=websecure" - "traefik.http.routers.wordpress.rule=Host(`wordpress.euredomain.de`)" - "traefik.http.routers.wordpress.middlewares=default@file" - "traefik.http.routers.wordpress.tls=true" - "traefik.http.routers.wordpress.tls.certresolver=http_resolver" - "traefik.http.routers.wordpress.service=wordpress" - "traefik.http.services.wordpress.loadbalancer.server.port=80" - "traefik.docker.network=proxy" networks: - proxy - db-net networks: proxy: external: true db-net: external: true
Auf dem db-mariadb Server muss über die PHPmyadmin Oberfläche eine Datenbank sowie ein Benutzer mit Kennwort angelegt werden. Als Host für den User kann “wordpress” benutzt werden damit nur der wordpress Container auf die Datenbank zugreifen darf.
Anschließend kann die Anleitung von WordPress weitergeführt werden.
In der docker-compose scheint ein Fehler beim image für phpmyadmin zu sein:
Anstatt:
image: ui-phpmyadmin
müsste es wohl eher:
image: phpmyadmin:phpmyadmin
heissen – oder?
Zudem existiert das Network “db-net” ja nicht per default bzw. sollte doch erst mit dieser Konfig angelegt werden, kann also nicht als “external” konfiguriert werden – oder?