Postgres ist mit die bekannteste und eine sehr weit verbreitete Datenbank mit vielen Möglichkeiten Sie zu erweitern oder zu optimieren. Postgres bietet eine gute Performance von haus aus und sehr viele Möglichkeiten diese in die eigene Anwendung zu integrieren. Hier schauen wir uns mal an, wie man Sie schnell unter Docker zum laufen bringen kann.
Der Vorgang, den wir jetzt zeigen eignet sich sehr gut zum Entwickeln und Testen, bietet aber keine Stabile Möglichkeit für ein produktives Umfeld. Das ist auch nicht Teil des Artikels.
Postgres stellt zum glück von Haus aus ein Image bereit
1docker pull postgres
das offiziele Image auf docker Hub heißt auch einfach postgres
Benutzt werden kann das ganze nun mittels docker run
Befehl und dann wären wir auch schon soweit fertig. Wichtig sind hierbei allerdings noch einige weitere Parameter.
1# einfacher Befehl zum laufen lassen. Logs bleiben in der gleichen Konsole
2docker run -it postgres
3
4# nun leitet man den Port weiter und kann sich mit dem Container verbinden
5docker run -it -p 5432:5432 postgres
6
7# Benennt den Container ebenfalls auch postgres. Vereinfacht nachher die suche und das logging
8docker run --name postgres postgres
9
10#setzt ein Admin Passwort (der standard User und die Datenbank werden von der initdb gesetzt)
11docker run -e POSTGRES_PASSWORD=mysecretpassword postgres
Das ganze kann natürlich auch kombiniert werden, so startet dieser Befehl einen Container mit Port, Name und einem Passwort:
1docker run ---name postgres -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword postgres
Es gibt auch noch weitere Umgebungsvariablen zum setzen von Attributen:
Name | Beschreibung |
---|---|
POSTGRES_USER | Setzt den Standard User (Standard ist postgres) |
PGDATA | Setzt den Ordner, wo die Dateien von postgres gespeichert werden (Standard ist: /var/lib/postgresql/data) |
POSTGRES_DB | Setzt den Namen der Standardmäßigen Datenbank |
POSTGRES_HOST_AUTH_METHOD | Dieser Wert setzt die Authentifizierungs-methode für all databases, all users und all addresses |
Alles was unter /docker-entrypoint-initdb.d
gemountet wird, wird als Initialisierung einmal durchlaufen. Wichtig hierbei ist, dass es nur einmal gemacht wird und auch nur bei einem leeren Verzeichnis (einer leeren Datenbank).
Benutzt werden kann ein init Script z.B. mit einem volume Mount an der richtigen Stelle. Als Beispiel wird mittels -v
ein lokaler Pfad in den Container gehangen. Wenn man als Beispiel einen zusätzlichen Benutzer anlegen möchte, kann man folgendes Script unter /docker-entrypoint-initdb.d/init-user-db.sh
mounten.
1#!/bin/bash
2set -e
3
4psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
5 CREATE USER docker;
6 CREATE DATABASE docker;
7 GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
8EOSQL