使用docker容器连接到nginx反向代理后面的postgres数据库

使用docker容器连接到nginx反向代理后面的postgres数据库

我已经设置了一个 postgres 数据库容器,并且可以使用其发布的端口 5434 直接连接和查询它。

目标是稍后部署测试数据库并通过 nginx 反向代理访问它。我不知道连接到已部署的测试数据库的最佳方法是什么。请指教。

我尝试使用本地容器通过 nginx 反向代理连接到 postgres 数据库。

使用命令:

psql -h localhost -p 5435 -U postgres database_name_container_test

Nginx 显示错误:

reverse-proxy | 2021/10/29 20:06:57 [info] 32#32: *17 client 172.25.0.1:56630 connected to 0.0.0.0:5435
reverse-proxy | 2021/10/29 20:06:57 [error] 32#32: *17 connect() failed (111: Connection refused) while connecting to upstream, client: 172.25.0.1, server:
0.0.0.0:5435, upstream: "172.25.0.3:5434", bytes from/to client:0/0, bytes from/to upstream:0/0

nginx.conf:

stream {    
    upstream database_test {
        server postgres_test:5434;
    }
    server {
        listen 5435 so_keepalive=on;
        proxy_pass database_test;

    }
}

test_db docker-compose:

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:

networks:
  common-network: #name in this docker-compose file
    name: common-network # the actual name of the 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

答案1

当通过名称连接到 Docker 容器时,您应该使用服务的公开端口,即5432,因为您直接连接到客户机:

        server postgres_test:5432;

另一方面,已发布的端口5434出现在主机上,因此您也应该能够通过这种方式访问​​服务:

        server localhost:5434;

我不推荐这样做,因为您需要考虑未来管理的端口映射(而不仅仅是知道容器名称和标准暴露端口)。

相关内容