Вопрос или проблема
Я настроил контейнер базы данных Postgres и могу подключаться и выполнять запросы непосредственно, используя его опубликованный порт 5434.
Цель – развернуть тестовую базу данных позже и получить к ней доступ через обратный прокси nginx.
Я не знаю, какой лучший способ подключиться к развернутой тестовой базе данных. Пожалуйста, посоветуйте.
Я пытался подключиться к базе данных Postgres через обратный прокси nginx, используя локальные контейнеры.
Используя команду:
psql -h localhost -p 5435 -U postgres имя_базы_данных_контейнера_тест
Nginx показывает ошибку:
reverse-proxy | 2021/10/29 20:06:57 [info] 32#32: *17 клиент 172.25.0.1:56630 подключился к 0.0.0.0:5435
reverse-proxy | 2021/10/29 20:06:57 [error] 32#32: *17 connect() не удалось (111: Подключение отклонено) при подключении к upstream, клиент: 172.25.0.1, сервер:
0.0.0.0:5435, upstream: "172.25.0.3:5434", байты от/к клиенту:0/0, байты от/к upstream:0/0
nginx.conf:
stream {
upstream database_test {
server postgres_test:5434;
}
server {
listen 5435 so_keepalive=on;
proxy_pass database_test;
}
}
docker-compose для test_db:
services:
postgres_test:
container_name: postgres_test
image: postgis/postgis
restart: always
expose:
- 5432
ports:
- 5434:5432
volumes:
- ./backup:/backup
- ./postgres-init-db.sh:/docker-entrypoint-initdb.d/postgres-init-db.sh
- postgres_test_data:/var/lib/postgresql/data
env_file:
- ./.env.postgres
networks:
- common-network
volumes:
postgres_test_data:
networks:
common-network:
external:
name: common-network
docker-compose для reverse-proxy:
networks:
common-network: #имя в этом файле docker-compose
name: common-network # фактическое имя сети
services:
nginx:
image: nginx:1.20.1
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- 80:80
- 443:443
- 5435:5435
container_name: reverse-proxy
networks:
- common-network
Кроме того, я проверил файлы конфигурации postgres, они выглядят правильно:
cat postgresql.conf | grep listen_addresses
listen_addresses="*"
cat pg_hba.conf | grep host
host all all all md5
При подключении к контейнеру Docker по имени следует использовать открытый порт сервиса, т.е. 5432
, так как вы подключаетесь непосредственно к гостю:
server postgres_test:5432;
С другой стороны, опубликованный порт 5434
становится доступен на хосте, поэтому вы также должны иметь возможность получить доступ к сервисам таким образом:
server localhost:5434;
Чего я не рекомендую, так как вам нужно учитывать сопоставление портов для будущего администрирования (вместо того, чтобы просто знать имя контейнера и стандартный открытый порт).
Ответ или решение
Подключение к базе данных PostgreSQL за обратным прокси-сервером Nginx с использованием контейнеров Docker
В нашей задаче нам необходимо настроить соединение с контейнером PostgreSQL через обратный прокси-сервер Nginx, используя Docker. Этот процесс может показаться сложным в первый момент, но, следуя этим шагам, вы сможете организовать стабильное и безопасное подключение.
1. Настройка Docker Compose
Давайте начнем с конфигурации docker-compose. Убедитесь, что у вас есть два сервиса: один для PostgreSQL и другой для Nginx, как показано ниже.
docker-compose.yml для PostgreSQL
version: '3.8'
services:
postgres_test:
container_name: postgres_test
image: postgis/postgis
restart: always
expose:
- 5432
ports:
- 5434:5432
volumes:
- ./backup:/backup
- ./postgres-init-db.sh:/docker-entrypoint-initdb.d/postgres-init-db.sh
- postgres_test_data:/var/lib/postgresql/data
env_file:
- ./.env.postgres
networks:
- common-network
volumes:
postgres_test_data:
networks:
common-network:
external:
name: common-network
docker-compose.yml для Nginx
version: '3.8'
services:
nginx:
image: nginx:1.20.1
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- 80:80
- 443:443
- 5435:5435
container_name: reverse-proxy
networks:
- common-network
networks:
common-network:
external:
name: common-network
2. Конфигурация Nginx
Конфигурация Nginx в файле nginx.conf должна быть правильной для обработки соединений с PostgreSQL. Вот как она может выглядеть:
stream {
upstream database_test {
server postgres_test:5432; # используем внутренний порт
}
server {
listen 5435 so_keepalive=on;
proxy_pass database_test;
}
}
Обратите внимание, что в определении upstream
мы используем postgres_test:5432
, что указывает на порт, на котором PostgreSQL слушает внутри контейнера.
3. Настройка сети
Обязательно проверьте, что оба контейнера находятся в одной и той же сети (в данном случае common-network
). Это обеспечит корректное разрешение имен между сервисами.
4. Проверка конфигурации PostgreSQL
Вам нужно убедиться, что ваш PostgreSQL настроен для прослушивания всех адресов. Проверьте следующий параметр в файле postgresql.conf
:
listen_addresses = '*'
И в pg_hba.conf
должны быть записи для разрешения подключения:
host all all all md5
5. Подключение к базе данных
После того как все настройки выполнены, вы можете подключиться к вашей базе данных, используя следующую команду:
psql -h localhost -p 5435 -U postgres database_name_container_test
Здесь вы указываете localhost
и порт 5435
, что указывает на Nginx, который в свою очередь будет проксировать запросы в контейнер PostgreSQL.
Заключение
В итоге, настройка подключения к базе данных PostgreSQL через Nginx в Docker требует тщательной конфигурации. Обеспечение правильного маршрутизации, настроек сети и конфигурации PostgreSQL – ключ к успешному подключению. Следуя представленным шагам, вы сможете безопасно подключаться к вашей тестовой базе данных, даже когда она развернута на удаленном сервере.