Esercizio 5: Postgres server e client
Obiettivi
L'obiettivo è di installare un server del DB PostgreSQL ed un client grafico da cui accedere al DBMS.
Un'attenta valutazione dei prodotti e delle versioni ci porta a selezionare le immagini docker da usare:
- postgres:12.2 - versione specifica del server, determinata forse dai requisiti di progetto e di cui conosciamo bene la configurazione e amministrazione
- dpage/pgadmin4 - client con interfaccia HTML
Server
Variabili d'ambiente
L'esatta configurazione del container del server è guidata da una serie di variabili d'ambiente che devono essere fornite all'atto del run del container:
POSTGRES_USER
- Utente creato con poteri di superuser, e suo DB- Default:
postgres
- Default:
POSTGRES_PASSWORD
- Necessario semprePOSTGRES_DB
- DB a cui connettersi. Default:$POSTGRES_USER
POSTGRES_INITDB_ARGS
- Se la datadir è inizializzata, argomenti e opzioni per initdbPOSTGRES_INITDB_WALDIR
- Locazione del Write Ahead Log se diversa dalla datadirPOSTGRES_HOST_AUTH_METHOD
- Popolapg_hda.conf
.- Default "
host all all all md5
"
- Default "
PGDATA
- Locazione della datadir.- Default:
/var/lib/postgresql/data
- Default:
Persistenza dei dati
Mappare la datadir container a una directory host:
-v "$HOME/pg/datadir":/var/lib/postgresql/data
Altrimenti tutti i database spariscono quando il container è rimosso
In questa versione tutti i file di configurazione sono dentro la datadir.
Un'alternativa può essere la creazione di un volume docker e mappaggio della datadir a questo volume.
Port publishing
Per vedere la porta Postgres dalla rete dello host:
-p 5432:5432
(oppure p.es. -p 15432:5432
se c’è già postgres attivo sullo host)
Non deve esserci se il servizio Postgres è solo visto dalla rete interna.
Rete interna
Altri container vedono il container server postgres:
--net postnet --name postserver
Richiede previa creazione:
docker network create postnet
Lancio del server
Scaricare l’immagine:
docker pull postgres:12.2
Verifica:
docker images
Costruzione della directory dati locale:
mkdir -p $HOME/pg
Creazione della rete:
docker network create postnet
Start del server:
docker run -d --net postnet --name postserver \
-v "$HOME/pg/datadir":/var/lib/postgresql/data \
-e POSTGRES_PASSWORD="secret" \
postgres:12.2
Se la datadir è vuota il container la inizializza con initdb
.
Se è piena, la usa.
Client Postgres semplice
Con un contenitore derivato dalla stessa immagine:
docker run -ti --rm --net postnet --name client \
postgres:12.2 psql -h postserver -U postgres
- Senza comando parte il server
- Con il comando parte il client
- Viene chiesta la password dell’utente ‘postgres’, ‘secret’ in questo esempio
- Attenzione: quando si dà ‘\q’ il contenitore viene chiuso e rimosso automaticamente
E’ anche possibile lanciare una shell:
docker run -ti --rm --net postnet --name postclient \
-v "$HOME/pg/etc":/etc/postgresql \
postgres:12.2 /bin/bash
Per uscire temporaneamente a linea di comando:
Ctrl-P Ctrl-Q
Per tornare al contenitore:
docker attach client
Stiamo condividendo una directory per eventualmente trasferire dati dallo host.
PgAdmin 4
Client grafico con interfaccia web. Dettagli su:
https://www.pgadmin.org/docs/pgadmin4/4.21/container_deployment.html
Pull dell’immagine:
docker pull dpage/pgadmin4
Lancio:
docker run -d --net postnet --name pgadmin -p 8080:80 \
-e 'PGADMIN_DEFAULT_EMAIL=mich@stormforce.ac' \
-e 'PGADMIN_DEFAULT_PASSWORD=supersecret' \
-e 'PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION=True' \
-e 'PGADMIN_CONFIG_LOGIN_BANNER="Authorised users only!"' \
-e 'PGADMIN_CONFIG_CONSOLE_LOG_LEVEL=10' \
dpage/pgadmin4
Collegarsi con un browser a http://localhost:8080/
Esercizio con Docker Compose
postserver e pgadmin sono due microservizi, collegati dalla rete postnet, che offre anche risoluzione nomi-indirizzi.
Scriviamo il file di specifiche:
mkdir -p $HOME/pg
cd $HOME/pg
vi docker-compose.yml
version: '3.6'
services:
postserver:
image: postgres:12.2
environment:
POSTGRES_PASSWORD: "secret"
ports:
- "5432:5432"
volumes:
- /home/mich/pg/datadir:/var/lib/postgresql/data
networks:
postnet:
ipv4_address: 192.168.100.2
pgadmin:
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: "mich@stormforce.ac"
PGADMIN_DEFAULT_PASSWORD: "supersecret"
ports:
- "8000:80"
depends_on:
- postserver
networks:
postnet:
ipv4_address: 192.168.100.3
networks:
postnet:
name: postnet
ipam:
driver: default
config:
- subnet: 192.168.100.0/24
Test di debugging:
docker compose up
Si vedrà sui log su console la creazione della datadir.
Quando funziona:
Ctrl-C
Quindi:
docker compose down
docker compose up -d
Provare il collegamento a localhost:8000