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

我有一个运行在端口号为3000的Docker容器中的应用程序,暴露给主机(端口3050映射到容器的端口3000),我想用这个nginx代理来指向url http://localhost/users指向/ proxy到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 

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

 api: build: . container_name: api environment: - VIRTUAL_HOST= service.myserver.com - VIRTUAL_PROTO=https volumes: - "./API:/host" links: - Mongo:Mongo ports: - "3050:3000" 

启动Docker容器后,我可以在浏览器中打开http://localhost:3050/users ,但是不能打开http://localhost:3050/users http://localhost/users ,这给我一个503 暂时不可用的错误。

也许我得到的整个想法是错的,有人可以帮助或纠正我的nginx反向代理

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

使其工作的关键是以下几点:

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

以下是正在运行的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" 

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