sql >> Databáze >  >> RDS >> PostgreSQL

Nasazení PostgreSQL na kontejneru Docker

Úvod

Docker modernizoval způsob, jakým aplikaci vytváříme a nasazujeme. Umožňuje nám vytvářet lehké, přenosné, soběstačné kontejnery, ve kterých lze snadno spustit jakoukoli aplikaci.

Účelem tohoto blogu je vysvětlit, jak používat Docker ke spuštění databáze PostgreSQL. Nezahrnuje instalaci ani konfiguraci dockeru. Pokyny k instalaci dockeru naleznete zde. Některé další pozadí lze nalézt v našem předchozím blogu o MySQL a Docker.

Než se pustíme do podrobností, zopakujme si nějakou terminologii.

  • Dockerfile
    Obsahuje sadu pokynů/příkazů k instalaci nebo konfiguraci aplikace/softwaru.
  • Obrázek dockeru
    Docker image se skládá ze série vrstev, které představují instrukce z Dockerfile. Obrázek Docker se používá jako šablona pro vytvoření kontejneru.
  • Propojení kontejnerů a uživatelem definované sítě
    Docker používal most jako výchozí síťový mechanismus a ke vzájemnému propojení kontejnerů používal --links. Pro přístup ke kontejneru PostgreSQL z aplikačního kontejneru je třeba propojit oba kontejnery při vytváření. Zde v tomto článku používáme uživatelem definované sítě, protože funkce propojení bude brzy ukončena.
  • Stálost dat v Dockeru
    Ve výchozím nastavení jsou data uvnitř kontejneru pomíjivá. Kdykoli se kontejner restartuje, data budou ztracena. Svazky jsou preferovaným mechanismem pro uchování dat generovaných a používaných kontejnerem Docker. Zde připojujeme hostitelský adresář do kontejneru, kde jsou uložena všechna data.

Začněme vytvářet náš obraz PostgreSQL a používat jej ke spuštění kontejneru.

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"]

Pokud se na Dockerfile podíváte pozorně, skládá se z příkazů, které se používají k instalaci PostgreSQL a provádění některých konfiguračních změn na OS ubuntu.

Vytváření obrazu PostgreSQL

Můžeme vytvořit obraz PostgreSQL z Dockerfile pomocí příkazu docker build.

# sudo docker build -t postgresondocker:9.3 .

Zde můžeme k obrázku zadat značku (-t), jako je název a verze. Tečka (.) na konci určuje aktuální adresář a používá soubor Dockerfile přítomný v aktuálním adresáři. Název souboru Docker by měl být „Dockerfile“. Pokud chcete zadat vlastní název souboru dockeru, měli byste použít -f v příkazu sestavení dockeru.

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

Výstup:(Pokud je to možné, použijte textové okno posuvníku)

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

Vytvoření kontejnerové sítě

Použijte níže uvedený příkaz k vytvoření uživatelem definované sítě s ovladačem mostu.

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

Potvrdit vytvoření sítě

# 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

Vytvoření kontejneru

K vytvoření kontejneru z obrazu dockeru musíme použít příkaz „docker run“. Spouštíme kontejner postgres v režimu démonizace s pomocí volby -d.

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

Pomocí níže uvedeného příkazu potvrďte vytvoření kontejneru.

# 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

Nespecifikovali jsme žádný port, který se má zpřístupnit, takže to zpřístupní výchozí postgres port 5432 pro interní použití. PostgreSQL je k dispozici pouze ze sítě Docker, nebudeme mít přístup k tomuto kontejneru Postgres na hostitelském portu.

Jak získat přístup ke kontejneru Postgres na hostitelském portu, uvidíme v pozdější části tohoto článku.

Připojování ke kontejneru PostgreSQL v síti Docker

Zkusme se připojit ke kontejneru Postgres z jiného kontejneru v rámci stejné sítě Docker, kterou jsme vytvořili dříve. Zde jsme pro připojení k Postgres použili klienta psql. Použili jsme název kontejneru Postgres jako název hostitele, uživatele a heslo obsažené v souboru Docker.

# 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=# 

Možnost --rm v příkazu run odstraní kontejner, jakmile ukončíme proces psql.

# 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

Stálost dat

Docker kontejnery jsou pomíjivé povahy, tj. data, která kontejner používá nebo generuje, nejsou nikde implicitně uložena. Při každém restartování nebo smazání kontejneru o data přijdeme. Docker poskytuje svazky, na kterých můžeme ukládat trvalá data. Je to užitečná funkce, pomocí které můžeme v případě katastrofy zajistit jiný kontejner využívající stejný objem nebo data.

Vytvořme datový svazek a potvrďte jeho vytvoření.

# sudo docker volume create pgdata
pgdata

# sudo docker volume ls
DRIVER              VOLUME NAME
local                   pgdata

Nyní musíme tento objem dat použít při spuštění kontejneru Postgres. Ujistěte se, že jste smazali starší kontejner postgres, který běží bez svazků.

# 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

Spustili jsme kontejner Postgres s připojeným objemem dat.

Vytvořte novou tabulku v Postgresu, abyste zkontrolovali stálost dat.

# 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)

Smažte kontejner Postgres.

# sudo docker container rm postgresondocker -f 
postgresondocker

Vytvořte nový kontejner Postgres a potvrďte přítomnost nebo nepřítomnost testovací tabulky.

# 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)
Stáhněte si Whitepaper Today Správa a automatizace PostgreSQL s ClusterControlZjistěte, co potřebujete vědět k nasazení, monitorování, správě a škálování PostgreSQLStáhněte si Whitepaper

Vystavte službu PostgreSQL hostiteli

Možná jste si všimli, že jsme dříve nezveřejnili žádný port kontejneru PostgreSQL. To znamená, že PostgreSQL je přístupný pouze pro kontejnery, které jsou v síti postgres, kterou jsme vytvořili dříve.

Abychom mohli používat službu PostgreSQL, musíme odhalit kontejnerový port pomocí volby --port. Zde jsme odhalili port kontejneru Postgres 5432 na portu 5432 hostitele.

# 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

Nyní můžete PostgreSQL připojit přímo na localhost.

# 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=#

Smazání kontejneru

Chcete-li kontejner odstranit, musíme nejprve zastavit běžící kontejner a poté kontejner odstranit pomocí příkazu rm.

# sudo docker container stop postgresondocker 

# sudo docker container rm postgresondocker
postgresondocker

Použijte volbu -f (--force) k přímému odstranění běžícího kontejneru.

# sudo docker container rm postgresondocker -f
postgresondocker

Doufejme, že nyní máte své vlastní dockerizované místní prostředí pro PostgreSQL.

Poznámka: Tento článek poskytuje přehled o tom, jak můžeme použít PostgreSQL na dockeru pro vývojové/POC prostředí. Spuštění PostgreSQL v produkčním prostředí může vyžadovat další změny v konfiguraci PostgreSQL nebo dockeru.

Závěr

Existuje jednoduchý způsob, jak spustit databázi PostgreSQL v kontejneru Docker. Docker efektivně zapouzdřuje nasazení, konfiguraci a určité postupy správy. Docker je dobrá volba pro nasazení PostgreSQL s minimálním úsilím. Vše, co musíte udělat, je spustit předem vytvořený kontejner Docker a budete mít databázi PostgreSQL připravenou pro vaši službu.

Odkazy

  • Instalace dockeru:https://docs.docker.com/install
  • Svazky:https://docs.docker.com/storage/volumes
  • Sítě definované uživatelem:https://docs.docker.com/network/
  • Soubor Postgres Docker:https://docs.docker.com/engine/examples/postgresql_service
  • MySQL na Docker:Pochopení základů:https://severalnines.com/blog/mysql-docker-containers-understanding-basics

  1. Co je bezplatný nástroj pro porovnání dvou databází SQL Server?

  2. Chyba Postgresu při aktualizaci dat sloupce

  3. Automatizované testování záloh PostgreSQL

  4. Dokážete VYBRAT všechno, kromě 1 nebo 2 polí, bez spisovatelské křeče?