我有一个docker容器与多个postgresql数据库:
version: "3.7"
services:
nginx:
image: nginx:1.18.0-alpine
ports:
- 8028:80
volumes:
- ./nginx/localhost/conf.d:/etc/nginx/conf.d
depends_on:
- webapp
networks:
- postgresql_network
postgresql:
image: "postgres:13-alpine"
restart: always
volumes:
- type: bind
source: ../DO_NOT_DELETE_POSTGRESQL_DATA
target: /var/lib/postgresql/data
environment:
POSTGRES_DB: db1
POSTGRES_USER: simha
POSTGRES_PASSWORD: krishna
PGDATA: "/var/lib/postgresql/data/pgdata"
networks:
- postgresql_network
postgresql2:
image: "postgres:13-alpine"
restart: always
volumes:
- type: bind
source: ../DO_NOT_DELETE_POSTGRESQL_DATA2
target: /var/lib/postgresql/data
environment:
POSTGRES_DB: db2
POSTGRES_USER: simha
POSTGRES_PASSWORD: krishna
PGDATA: "/var/lib/postgresql/data/pgdata"
networks:
- postgresql_network
networks:
postgresql_network:
driver: bridge
现在我可以为每个postgresq实例公开两个不同的端口,并以不同的方式访问它们(如localhost 5432和localhost 5445)
但是我想用不同的域名来处理它们。
如pg1.docker.db
,端口8028
(nginx端口)和pg.docker.db
,端口8028
(nginx端口),并使用nginx内部反向代理它们到不同的docker容器使用postgresql
和postgresql2
,在主机/etc/hosts
中,我将使用
127.0.0.1 pg1.docker.db
127.0.0.1 pg2.docker.db
我不确定,但类似的东西。谁能说我做得对吗
## WEBSERVER
upstream webapp {
server webapp:8000;
}
server {
listen 80;
location / {
proxy_pass http://webapp;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
}
}
## POSTGRESQL DBS
upstream postgres {
server postgresql:5432;
}
upstream postgres2 {
server postgresql2:5432;
}
server {
listen 80 so_keepalive=on;
server_name db1.domain.my;
proxy_pass postgres;
}
server {
listen 80 so_keepalive=on;
server_name db2.domain.my;
proxy_pass postgres2;
}
我发现人们使用stream
和http
。以上也会工作吗?或者我应该做些什么
基于域名重定向http请求非常容易。你可以这样写:
http {
server {
listen 80;
server_name pg1.docker.db
location / {
...
}
}
server {
listen 80;
server_name pg2.docker.db;
location / {
...
}
}
}
但是这里的问题是nginx只转发http请求到服务器,所以除非你的容器后面有一个基于web的接口,否则它不会正常工作。