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

时间:2016-06-25 23:03:00

标签: nginx docker reverse-proxy docker-compose

我在端口号3000运行的docker容器中有一个app,暴露给主机(端口3050映射到容器的端口3000),我想使用这个{{ 3}}将http://localhost/users等网址指向/代理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容器中的端口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,这会在服务暂时不可用时出现503错误。

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

1 个答案:

答案 0 :(得分:8)

在做了一些搜索后,我能够将一个有效的VIRTUAL_HOST=port组合到节点上,该代理有一个工作的nginx反向代理(docker hub中的 image:jwilder / nginx-proxy )基于.js的网络应用程序我在一个单独的容器中。

使其发挥作用的关键是:

  1. 在nginx反向代理容器中设置port,此https应该是我的node.js应用程序在其容器中运行的端口(而不是在主机上映射的端口!)
  2. 如果您希望nginx反向代理位于http,则应设置SSL证书,但应将VIRTUAL_PROTO=http(而不是https)设置为环境变量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" 网络应用容器。
  3. 以下是工作的docker-compose.yml

        'OPTIONS': {
            'MAX_ENTRIES': 100
        }
    

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

相关问题