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
  • POSTGRES_PASSWORD - Necessario sempre
  • POSTGRES_DB - DB a cui connettersi. Default: $POSTGRES_USER
  • POSTGRES_INITDB_ARGS - Se la datadir è inizializzata, argomenti e opzioni per initdb
  • POSTGRES_INITDB_WALDIR - Locazione del Write Ahead Log se diversa dalla datadir
  • POSTGRES_HOST_AUTH_METHOD - Popola pg_hda.conf .
    • Default "host all all all md5"
  • PGDATA - Locazione della datadir.
    • Default: /var/lib/postgresql/data

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.

Postnet

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