我有一个在端口号3000运行的docker容器中的应用程序,暴露给主机(端口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
下面是docker-compose.yml中定义的容器,它在docker容器中的端口3000上运行我的app:
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反向代理帮助或纠正我吗?
解决方法:
在做了一些搜索之后,我能够把一个工作的docker-compose.yml放在一起,它有一个工作的Nginx反向代理(图像:docker hub中的jwilder / Nginx-proxy)到我在的一个基于node.js的web应用程序单独的容器.
使其发挥作用的关键是:
>在Nginx反向代理容器中设置VIRTUAL_HOST =端口,此端口应该是我的node.js应用程序在其容器中运行的端口(而不是在主机上映射的端口!)
>如果您希望Nginx反向代理位于https上,则应设置SSL证书,但应将http(而不是https)设置为Web应用程序容器中的环境变量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"