PostgreSQL, také označovaný jako Postgres, je přední objektově-relační databázový systém. Je oblíbený díky vysoké úrovni souladu se standardem SQL a zahrnutím dalších funkcí, které zjednodušují práci se složitými datovými sadami ve velkém měřítku.
PostgreSQL používá tradiční architekturu klient-server, takže ji musíte spouštět nezávisle na kódu vaší aplikace. V této příručce nasadíte instanci serveru PostgreSQL jako kontejner Docker. Tím se vyhnete přidávání balíčků na váš hostitelský počítač a pomůžete izolovat vaši databázi od ostatních částí vašeho zásobníku. Než budete pokračovat, ujistěte se, že máte nainstalovaný Docker.
Začínáme
PostgreSQL má oficiální obrázek na Docker Hub, který je k dispozici v několika různých variantách. Tagy vám umožňují vybrat si mezi hlavními verzemi PostgreSQL od v9 do v14 a zvolit operační systém použitý jako základní obrázek. Nabízeny jsou Alpine, Debian Stretch a Debian Bullseye.
Pro účely tohoto tutoriálu použijeme postgres:14
tag, který poskytuje PostgreSQL 14 na vrcholu Bullseye. Můžete si vybrat jinou verzi, která bude vyhovovat vašim požadavkům.
Spusťte kontejner PostgreSQL pomocí docker run
příkaz:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
Musíte zadejte hodnotu pro POSTGRES_PASSWORD
proměnná prostředí. Toto definuje heslo, které bude přiřazeno výchozímu superuživatelskému účtu Postgres. Výchozí uživatelské jméno je postgres
ale lze to změnit nastavením POSTGRES_USER
proměnná prostředí.
-v
příznak se používá k připojení svazku Docker do datového adresáře kontejneru PostgreSQL. Pojmenovaný svazek s názvem postgres
je odkazováno; Docker jej buď vytvoří, nebo znovu připojí svazek, pokud již existuje. K uložení databáze mimo kontejner byste měli použít svazek. Bez něj budete svá data používat, až se kontejner zastaví.
PostgreSQL standardně naslouchá na portu 5432. Port kontejneru je svázán s portem 5432 na vašem hostiteli Docker pomocí -p
vlajka. -d
příznak se používá ke spuštění kontejneru v odpojeném režimu, čímž se efektivně stává službou na pozadí, která běží, dokud není zastavena pomocí docker stop
.
Zadání hesla jako souboru
Pokud je vám nepříjemné zadat heslo superuživatele jako příznak CLI s prostým textem, můžete jej místo toho vložit jako soubor prostřednictvím svazku. Poté byste měli nastavit POSTGRES_PASSWORD_FILE
proměnná prostředí, která Postgresu poskytne cestu k tomuto souboru:
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
Tato technika funguje také pro POSTGRES_USER
a další podporované proměnné prostředí.
Připojování k vaší databázi
Protože PostgreSQL byl vázán na port 5432 výše, mohli jste se připojit ke své databázi na localhost:5432
z libovolného kompatibilního klienta. Při spouštění kontejneru použijte přihlašovací údaje, které jste přiřadili jako proměnné prostředí.
Obrázek Docker také obsahuje psql
binární, které můžete vyvolat pomocí docker exec
. Použijte to k rychlé interakci s vaší databází z prostředí PostgreSQL v kontejneru.
docker exec -it postgres psql -U postgres
Připojování z jiných kontejnerů dockeru
Vytvoření sítě Docker je preferovaným způsobem přístupu k PostgreSQL z jiných kontejnerů na stejném hostiteli. Tím se zabrání vázání portu serveru Postgres a potenciálnímu vystavení služby širší síti vašeho hostitele.
Vytvořte síť Docker:
docker network create my-app
Spusťte svůj kontejner Postgres s připojením k síti pomocí --network
příznak pomocí docker run
:
docker run -d --name postgres --network my-app -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
Nyní připojte kontejner aplikace ke stejné síti:
docker run -d --name api --network my-app my-api:latest
Kontejnery v síti mohou dosáhnout Postgres pomocí postgres
hostname, protože toto je name
přiřazena ke kontejneru Postgres. Pro dokončení připojení použijte port 5432.
Konfigurace PostgreSQL
Možnosti serveru PostgreSQL můžete předat pomocí -c
příznaky za názvem obrázku ve vašem docker run
příkaz:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14 -c max_connections=100
Vše po předání názvu obrázku do příkazu spuštěného v kontejneru. Tento příkaz bude binární soubor PostgreSQL serveru v případě obrazu Postgres.
Při nastavování hodnot několika možností můžete použít vlastní konfigurační soubor. K připojení souboru do kontejneru budete muset použít jiný svazek Dockeru a poté zadat jeden -c
příznak, který Postgresu dá pokyn, kam se má dívat:
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
Tento příklad používá připojení vazby Docker k získání postgres.conf
soubor ve vašem pracovním adresáři připojený do kontejneru /etc/postgresql
adresář. Odkaz na možnosti, které můžete nastavit pomocí binárních příznaků nebo direktiv konfiguračního souboru, naleznete v dokumentaci PostgreSQL.
Nasazení databáze
Obraz Dockeru podporuje počáteční soubory umístěné do /docker-entrypoint-initdb.d
adresář. Libovolný .sql
nebo .sql.gz
soubory budou spuštěny k inicializaci databáze. K tomu dojde po výchozím uživatelském účtu a postgres
databáze byla vytvořena. Můžete také přidat .sh
soubory ke spouštění libovolných skriptů shellu. Všechny skripty jsou prováděny v abecedním pořadí.
Tento mechanismus znamená, že vše, co potřebujete k vytvoření databáze, je sada SQL nebo shell skriptů pojmenovaných ve správném sekvenčním pořadí. Připojte je do nového kontejneru pomocí -v
příznak pomocí 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
Inicializační skripty budou použity pouze v případě, že je datový adresář Postgres prázdný. Pro praktické účely to znamená, že se spustí při prvním spuštění kontejneru s připojeným novým prázdným objemem.
Vytvoření obrázku vlastní databáze
Můžete se rozhodnout zapouzdřit svůj konfigurační soubor a inicializační skripty do vlastního obrazu Dockeru. To by umožnilo komukoli s přístupem k obrázku vytvořit novou instanci PostgreSQL, která je předkonfigurována pro vaši aplikaci. Zde je jednoduchý Dockerfile, který můžete použít:
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"]
Vytvořte si vlastní obrázek:
docker build -t custom-postgres:latest .
Pokyny k sestavení v Dockerfile zkopírují konfigurační soubor PostgreSQL a inicializační skripty z vašeho pracovního adresáře a vloží je do obrazu kontejneru. Nyní můžete spustit databázový kontejner, aniž byste museli ručně dodávat prostředky:
docker run -d --name custom-postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data custom-postgres:latest
Měli byste kontejnerizovat svou produkční databázi?
Může být obtížné rozhodnout, zda spustit databázi v Dockeru. Kontejnerování PostgreSQL usnadňuje nastavení, ale někdy je náročnější na údržbu. Při správě kontejneru musíte být opatrní, abyste předešli ztrátě dat v budoucnu. Docker také přidává skromnou režii na výkon, která stojí za zvážení, když předpokládáte, že databáze prohlídek bude pracovat s velmi velkými objemy dat.
Výhody Dockeru jsou zvýšená přenositelnost, snadné škálování a efektivita vývojářů. Kontejnerování databáze umožňuje komukoli vytvořit novou instanci pomocí Dockeru, aniž by bylo nutné nejprve ručně instalovat a konfigurovat PostgreSQL. Zápis souboru Dockerfile pro vaši databázi PostgreSQL, který přidá váš konfigurační soubor a skripty SQL seed, je proto dobrým způsobem, jak pomoci vývojářům rychle spustit nová prostředí.
Přehled
PostgreSQL je pokročilý databázový stroj založený na SQL, který přidává objektově relační schopnosti. I když se můžete rozhodnout spustit tradiční nasazení v produkci, použití kontejnerové instance zjednodušuje nastavení a pomáhá vývojářům rychle rozvinout jejich vlastní infrastrukturu.
Nejdůležitějším aspektem nasazení Dockerized je zajistit, že k ukládání dat používáte svazek. To vám umožní zastavit, nahradit a aktualizovat váš kontejner na novější verzi obrázku bez ztráty databáze. Kromě úložiště byste měli posoudit, jak se připojíte k Postgresu, a pokud to nebude nutné, vyvarujte se vázání portů k vašemu hostiteli. Při připojování z jiného kontejneru je pro usnadnění přístupu nejlepší použít sdílenou síť Docker.