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

Setting nginx reverse proxy to serve from another docker container

我在端口号 3000 的 docker 容器 运行 中有一个应用程序,暴露给主机(端口 3050 映射到容器的端口 3000),我会喜欢用这个 nginx-proxy 来指向像 http://localhost/users 到 point/proxy 到 http://localhost:3050/users.

这样的 url

我的 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 容器中的端口 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/users,这让我暂时出现 Service 的 503 错误不可用

也许我理解错了,有人可以用 nginx 反向代理帮助或纠正我吗?

经过一番搜索后,我找到了一个可以正常工作的 docker-compose.yml,它有一个可以正常工作的 nginx 反向代理(图片:jwilder/nginx-proxy 在 docker hub) 到我在单独容器中的基于 node.js 的网络应用程序。

使其工作的关键如下:

  1. 在nginx反向代理容器中设置VIRTUAL_HOST=port,这个port应该是我的node.js应用程序在其容器中运行的端口(不是主机上映射的端口! )
  2. 如果你想让nginx反向代理在https上,你应该设置一个SSL证书,但是应该设置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"

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