将nginx反向代理设置为从另一个docker容器提供服务

Ton*_*yGW 3 reverse-proxy nginx docker docker-compose

我有一个在端口号运行的docker容器中的应用程序3000,暴露给主机(端口3050映射到容器的端口3000),我想使用这个nginx-proxy指向类似于http://localhost/users指向/代理的URL http://localhost:3050/users.

我的docker-compose.yml文件中有这个块:

 nginx_service:
   image: jwilder/nginx-proxy
   container_name: nginx_server
   ports:
    - "80:80"
    - "443:443"
   volumes:
    - ./ssl_certs:/etc/nginx/certs
    - /var/run/docker.sock:/tmp/docker.sock:ro
Run Code Online (Sandbox Code Playgroud)

下面是docker-compose.yml在docker容器中的端口3000上运行我的应用程序中定义的容器:

api:
   build: .
   container_name: api
   environment:
    - VIRTUAL_HOST= service.myserver.com
    - VIRTUAL_PROTO=https
   volumes:
    - "./API:/host"
   links:
    - Mongo:Mongo
   ports:
    - "3050:3000"
Run Code Online (Sandbox Code Playgroud)

在我启动docker容器之后,我可以http://localhost:3050/users在浏览器中打开,但不是http://localhost/users,这给了我一个503错误,服务暂时不可用.

也许我把整个想法弄错了,有人可以用nginx反向代理帮助或纠正我吗?

Ton*_*yGW 8

在做了一些搜索之后,我能够将一个docker-compose.yml有工作的nginx反向代理(图片:docker hub中的jwilder/nginx-proxy)的工作集合到一个单独的容器中的基于node.js的web应用程序中.

使其发挥作用的关键是:

  1. 设置VIRTUAL_HOST=port在nginx反向代理容器中,这port应该是我的node.js应用程序在其容器中运行的端口(而不是映射在主机上的端口!)
  2. 如果要启用nginx反向代理https,则应设置SSL证书,但应将http(而不是https)设置VIRTUAL_PROTO=http为Web应用程序容器中的环境变量.

下面是工作的docker-compose.yml:

nginx_service:
   image: jwilder/nginx-proxy
   container_name: nginx_server
   ports:
    - "80:80"
    - "443:443"
   volumes:
    - ./ssl_certs:/etc/nginx/certs
    - /var/run/docker.sock:/tmp/docker.sock:ro
   environment:
    - VIRTUAL_PORT=3000  # 3050 port on host does not work!


api:
   build: .
   container_name: api
   environment:
    - VIRTUAL_HOST=service.myserver.com
    - VIRTUAL_PROTO=http   # should be http even if you use https to the proxy, because node.js uses http!
   volumes:
    - "./API:/host"
   links:
    - Mongo:Mongo
   ports:
    - "3050:3000"
Run Code Online (Sandbox Code Playgroud)

希望这有助于某天某人从搜索引擎登陆此页面!

  • 要使`http:// localhost/users`工作,在`api`服务的`environment`中添加`VIRTUAL_PORT = 3050`并从`nginx_service`删除`environment`块应该可以工作,你不需要映射你的端口3000主机3050的'api`服务. (3认同)