sql >> Database teknologi >  >> RDS >> PostgreSQL

Implementering af PostgreSQL på en Docker-container

Introduktion

Docker moderniserede den måde, vi bygger og implementerer applikationen på. Det giver os mulighed for at skabe lette, bærbare, selvforsynende beholdere, der nemt kan køre enhver applikation.

Denne blog havde til formål at forklare, hvordan man bruger Docker til at køre PostgreSQL-database. Det dækker ikke installation eller konfiguration af docker. Se venligst docker-installationsvejledningen her. Noget ekstra baggrund kan findes i vores tidligere blog om MySQL og Docker.

Inden vi går ind i detaljerne, lad os gennemgå noget terminologi.

  • Dockerfil
    Den indeholder et sæt instruktioner/kommandoer til at installere eller konfigurere programmet/softwaren.
  • Docker-billede
    Docker-billedet er bygget op af rækker af lag, som repræsenterer instruktioner fra Dockerfilen. Docker-billede bruges som skabelon til at oprette en container.
  • Linking af containere og brugerdefineret netværk
    Docker brugte bridge som en standardnetværksmekanisme og bruger --linkene til at linke containerne til hinanden. For at få adgang til PostgreSQL-container fra en applikationscontainer, bør man linke begge containere på oprettelsestidspunktet. Her i denne artikel bruger vi brugerdefinerede netværk, da linkfunktionen snart vil blive udfaset.
  • Datapersistens i Docker
    Som standard er data inde i en container flygtige. Når beholderen genstartes, vil data gå tabt. Volumener er den foretrukne mekanisme til at bevare data genereret og brugt af en Docker-container. Her monterer vi en værtsmappe inde i containeren, hvor alle data er gemt.

Lad os begynde at bygge vores PostgreSQL-image og bruge det til at køre en container.

PostgreSQL Dockerfile

# example Dockerfile for https://docs.docker.com/engine/examples/postgresql_service/


FROM ubuntu:14.04

# Add the PostgreSQL PGP key to verify their Debian packages.
# It should be the same key as https://www.postgresql.org/media/keys/ACCC4CF8.asc
RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8

# Add PostgreSQL's repository. It contains the most recent stable release
#     of PostgreSQL, ``9.3``.
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list

# Install ``python-software-properties``, ``software-properties-common`` and PostgreSQL 9.3
#  There are some warnings (in red) that show up during the build. You can hide
#  them by prefixing each apt-get statement with DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y python-software-properties software-properties-common postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3

# Note: The official Debian and Ubuntu images automatically ``apt-get clean``
# after each ``apt-get``

# Run the rest of the commands as the ``postgres`` user created by the ``postgres-9.3`` package when it was ``apt-get installed``
USER postgres

# Create a PostgreSQL role named ``postgresondocker`` with ``postgresondocker`` as the password and
# then create a database `postgresondocker` owned by the ``postgresondocker`` role.
# Note: here we use ``&&\`` to run commands one after the other - the ``\``
#       allows the RUN command to span multiple lines.
RUN    /etc/init.d/postgresql start &&\
    psql --command "CREATE USER postgresondocker WITH SUPERUSER PASSWORD 'postgresondocker';" &&\
    createdb -O postgresondocker postgresondocker

# Adjust PostgreSQL configuration so that remote connections to the
# database are possible.
RUN echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/9.3/main/pg_hba.conf

# And add ``listen_addresses`` to ``/etc/postgresql/9.3/main/postgresql.conf``
RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf

# Expose the PostgreSQL port
EXPOSE 5432

# Add VOLUMEs to allow backup of config, logs and databases
VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

# Set the default command to run when starting the container
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]

Hvis du ser nærmere på Dockerfilen, består den af ​​kommandoer, som bruges til at installere PostgreSQL og udføre nogle konfigurationsændringer på ubuntu OS.

Opbygning af PostgreSQL-billede

Vi kan bygge et PostgreSQL-billede fra Dockerfile ved at bruge docker build-kommandoen.

# sudo docker build -t postgresondocker:9.3 .

Her kan vi specificere tagget (-t) til billedet som navn og version. Punktum (.) i slutningen angiver den aktuelle mappe, og den bruger den Dockerfile, der findes i den aktuelle mappe.Docker-filnavnet skal være "Dockerfile". Hvis du ønsker at angive et brugerdefineret navn til din docker-fil, skal du bruge -f i docker build-kommandoen.

# sudo docker build -t postgresondocker:9.3 -f <your_docker_file_name>

Output:(Valgfrit brug tekstvindue med rullepanel, hvis det er muligt)

Sending build context to Docker daemon  4.096kB
Step 1/11 : FROM ubuntu:14.04
14.04: Pulling from library/ubuntu
324d088ce065: Pull complete 
2ab951b6c615: Pull complete 
9b01635313e2: Pull complete 
04510b914a6c: Pull complete 
83ab617df7b4: Pull complete 
Digest: sha256:b8855dc848e2622653ab557d1ce2f4c34218a9380cceaa51ced85c5f3c8eb201
Status: Downloaded newer image for ubuntu:14.04
 ---> 8cef1fa16c77
Step 2/11 : RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
 ---> Running in ba933d07e226
.
.
.
fixing permissions on existing directory /var/lib/postgresql/9.3/main ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
creating configuration files ... ok
creating template1 database in /var/lib/postgresql/9.3/main/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    /usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main
or
    /usr/lib/postgresql/9.3/bin/pg_ctl -D /var/lib/postgresql/9.3/main -l logfile start

Ver Cluster Port Status Owner    Data directory               Log file
9.3 main    5432 down   postgres /var/lib/postgresql/9.3/main /var/log/postgresql/postgresql-9.3-main.log
update-alternatives: using /usr/share/postgresql/9.3/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-contrib-9.3 (9.3.22-0ubuntu0.14.04) ...
Setting up python-software-properties (0.92.37.8) ...
Setting up python3-software-properties (0.92.37.8) ...
Setting up software-properties-common (0.92.37.8) ...
Processing triggers for libc-bin (2.19-0ubuntu6.14) ...
Processing triggers for ca-certificates (20170717~14.04.1) ...
Updating certificates in /etc/ssl/certs... 148 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
Removing intermediate container fce692f180bf
 ---> 9690b681044b
Step 5/11 : USER postgres
 ---> Running in ff8864c1147d
Removing intermediate container ff8864c1147d
 ---> 1f669efeadfa
Step 6/11 : RUN    /etc/init.d/postgresql start &&    psql --command "CREATE USER postgresondocker WITH SUPERUSER PASSWORD 'postgresondocker';" &&    createdb -O postgresondocker postgresondocker
 ---> Running in 79042024b5e8
 * Starting PostgreSQL 9.3 database server
   ...done.
CREATE ROLE
Removing intermediate container 79042024b5e8
 ---> 70c43a9dd5ab
Step 7/11 : RUN echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/9.3/main/pg_hba.conf
 ---> Running in c4d03857cdb9
Removing intermediate container c4d03857cdb9
 ---> 0cc2ed249aab
Step 8/11 : RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
 ---> Running in fde0f721c846
Removing intermediate container fde0f721c846
 ---> 78263aef9a56
Step 9/11 : EXPOSE 5432
 ---> Running in a765f854a274
Removing intermediate container a765f854a274
 ---> d205f9208162
Step 10/11 : VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
 ---> Running in ae0b9f30f3d0
Removing intermediate container ae0b9f30f3d0
 ---> 0de941f8687c
Step 11/11 : CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
 ---> Running in 976d283ea64c
Removing intermediate container 976d283ea64c
 ---> 253ee676278f
Successfully built 253ee676278f
Successfully tagged postgresondocker:9.3

Oprettelse af containernetværk

Brug nedenstående kommando til at oprette et brugerdefineret netværk med brodriver.

# sudo docker network create --driver bridge postgres-network

Bekræft oprettelse af netværk

# sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
a553e5727617        bridge              bridge              local
0c6e40305851        host                host                local
4cca2679d3c0        none                null                local
83b23e0af641        postgres-network    bridge              local

Oprettelse af container

Vi skal bruge kommandoen "docker run" for at oprette en container fra docker-billedet. Vi kører postgres container i dæmoniseringstilstand ved hjælp af -d option.

# sudo docker run --name postgresondocker --network postgres-network -d postgresondocker:9.3

Brug nedenstående kommando for at bekræfte containeroprettelse.

# sudo docker container ls 
CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS              PORTS               NAMES
06a5125f5e11        postgresondocker:9.3   "/usr/lib/postgresql…"   About a minute ago   Up About a minute   5432/tcp            postgresondocker

Vi har ikke specificeret nogen port, der skal eksponeres, så den vil eksponere standard postgres port 5432 til intern brug. PostgreSQL er kun tilgængelig fra Docker-netværket, vi vil ikke kunne få adgang til denne Postgres-beholder på en værtsport.

Vi vil se, hvordan du får adgang til Postgres-beholderen på værtsporten i et senere afsnit i denne artikel.

Opretter forbindelse til PostgreSQL-container inde i Docker-netværket

Lad os prøve at oprette forbindelse til Postgres-containeren fra en anden container inden for det samme Docker-netværk, som vi oprettede tidligere. Her har vi brugt psql-klienten til at oprette forbindelse til Postgres. Vi brugte Postgres-beholdernavnet som værtsnavn, bruger og adgangskode til stede i Docker-filen.

# docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
Password for user postgresondocker: 
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.

postgresondocker=# 

--rm-indstillingen i run-kommandoen vil fjerne containeren, når vi afslutter psql-processen.

# sudo docker container ls 
CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS              PORTS               NAMES
2fd91685d1ea        postgresondocker:9.3   "psql -h postgresond…"   29 seconds ago       Up 30 seconds       5432/tcp            brave_spence
06a5125f5e11        postgresondocker:9.3   "/usr/lib/postgresql…"   About a minute ago   Up About a minute   5432/tcp            postgresondocker

Datapersistens

Docker-containere er af flygtig natur, dvs. data, som bruges eller genereres af containeren, gemmes ikke implicit nogen steder. Vi mister dataene, hver gang containeren genstartes eller slettes. Docker leverer mængder, som vi kan gemme de vedvarende data på. Det er en nyttig funktion, hvormed vi kan klargøre en anden container ved hjælp af samme volumen eller data i tilfælde af en katastrofe.

Lad os oprette en datavolumen og bekræfte dens oprettelse.

# sudo docker volume create pgdata
pgdata

# sudo docker volume ls
DRIVER              VOLUME NAME
local                   pgdata

Nu skal vi bruge denne datavolumen, mens vi kører Postgres-beholderen. Sørg for at slette den ældre postgres-beholder, som kører uden volumener.

# sudo docker container rm postgresondocker -f 
postgresondocker

# sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -d postgresondocker:9.3

Vi har kørt Postgres-beholderen med en datavolumen knyttet til den.

Opret en ny tabel i Postgres for at kontrollere datapersistens.

# docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
Password for user postgresondocker: 
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.

postgresondocker=# \dt
No relations found.
postgresondocker=# create table test(id int);
CREATE TABLE
postgresondocker=# \dt 
            List of relations
 Schema | Name | Type  |      Owner       
--------+------+-------+------------------
 public | test | table | postgresondocker
(1 row)

Slet Postgres-beholderen.

# sudo docker container rm postgresondocker -f 
postgresondocker

Opret en ny Postgres-beholder og bekræft, at testtabellen er til stede eller ej.

# sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -d postgresondocker:9.3


# docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
Password for user postgresondocker: 
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.

postgresondocker=# \dt
            List of relations
 Schema | Name | Type  |      Owner       
--------+------+-------+------------------
 public | test | table | postgresondocker
(1 row)
Download Whitepaper Today PostgreSQL Management &Automation med ClusterControlFå flere oplysninger om, hvad du skal vide for at implementere, overvåge, administrere og skalere PostgreSQLDownload Whitepaper

Eksponer PostgreSQL-tjenesten for værten

Du har måske bemærket, at vi ikke har afsløret nogen port af PostgreSQL-containeren tidligere. Det betyder, at PostgreSQL kun er tilgængelig for de containere, der er i det postgres-netværk, vi oprettede tidligere.

For at bruge PostgreSQL-tjenesten er vi nødt til at afsløre containerport ved hjælp af --port option. Her har vi afsløret Postgres containerport 5432 på værtens port 5432.

# sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -p 5432:5432 -d postgresondocker:9.3
# sudo docker container ls
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
997580c86188        postgresondocker:9.3   "/usr/lib/postgresql…"   8 seconds ago       Up 10 seconds       0.0.0.0:5432->5432/tcp   postgresondocker

Nu kan du forbinde PostgreSQL på localhost direkte.

# psql -h localhost -U postgresondocker --password
Password for user postgresondocker: 
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.

postgresondocker=#

Sletning af beholder

For at slette containeren skal vi først stoppe den kørende container og derefter slette containeren ved hjælp af rm-kommandoen.

# sudo docker container stop postgresondocker 

# sudo docker container rm postgresondocker
postgresondocker

Brug -f (--force) mulighed for direkte at slette den kørende container.

# sudo docker container rm postgresondocker -f
postgresondocker

Forhåbentlig har du nu dit eget dockeriserede lokale miljø til PostgreSQL.

Bemærk: Denne artikel giver et overblik over, hvordan vi kan bruge PostgreSQL på docker til udvikling/POC-miljø. At køre PostgreSQL i produktionsmiljøet kan kræve yderligere ændringer i PostgreSQL- eller docker-konfigurationerne.

Konklusion

Der er en enkel måde at køre PostgreSQL-database inde i en Docker-container. Docker indkapsler effektivt implementering, konfiguration og visse administrationsprocedurer. Docker er et godt valg til at implementere PostgreSQL med minimal indsats. Alt du skal gøre er at starte en forudbygget Docker-container, og du vil have PostgreSQL-database klar til din tjeneste.

Referencer

  • Dockerinstallation:https://docs.docker.com/install
  • Bind:https://docs.docker.com/storage/volumes
  • Brugerdefinerede netværk:https://docs.docker.com/network/
  • Postgres Docker-fil:https://docs.docker.com/engine/examples/postgresql_service
  • MySQL på Docker:Understanding the Basics:https://severalnines.com/blog/mysql-docker-containers-understanding-basics

  1. JSON_INSERT() vs JSON_SET() vs JSON_REPLACE() i SQLite

  2. 2 funktioner, der returnerer måneden fra en dato i Oracle

  3. Oracle-klientinstallationsfejl - stien er for lang

  4. Udviklingen og fremtiden for Microsoft Access