PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Разгръщане на PostgreSQL в Docker контейнер

Въведение

Docker модернизира начина, по който изграждаме и внедряваме приложението. Позволява ни да създаваме леки, преносими, самодостатъчни контейнери, които могат лесно да изпълняват всяко приложение.

Този блог има за цел да обясни как да използвате Docker за стартиране на PostgreSQL база данни. Не обхваща инсталирането или конфигурацията на docker. Моля, вижте инструкциите за инсталиране на docker тук. Допълнителна информация може да бъде намерена в предишния ни блог за MySQL и Docker.

Преди да навлезем в подробности, нека прегледаме малко терминология.

  • Dockerfile
    Той съдържа набор от инструкции/команди за инсталиране или конфигуриране на приложението/софтуера.
  • Изображение на Docker
    Изображението на Docker е изградено от поредица от слоеве, които представляват инструкции от Dockerfile. Изображението на Docker се използва като шаблон за създаване на контейнер.
  • Свързване на контейнери и дефинирана от потребителя мрежа
    Docker използва bridge като мрежов механизъм по подразбиране и използва --links за свързване на контейнерите един с друг. За достъп до PostgreSQL контейнер от контейнер на приложение, трябва да свържете двата контейнера по време на създаване. Тук в тази статия използваме потребителски дефинирани мрежи, тъй като функцията за връзка скоро ще бъде оттеглена.
  • Устойчивост на данните в Docker
    По подразбиране данните в контейнера са ефимерни. Всеки път, когато контейнерът се рестартира, данните ще бъдат загубени. Обемите са предпочитаният механизъм за запазване на данните, генерирани и използвани от Docker контейнер. Тук монтираме хост директория в контейнера, където се съхраняват всички данни.

Нека започнем да изграждаме нашето PostgreSQL изображение и да го използваме за стартиране на контейнер.

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

Ако погледнете отблизо Dockerfile, той се състои от команди, които се използват за инсталиране на PostgreSQL и извършване на някои промени в конфигурацията на ubuntu OS.

Изграждане на PostgreSQL изображение

Можем да изградим PostgreSQL изображение от Dockerfile с помощта на командата docker build.

# sudo docker build -t postgresondocker:9.3 .

Тук можем да посочим етикета (-t) към изображението като име и версия. Точката (.) в края указва текущата директория и използва Dockerfile, присъстващ в текущата директория. Името на Docker файла трябва да бъде „Dockerfile“. Ако искате да зададете персонализирано име за вашия docker файл, тогава трябва да използвате -f в командата за изграждане на docker.

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

Изход:(По избор използвайте текстов прозорец на лентата за превъртане, ако е възможно)

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

Създаване на контейнерна мрежа

Използвайте командата по-долу, за да създадете дефинирана от потребителя мрежа с драйвер за мост.

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

Потвърдете създаването на мрежа

# 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

Създаване на контейнер

Трябва да използваме командата „docker run“, за да създадем контейнер от изображението на docker. Ние изпълняваме postgres контейнера в демонизиращ режим с помощта на опция -d.

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

Използвайте командата по-долу, за да потвърдите създаването на контейнера.

# 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

Не сме посочили нито един порт, който да изложим, така че той ще изложи стандартния postgres порт 5432 за вътрешна употреба. PostgreSQL е достъпен само от мрежата на Docker, няма да имаме достъп до този Postgres контейнер на хост порт.

Ще видим как да получите достъп до контейнера Postgres на хост порта в по-късен раздел в тази статия.

Свързване с PostgreSQL контейнер в Docker мрежа

Нека се опитаме да се свържем с контейнера Postgres от друг контейнер в рамките на същата Docker мрежа, която създадохме по-рано. Тук сме използвали psql клиент, за да се свържем с Postgres. Използвахме името на контейнера Postgres като име на хост, потребител и парола, присъстващи във файла на 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=# 

Опцията --rm в командата run ще премахне контейнера, след като прекратим процеса на 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

Постоянство на данните

Docker контейнерите са ефимерни по природа, т.е. данните, които се използват или генерират от контейнера, не се съхраняват никъде имплицитно. Губим данните всеки път, когато контейнерът се рестартира или изтрива. Docker предоставя томове, в които можем да съхраняваме постоянните данни. Това е полезна функция, чрез която можем да предоставим друг контейнер, използвайки същия обем или данни в случай на бедствие.

Нека създадем обем с данни и да потвърдим създаването му.

# sudo docker volume create pgdata
pgdata

# sudo docker volume ls
DRIVER              VOLUME NAME
local                   pgdata

Сега трябва да използваме този обем данни, докато изпълняваме контейнера Postgres. Уверете се, че сте изтрили по-стария postgres контейнер, който работи без томове.

# 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

Пуснахме контейнера Postgres с прикачен обем данни към него.

Създайте нова таблица в Postgres, за да проверите устойчивостта на данните.

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

Изтрийте контейнера Postgres.

# sudo docker container rm postgresondocker -f 
postgresondocker

Създайте нов контейнер Postgres и потвърдете дали тестовата таблица е налице или не.

# 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)
Изтеглете Бялата книга днес Управление и автоматизация на PostgreSQL с ClusterControl Научете какво трябва да знаете, за да внедрите, наблюдавате, управлявате и мащабирате PostgreSQLD Изтеглете Бялата книга

Изложете услугата PostgreSQL на хоста

Може да сте забелязали, че не сме изложили нито един порт на контейнера PostgreSQL по-рано. Това означава, че PostgreSQL е достъпен само за контейнерите, които са в postgres-мрежата, която създадохме по-рано.

За да използваме услугата PostgreSQL, трябва да изложим порта на контейнера, използвайки опцията --port. Тук разкрихме порта на контейнера Postgres 5432 на порт 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

Сега можете да свържете PostgreSQL директно на 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=#

Изтриване на контейнер

За да изтрием контейнера, трябва първо да спрем работещия контейнер и след това да изтрием контейнера с помощта на командата rm.

# sudo docker container stop postgresondocker 

# sudo docker container rm postgresondocker
postgresondocker

Използвайте опцията -f (--force), за да изтриете директно работещия контейнер.

# sudo docker container rm postgresondocker -f
postgresondocker

Надяваме се, че вече имате своя собствена докеризирана локална среда за PostgreSQL.

Забележка: Тази статия предоставя общ преглед на това как можем да използваме PostgreSQL в docker за среда за разработка/POC. Изпълнението на PostgreSQL в производствена среда може да изисква допълнителни промени в конфигурациите на PostgreSQL или docker.

Заключение

Има лесен начин да стартирате PostgreSQL база данни в Docker контейнер. Docker ефективно капсулира внедряване, конфигуриране и определени административни процедури. Docker е добър избор за внедряване на PostgreSQL с минимални усилия. Всичко, което трябва да направите, е да стартирате предварително изграден Docker контейнер и ще имате PostgreSQL база данни, готова за вашата услуга.

Препратки

  • Инсталиране на Docker:https://docs.docker.com/install
  • Томове:https://docs.docker.com/storage/volumes
  • Мрежи, дефинирани от потребителя:https://docs.docker.com/network/
  • Postgres Docker файл:https://docs.docker.com/engine/examples/postgresql_service
  • MySQL на Docker:Разбиране на основите:https://severalnines.com/blog/mysql-docker-containers-understanding-basics

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. СЪЗДАВАНЕ НА ЕЗИК plpython3u – PostgreSQL 9.6

  2. Как работи функцията Power() в PostgreSQL

  3. Ограничение за проверка на PostgreSQL за условие за външен ключ

  4. Postgres ръчно променя последователността

  5. Използване на pyspark за свързване с PostgreSQL