GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Come distribuire PostgreSQL come contenitore Docker

PostgreSQL, noto anche come Postgres, è il principale sistema di database relazionale a oggetti. È popolare per il suo elevato livello di conformità allo standard SQL e per l'inclusione di funzionalità aggiuntive che semplificano il lavoro con set di dati complessi su larga scala.

PostgreSQL utilizza un'architettura client-server tradizionale, quindi è necessario eseguirla indipendentemente dal codice dell'applicazione. In questa guida, distribuirai un'istanza del server PostgreSQL come contenitore Docker. Ciò evita di aggiungere pacchetti alla tua macchina host e aiuta a isolare il tuo database dalle altre parti del tuo stack. Assicurati di aver installato Docker prima di continuare.

Per iniziare

PostgreSQL ha un'immagine ufficiale su Docker Hub che è disponibile in diverse varianti. I tag ti consentono di selezionare tra le principali versioni di PostgreSQL da v9 a v14 e scegliere il sistema operativo utilizzato come immagine di base. Sono disponibili Alpine, Debian Stretch e Debian Bullseye.

Ai fini di questo tutorial, useremo il postgres:14 tag che fornisce PostgreSQL 14 in cima a Bullseye. Sei libero di selezionare una versione diversa in base alle tue esigenze.

Avvia un contenitore PostgreSQL usando docker run comando:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    postgres:14

devi fornire un valore per il POSTGRES_PASSWORD variabile d'ambiente. Questo definisce la password che verrà assegnata all'account di superutente predefinito di Postgres. Il nome utente predefinito è postgres ma può essere modificato impostando il POSTGRES_USER variabile di ambiente.

Il -v flag viene utilizzato per montare un volume Docker nella directory dei dati del contenitore PostgreSQL. Un volume denominato postgres è referenziato; Docker lo creerà o ricollegherà il volume se esiste già. È necessario utilizzare un volume per archiviare il database all'esterno del contenitore. Senza uno utilizzerai i tuoi dati quando il container si fermerà.

PostgreSQL è in ascolto sulla porta 5432 per impostazione predefinita. La porta del contenitore è vincolata alla porta 5432 sul tuo host Docker dal -p bandiera. Il -d flag viene utilizzato per avviare il contenitore in modalità scollegata, rendendolo di fatto un servizio in background che continua a funzionare fino a quando non viene interrotto con docker stop .

Fornitura della password come file

Se non ti senti a tuo agio nel fornire la tua password di superutente come flag CLI in testo normale, puoi invece inserirla come file tramite un volume. Dovresti quindi impostare il POSTGRES_PASSWORD_FILE variabile di ambiente per fornire a Postgres il percorso di quel file:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-password 
    -v ./postgres-password.txt:/run/secrets/postgres-password
    -v postgres:/var/lib/postgresql/data 
    postgres:14

Questa tecnica funziona anche per POSTGRES_USER e altre variabili di ambiente supportate.

Connessione al tuo database

Poiché PostgreSQL era legato alla porta 5432 sopra, puoi connetterti al tuo database su localhost:5432 da qualsiasi client compatibile. Utilizza le credenziali che hai assegnato come variabili di ambiente all'avvio del container.

L'immagine Docker include anche psql binario che puoi invocare con docker exec . Usalo per interagire rapidamente con il tuo database da una shell PostgreSQL all'interno del contenitore.

docker exec -it postgres psql -U postgres

Connessione da altri contenitori Docker

La creazione di una rete Docker è il modo preferito per accedere a PostgreSQL da altri contenitori sullo stesso host. Ciò evita di vincolare la porta del server Postgres e di esporre potenzialmente il servizio alla rete più ampia del tuo host.

Crea una rete Docker:

docker network create my-app

Avvia il tuo container Postgres con una connessione alla rete utilizzando il --network contrassegnare con docker run :

docker run -d 
    --name postgres 
    --network my-app 
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    postgres:14

Ora unisci il tuo contenitore di applicazioni alla stessa rete:

docker run -d
    --name api
    --network my-app
    my-api:latest

I container nella rete possono raggiungere Postgres utilizzando il postgres hostname, poiché questo è il name assegnato al container Postgres. Usa la porta 5432 per completare la connessione.

Configurazione di PostgreSQL

Puoi passare le opzioni del server PostgreSQL usando -c flag dopo il nome dell'immagine nella tua docker run comando:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    postgres:14 -c max_connections=100

Tutto dopo che il nome dell'immagine viene passato al comando avviato nel contenitore. Questo comando sarà il binario del server PostgreSQL nel caso dell'immagine Postgres.

Puoi utilizzare un file di configurazione personalizzato quando imposti i valori di diverse opzioni. Dovrai utilizzare un altro volume Docker per montare il file nel contenitore, quindi fornire un -c flag per indicare a Postgres dove cercare:

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v ./postgres.conf:/etc/postgresql/postgresql.conf 
    -v postgres:/var/lib/postgresql/data 
    postgres:14 -c config_file=/etc/postgresql/postgresql.conf

Questo esempio usa un mount bind Docker per ottenere il postgres.conf file nella tua directory di lavoro montato nel /etc/postgresql del contenitore directory. Per un riferimento sulle opzioni che puoi impostare con flag binari o direttive di file di configurazione, fai riferimento alla documentazione di PostgreSQL.

Seminare il database

L'immagine Docker supporta i file seme inseriti nel /docker-entrypoint-initdb.d directory. Qualsiasi .sql o .sql.gz i file verranno eseguiti per inizializzare il database. Ciò si verifica dopo l'account utente predefinito e postgres database sono stati creati. Puoi anche aggiungere .sh file per eseguire script di shell arbitrari. Tutti gli script vengono eseguiti in ordine alfabetico.

Questo meccanismo significa che tutto ciò di cui hai bisogno per eseguire il seeding del database è un insieme di script SQL o shell denominati nell'ordine sequenziale corretto. Montali nel tuo nuovo contenitore usando un -v contrassegnare con docker run :

docker run -d 
    --name postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v ./db-seed-files/:/etc/docker-entrypoint-initdb.d 
    -v postgres:/var/lib/postgresql/data 
    postgres:14

Gli script di inizializzazione verranno utilizzati solo quando la directory dei dati di Postgres è vuota. Ai fini pratici, ciò significa che verranno eseguiti la prima volta che il container viene avviato con un nuovo volume vuoto allegato.

Creazione di un'immagine database personalizzata

Puoi scegliere di incapsulare il tuo file di configurazione e gli script di inizializzazione nella tua immagine Docker. Ciò consentirebbe a chiunque abbia accesso all'immagine di creare una nuova istanza PostgreSQL preconfigurata per la tua applicazione. Ecco un semplice Dockerfile che potresti usare:

FROM postgres:14
COPY postgres.conf /etc/postgresql/postgresql.conf
COPY db-seed-files/ /etc/docker-entrypoint-initdb.d/
CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]

Crea la tua immagine personalizzata:

docker build -t custom-postgres:latest .

Le istruzioni di compilazione nel Dockerfile copieranno il file di configurazione PostgreSQL e gli script di inizializzazione dalla directory di lavoro e li incorporeranno nell'immagine del contenitore. Ora puoi avviare un contenitore di database senza fornire manualmente le risorse:

docker run -d 
    --name custom-postgres 
    -p 5432:5432
    -e POSTGRES_PASSWORD=<password> 
    -v postgres:/var/lib/postgresql/data 
    custom-postgres:latest

Dovresti containerizzare il tuo database di produzione?

Può essere difficile decidere se eseguire un database in Docker. La containerizzazione di PostgreSQL rende l'esperienza di configurazione più semplice, ma a volte è più difficile da mantenere. Devi fare attenzione quando gestisci il tuo container per evitare perdite di dati in futuro. Docker aggiunge anche un modesto sovraccarico di prestazioni che vale la pena considerare quando prevedi che il database del tour funzionerà con volumi di dati molto grandi.

I vantaggi di Docker sono una maggiore portabilità, facilità di ridimensionamento ed efficienza degli sviluppatori. La containerizzazione del database consente a chiunque di creare una nuova istanza utilizzando Docker, senza prima installare e configurare manualmente PostgreSQL. Scrivere un Dockerfile per il tuo database PostgreSQL che aggiunga il tuo file di configurazione e gli script seme SQL è quindi un buon modo per aiutare gli sviluppatori ad avviare rapidamente nuovi ambienti.

Riepilogo

PostgreSQL è un motore di database avanzato basato su SQL che aggiunge capacità relazionali a oggetti. Sebbene tu possa scegliere di eseguire una distribuzione tradizionale in produzione, l'utilizzo di un'istanza containerizzata semplifica la configurazione e aiuta gli sviluppatori a creare rapidamente la propria infrastruttura.

L'aspetto più critico di una distribuzione Dockerizzata è assicurarsi di utilizzare un volume per archiviare i dati. Ciò ti consentirà di interrompere, sostituire e aggiornare il contenitore a una versione dell'immagine successiva senza perdere il database. Oltre allo storage, dovresti valutare come ti connetterai a Postgres ed evitare di vincolare le porte al tuo host se non necessario. Quando ci si connette da un altro container, è meglio utilizzare una rete Docker condivisa per facilitare l'accesso.


Docker
  1. Come installare WordPress utilizzando Docker

  2. Come distribuire un container nginx con Docker su Linode

  3. Come eseguire MySQL in un contenitore Docker

  4. Come SSH in un contenitore Docker

  5. Come installare Vim in un contenitore Docker

Come eseguire Grafana in un contenitore Docker

Come distribuire un container Docker in AWS Elastic Beanstalk

Come distribuire e gestire un contenitore Docker MongoDB

Come configurare un container Docker Apache

Come eseguire i contenitori Docker

Come distribuire il container Docker su Jelastic Cloud