通过反向代理从主机 NGINX 访问 docker compose 容器

通过反向代理从主机 NGINX 访问 docker compose 容器

我遇到了这个问题,无法通过在此网站或其他任何地方找到的任何方法解决。

假设我有一个域和 Debian 服务器NGINX安装在其上作为 Web 服务器的主网关。在这个域上(在根级别),我有一个传统的处理方式(例如剥离 www、每次重定向到 https 等 - 基本的东西)。

但现在我想在docker-compose文件中管理一组服务,这些服务将在 docker start 时执行,并且这些服务将映射为子域名到我的主域。假设该域已设置正确的 DNS 记录(这些都不是问题,因为我一直在使用子域来提供非 docker 服务,没有任何问题)。为简单起见,仅以一项服务pgAdmin4为例

解决此问题的 NGINX 配置的一部分非常简单。

server {
    listen 80;
    server_name pg.example.com;

    location / {
        proxy_pass http://pgadmin:81; 
    }
}  

Docker Compose 更加基础

version: '3.8'
services:
  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: [email protected]
      PGADMIN_DEFAULT_PASSWORD: pw
    ports:
      - "81:80"

当我尝试sudo nginx -t检查配置时,出现错误host not found in upstream "pgadmin"

当我尝试用 替换容器的名称host.docker.internal(在撰写时使用 extra_hosts 设置"host.docker.internal:host-gateway")或者当我尝试使用127.0.0.1:81或简单时localhost:81,我收到(重新启动 NGINX 后)502 Bad Gateway白标签页面错误。

在日志中我可以看到很多错误,例如

*2 连接到上游时没有实时上游,客户端:78.136.141.1,服务器:pg.example.com,请求:“GET / HTTP/1.1”,上游:“http://localhost/”,主机:“pg.example.com”

Can anyone tell me what am I doing wrong?

答案1

使用以下方法将 nginx 移至 Docker(并公开 80/443)容器然后在要公开的包含要映射的主机名的容器上设置环境变量

例如

VIRTUAL_HOST=foo.example.com

甚至有一个伴侣负责动态设置 letsencrypt 证书的容器

相关内容