Git Product home page Git Product logo

otus-postgres-docker's Introduction

Postgres + Docker

Простой запуск

docker run --name otus-pg -e POSTGRES_PASSWORD=password -d postgres

Подключимся к контейнеру

docker exec -it otus-pg psql --username=postgres --dbname=postgres

Посмотрим, какие базы данных есть

\list

Закроем подключение

\q

При таком запуске мы не сможем подключаться из внешних сервисов, и все данные будут удалены после остановки контейнера. Добавим порты и место сохранения данных

docker run --name otus-pg \
-p 5432:5432 \
-v ./data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=password \
-d postgres:16

Добавим также определение пользователя и базы данных

docker run --name otus-pg \
-p 5432:5432 \
-v ./data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=otuspassword \
-e POSTGRES_USER=otususer \
-e POSTGRES_DB=otusdb \
-d postgres:16

Теперь уже подключаемся с нормальным пользователем

docker exec -it otus-pg psql --username=otususer --dbname=otusdb

Посмотрим, какие базы данных есть

\list

Инициализация структуры

docker run --name otus-pg \
-p 5432:5432 \
-v ./data:/var/lib/postgresql/data \
-v ./init:/docker-entrypoint-initdb.d \
-e POSTGRES_PASSWORD=otuspassword \
-e POSTGRES_USER=otususer \
-e POSTGRES_DB=otusdb \
-d postgres:16

Подключаемся

docker exec -it otus-pg psql --username=otususer --dbname=otusdb

Проверим доступные расширения

SELECT * FROM pg_extension;

Посмотрим, какие базы данных есть

\list

Посмотрим, что есть в базе данных otusdb

\c otusdb
\dt
select * from people limit 10;

Список всех переменных окружения доступен по ссылке:

Docker compose

Простой запуск

docker compose -f 01-postgres.yml up -d

Здесь можно также примонтировать и папку для сохранения бекапов, потому что при запуске pgdump она будет запускаться внутри контейнера

docker exec -it postgres pg_dumpall -U otususer -f /backups/dump.sql

Альтернативным вариантом может быть вывод через пайп

docker exec -it postgres pg_dump -U otususer -d otusdb > otusdb.sql

Про docker compose:

Про тома (volumes) и их настройку:

Про утилиты для бекапов:

Настройка параметров в docker-compose

  • Порты, тома, переменные окружения
  • Политики перезапуска
  • Проверки Healthcheck - Основная задача – как можно скорее уведомить среду, управляющую контейнером, о том, что с контейнером что-то не так. И самая простая стратегия решения проблемы – перезапуск контейнера.
  • Ограничение ресурсов

Простой запуск 02-health.yml.

docker compose -f 02-health.yml up -d

Настройка параметров базы данных

docker exec -it postgres psql --username=otususer --dbname=otusdb

Посмотреть список установленных расширений можно с помощью запроса select * from pg_extension;.

Команда show позволит узнать текущее значение того или иного параметра, например: show random_page_cost;.

Настройки можно задавать через команды при запуске

docker compose -f 03-settings.yml up -d

Можно сделать проще и указать сразу файл конфигурации

docker compose -f 04-config.yml up -d

Команда show позволит узнать текущее значение того или иного параметра, например: show random_page_cost;.

docker exec -it postgres psql --username=otususer --dbname=otusdb -c "show max_connections;"

Запуск нескольких сервисов сразу

Преимуществом docker-compose является возможность одновременного запуска сразу нескольких сервисов, которые могут взаимодействовать с собой. Они могут обращаться к друг другу по имени контейнера и работать в одной внутренней изолированной сети.

  • pgAdmin - графический клиент для работы с сервером
  • pgbouncer - управление пулом соединений
  • prometheus - база данных для сбора метрик
  • postgres-exporter - поставщик метрик postgres для prometheus
  • grafana - визуализация метрик в красивых дашбордах
docker compose -f 05-monitoring.yml up -d

PgAdmin

http://localhost:5050

Проверка метрики

http://localhost:9187/metrics

Grafana

http://localhost:3000

Настройка Prometheus и Grafana

Дашборды

Bitnami

Попробуем поднять небольшой кластер с помощью образа от bitnami, который включает в себя сразу Postgres и repmgr от EnterpriseDB.

docker compose -f 06-bitnami.yml up -d

Посмотрим, что есть на мастере

docker exec postgres_1 psql -c "select * from people order by id desc limit 10;" "dbname=otusdb user=otususer password=otuspassword"

Посмотрим, что есть на реплике

docker exec postgres_2 psql -c "select * from people order by id desc limit 10;" "dbname=otusdb user=otususer password=otuspassword"

Добавим запись на мастер

docker exec postgres_1 psql -c "insert into people (id, first_name, last_name, email, gender, ip_address) values (1001, 'John', 'Doe', '[email protected]', 'Male', '127.0.0.1')" "dbname=otusdb user=otususer password=otuspassword"

Удалим записи на мастере

docker exec postgres_1 psql -c "delete from people where id < 1000" "dbname=otusdb user=otususer password=otuspassword"

Останавливаем postgres_1

docker stop postgres_1
docker logs postgres_2

После этого реплика становится мастером и может принимать запросы на запись.

Запускаем postgres_1

docker start postgres_1
docker logs postgres_2
docker logs postgres_1

Он поднимется, увидит, что есть новый мастер, и продолжит функционировать как реплика.

Чтобы понять в какой роли функционирует конкретный хост, можно воспользоваться запросом.

docker exec postgres_1 psql -c "select case when pg_is_in_recovery() then 'secondary' else 'primary' end as host_status;" "dbname=otusdb user=otususer password=otuspassword"

docker exec postgres_2 psql -c "select case when pg_is_in_recovery() then 'secondary' else 'primary' end as host_status;" "dbname=otusdb user=otususer password=otuspassword"

Полезные материалы:

otus-postgres-docker's People

Contributors

rymbln avatar

Stargazers

 avatar leo avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.