我在 docker 容器中有一个应用程序在端口号 3000
上运行,暴露给主机(端口 3050 映射到容器的端口 3000),我想使用这个 nginx-proxy将诸如 http://localhost/users
之类的 URL 指向/代理到 http://localhost:3050/users
。
我的 docker-compose.yml
文件中有这个 block :
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 Temporarily Unavailable 的 503 错误。
也许我的整个想法都错了,有人可以用 nginx 反向代理帮助或纠正我吗?
最佳答案
在进行了一些搜索之后,我能够整理出一个有效的 docker-compose.yml
有一个工作的 nginx 反向代理(image: jwilder/nginx-proxy in docker hub)到我在一个单独容器中的基于 node.js 的 Web 应用程序。
使其发挥作用的关键如下:
- 设置
VIRTUAL_HOST=port
在 nginx 反向代理容器中,这个port
应该是我的 node.js 应用程序在其容器中运行的端口(不是映射到主机上的端口!) - 如果你想让 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"
希望有一天这会帮助某人从搜索引擎登陆此页面!
关于nginx - 将 nginx 反向代理设置为从另一个 docker 容器提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38033695/