我有一个带有nginx代理容器的VPS,我用phpmyadmin服务创建了一些wordpress网站。如果我想用这个定义创建另一个站点,我会遇到“相同端口”的问题。好的,我可以将端口更改为2998,它可以正常工作,但是我需要为我的VPS添加一个新的开放端口。我不想添加或更改每个站点的端口。
现在:
是否有一种方法可以按域地址引导我找到合适的容器?
我的nginx代理定义
networks:
nginx-proxy:
external: false
name: nginx-reverse-proxy
default:
name: nginx-reverse-proxy-default
version: '2'
services:
nginx-proxy:
build:
context: .nginx-proxy
dockerfile: Dockerfile
container_name: nginx-proxy
ports:
- 80:80
- 443:443
restart: always
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- .nginx-proxy/certs:/etc/nginx/certs:ro
- .nginx-proxy/vhost.d:/etc/nginx/vhost.d
- .nginx-proxy/dhparam:/etc/nginx/dhparam
- /usr/share/nginx/html
networks:
- nginx-proxy
nginx-proxy-acme:
image: nginxproxy/acme-companion
container_name: nginx-proxy-acme
restart: always
volumes_from:
- nginx-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- .nginx-proxy/certs:/etc/nginx/certs:rw
- .nginx-proxy-acme/acme:/etc/acme.sh,这是我的wordpress站点定义
version: "3.9"
volumes:
database_volume: {}
x-logging:
&default-logging
driver: json-file
options:
max-size: '1m'
max-file: '3'
services:
web:
build:
context: ./.docker
dockerfile: Dockerfile_web
container_name: test_web
ports:
- '3000:80'
volumes:
- ./wp:/var/www
depends_on:
- database
- php
restart: always
logging: *default-logging
database:
image: mariadb:latest
container_name: test_database
environment:
MYSQL_USER: wp
MYSQL_PASSWORD: wp
MYSQL_DATABASE: wp
MYSQL_ROOT_PASSWORD: wp
volumes:
- ./database_volume:/var/lib/mysql
expose:
- 3306
restart: always
logging: *default-logging
php:
build:
context: ./.docker
dockerfile: Dockerfile_php
container_name: test_php
working_dir: /var/www/
volumes:
- ./wordpress:/var/www
restart: always
logging: *default-logging
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: test_phpmyadmin
links:
- database:db
ports:
- '2999:80'
restart: always
logging: *default-logging发布于 2022-03-07 12:49:40
你想要的是不可能的,但你可能并不真正想要它。当您仔细考虑您想要配置的内容,以及如果用户转到任何一个URL时会发生什么情况,就会变得很清楚:
您已经将443
example-a.com配置为指向您的IP
nginx-proxy容器配置为侦听端口80,而希望将WordPress容器配置为同时侦听端口2999acme-companion,将nginx容器配置为转发请求主机<代码>D18的HTTP请求,以进入容器,例如端口2999,和请求example-b.com到带有端口example-b.com的容器B现在,您可以立即看到,您有两件事试图在同一个网络接口上侦听端口2999 --这不起作用,但它不能,因为在解析请求之前,谁会处理接收到的请求,以找出它想要的主机?容器A不能接受请求,如果请求是针对B的,则提交请求-A不知道B。
因此,如果您考虑到一个用户向example-a.com:2999发送请求,那么真正发生的情况是,一个请求会转到<yourip>:2999,就像一个用户转到example-b.com:2999,它最终会转到<yourip>:2999。
如何解决这个问题呢?通过让接受用户请求的第三个容器C检查请求,并根据他们是否需要容器A或B,将请求交给A或B。
最棒的事情是:你已经拥有了!容器C实际上是您的nginx容器,它正在监听端口80/443。因此,如果用户在不提供端口的情况下进入example-a.com,它将转到80或443 (取决于他们是使用http还是https)。然后,nginx将分析请求,并将其发送到正确的容器。因此,A和B端口监听什么并不重要,因为对外部世界来说,他们似乎在监听80/443。
因此,真正的答案是,虽然您不能将自定义端口与虚拟主机组合起来,并且对多个容器使用相同的端口(80/443除外),但实际上并不需要自定义端口!如果您只使用默认端口配置容器,用户可以同时使用https://example-a.com和https://example-b.com,它将“只工作”™。
https://stackoverflow.com/questions/70625820
复制相似问题