Hoe PostgreSQL als een Docker-container te implementeren

0
157

PostgreSQL, ook wel Postgres genoemd, is de leidende object-relationele database systeem. Het is populair vanwege de hoge mate van naleving van de SQL-standaard en de toevoeging van extra functies die het werken met complexe datasets op schaal vereenvoudigen.

PostgreSQL gebruikt een traditionele client-server-architectuur, dus u moet het onafhankelijk van de code van uw toepassing uitvoeren. In deze handleiding implementeert u een PostgreSQL-serverinstantie als een Docker-container. Dit vermijdt het toevoegen van pakketten aan uw hostmachine en helpt om uw database te isoleren van de andere delen van uw stapel. Zorg ervoor dat Docker is geïnstalleerd voordat u doorgaat.

Aan de slag

PostgreSQL heeft een officiële afbeelding op Docker Hub die beschikbaar is in verschillende verschillende varianten. Met tags kunt u kiezen tussen de belangrijkste PostgreSQL-versies van v9 tot v14 en het besturingssysteem kiezen dat als basisimage wordt gebruikt. Alpine, Debian Stretch en Debian Bullseye worden aangeboden.

Voor deze tutorial gebruiken we de postgres:14-tag die PostgreSQL 14 bovenop Bullseye biedt. U bent vrij om een ​​andere versie te selecteren die aan uw vereisten voldoet.

Start een PostgreSQL-container met behulp van de opdracht docker run:

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

Je moetgeef een waarde op voor de omgevingsvariabele POSTGRES_PASSWORD. Dit definieert het wachtwoord dat wordt toegewezen aan Postgres’ standaard superuser-account. De gebruikersnaam is standaard postgres, maar kan worden gewijzigd door de omgevingsvariabele POSTGRES_USER in te stellen.

Advertentie

De vlag -v wordt gebruikt om een ​​Docker-volume te koppelen aan de gegevensmap van de PostgreSQL-container. Er wordt verwezen naar een benoemd volume met de naam postgres; Docker maakt het of koppelt het volume opnieuw als het al bestaat. U moet een volume gebruiken om uw database buiten de container op te slaan. Zonder één gebruik je je gegevens wanneer de container stopt.

PostgreSQL luistert standaard op poort 5432. De containerpoort is gebonden aan poort 5432 op uw Docker-host door de vlag -p. De vlag -d wordt gebruikt om de container in ontkoppelde modus te starten, waardoor het in feite een achtergrondservice wordt die blijft draaien totdat deze wordt gestopt met docker-stop.

Het wachtwoord als bestand opgeven

Als u zich niet op uw gemak voelt bij het opgeven van uw superuser-wachtwoord als een CLI-vlag in platte tekst, kunt u het in plaats daarvan als een bestand injecteren via een volume. Stel vervolgens de omgevingsvariabele POSTGRES_PASSWORD_FILE in om Postgres het pad naar dat bestand te geven:

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

Deze techniek werkt ook voor POSTGRES_USER en andere ondersteunde omgevingsvariabelen.

Verbinding maken met uw database

Omdat PostgreSQL gebonden was aan poort 5432 hierboven, kon je vanaf elke compatibele client verbinding maken met je database op localhost:5432. Gebruik de referenties die je hebt toegewezen als omgevingsvariabelen bij het starten van de container.

De Docker-image bevat ook het psql-binaire bestand dat je kunt aanroepen met docker exec. Gebruik dit om snel te communiceren met uw database vanuit een PostgreSQL-shell in de container.

docker exec -it postgres psql -U postgres

Verbinding maken vanuit andere Docker-containers

Het maken van een Docker-netwerk is de beste manier om toegang te krijgen tot PostgreSQL vanuit andere containers op dezelfde host. Dit voorkomt dat de poort van de Postgres-server wordt gebonden en dat de service mogelijk wordt blootgesteld aan het bredere netwerk van uw host.

Maak een Docker-netwerk:

Docker-netwerk maakt mijn-app-advertentie< br>

Start uw Postgres-container met een verbinding met het netwerk door de –network-vlag te gebruiken met docker-run:

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

Voeg nu je applicatiecontainer toe aan hetzelfde netwerk:

docker run -d –name api –network mijn-app mijn- api:latest

De containers in het netwerk kunnen Postgres bereiken met de postgres-hostnaam, aangezien dit de naam is die aan de Postgres-container is toegewezen. Gebruik poort 5432 om de verbinding te voltooien.

PostgreSQL configureren

U kunt PostgreSQL-serveropties doorgeven met -c-vlaggen achter de afbeeldingsnaam in uw docker run-opdracht:

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

Alles na de afbeeldingsnaam wordt doorgegeven aan de opdracht die in de container is gestart. Deze opdracht is de binaire PostgreSQL-server in het geval van de Postgres-afbeelding.

U kunt een aangepast configuratiebestand gebruiken wanneer u de waarden van verschillende opties instelt. Je moet een ander Docker-volume gebruiken om je bestand in de container te mounten, en dan een -c-vlag opgeven om Postgres te laten weten waar het moet zoeken:

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

In dit voorbeeld wordt een Docker-bindkoppeling gebruikt om het bestand postgres.conf in uw werkdirectory te koppelen aan de directory /etc/postgresql van de container. Raadpleeg de PostgreSQL-documentatie voor een referentie van de opties die u kunt instellen met binaire vlaggen of configuratiebestandsrichtlijnen.

De database zaaien

De Docker-image ondersteunt seed-bestanden die in de directory /docker-entrypoint-initdb.d zijn geplaatst. Alle .sql- of .sql.gz-bestanden worden uitgevoerd om de database te initialiseren. Dit gebeurt nadat het standaardgebruikersaccount en de postgres-database zijn gemaakt. U kunt ook .sh-bestanden toevoegen om willekeurige shellscripts uit te voeren. Alle scripts worden in alfabetische volgorde uitgevoerd.

Dit mechanisme betekent dat alles wat je nodig hebt om je database te seeden een set SQL- of shellscripts is die in de juiste volgorde worden genoemd. Monteer deze in uw nieuwe container met behulp van een -v vlag met 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

De initialisatiescripts worden alleen gebruikt als de Postgres-gegevensmap leeg is. Voor praktische doeleinden betekent dit dat ze de eerste keer dat de container start, worden uitgevoerd met een nieuw leeg volume eraan gekoppeld.

Een aangepaste database-image maken

U kunt ervoor kiezen om uw configuratiebestand en initialisatiescripts in uw eigen Docker-image in te kapselen. Hierdoor zou iedereen met toegang tot de afbeelding een nieuwe PostgreSQL-instantie kunnen starten die vooraf is geconfigureerd voor uw toepassing. Hier is een eenvoudig Docker-bestand dat u zou kunnen gebruiken:

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

Bouw uw aangepaste afbeelding:

docker build -t custom-postgres:latest .

De build-instructies in de Dockerfile zullen het PostgreSQL-configuratiebestand en de initialisatiescripts uit uw werkdirectory kopiëren en insluiten in de containerafbeelding. Nu kunt u een databasecontainer starten zonder handmatig de bronnen in te voeren:

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

Moet u uw productiedatabase in een container opnemen?

Het kan moeilijk zijn om te beslissen of een database in Docker moet worden uitgevoerd. Het containeriseren van PostgreSQL zorgt voor een eenvoudigere installatie-ervaring, maar is soms een grotere uitdaging om te onderhouden. U moet voorzichtig zijn bij het beheer van uw container om gegevensverlies in de toekomst te voorkomen. Docker voegt ook een bescheiden prestatie-overhead toe die het overwegen waard is wanneer u verwacht dat de tourdatabase met zeer grote datavolumes zal werken.

Advertentie

De voordelen van Docker zijn verhoogde draagbaarheid, schaalbaarheid en efficiëntie voor ontwikkelaars. Door uw database te containeren, kan iedereen een nieuwe instantie starten met Docker, zonder eerst PostgreSQL handmatig te installeren en configureren. Het schrijven van een Dockerfile voor uw PostgreSQL-database die uw configuratiebestand en SQL-seedscripts toevoegt, is daarom een ​​goede manier om ontwikkelaars te helpen snel nieuwe omgevingen te starten.

Samenvatting

PostgreSQL is een geavanceerde op SQL gebaseerde database-engine die objectrelationele mogelijkheden toevoegt. Hoewel u ervoor kunt kiezen om een ​​traditionele implementatie in productie uit te voeren, vereenvoudigt het gebruik van een gecontaineriseerde instantie de installatie en helpt het ontwikkelaars om snel hun eigen infrastructuur op te bouwen.

Het belangrijkste aspect van een Dockerized-implementatie is ervoor te zorgen dat u ;gebruik een volume om uw gegevens op te slaan. Hierdoor kunt u uw container stoppen, vervangen en bijwerken naar een latere afbeeldingsversie zonder uw database te verliezen. Naast opslag moet u beoordelen hoe u verbinding gaat maken met Postgres en vermijden dat poorten aan uw host worden gebonden, tenzij dat nodig is. Wanneer u verbinding maakt vanuit een andere container, kunt u het beste een gedeeld Docker-netwerk gebruiken om de toegang te vergemakkelijken.