Abh*_*Adr 11 proxy node.js docker docker-compose
我正在尝试nginx反向代理多个容器.
我有2个容器有节点添加一个听8085和其他8086我希望他们访问
node.app1.com
node.app2.com
所以我使用了jwilder/nginx-proxy:latest,这些将位于这两个容器的fount中,并将充当反向代理.所以这是我的compose.yml文件.
version: "3"
services:
node-proxy:
build: ./node-proxy
container_name : node-proxy
restart : always
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
ports:
- 80:80
- 443:443
node-app1:
build: ./app1
container_name : node-app1
restart: always
environment:
VIRTUAL_HOST: node.app1.com
depends_on:
- node-proxy
node-app2:
build: ./app2
container_name : node-app2
restart: always
environment:
VIRTUAL_HOST: node.app2.com
depends_on:
- node-proxy
Run Code Online (Sandbox Code Playgroud)
FROM jwilder/nginx-proxy:latest
Run Code Online (Sandbox Code Playgroud)
var http = require("http");
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World 1\n');
}).listen(8085);
Run Code Online (Sandbox Code Playgroud)
FROM node:6.11
WORKDIR /app2
COPY app1.js .
CMD node app1.js
Expose 8085
Run Code Online (Sandbox Code Playgroud)
var http = require("http");
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World 2\n');
}).listen(8086);
Run Code Online (Sandbox Code Playgroud)
FROM node:6.11
WORKDIR /app2
COPY app2.js .
CMD node app2.js
Expose 8086
Run Code Online (Sandbox Code Playgroud)
所以,当我这样做
docker-compose up
Run Code Online (Sandbox Code Playgroud)
我的所有容器都已启动并运行
但是什么时候做node.app1.com - >它说的是未知主机.
所以要检查是否有来自代理的请求我尝试从浏览器调用http:// localhost并且它说503
我还检查了侧容器中的nginx.config
docker exec -it node-proxy_id bash
cat /etc/nginx/conf.d/
它在那里,但我认为当我做node.app1.com请求不来代理.我没有得到我错过的地方,有人可以帮我解决这个问题.
谢谢你的时间
当您设置links或depends_on其他服务时,docker-compose 会container_name默认将其他服务主机名设置为同一 docker 网络中的主机名。
就你而言,我建议添加links@Mathias 回复。
version: "3"
services:
node-app1:
build: ./app1
container_name : node-app1
restart: always
expose:
- "8085"
environment:
VIRTUAL_HOST: node.app1.com
node-app2:
build: ./app2
container_name : node-app2
restart: always
expose:
- "8086"
environment:
VIRTUAL_HOST: node.app2.com
node-proxy:
build: ./node-proxy
container_name : node-proxy
restart : always
links:
- node-app1
- node-app2
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
ports:
- 80:80
- 443:443
Run Code Online (Sandbox Code Playgroud)
更新:
我注意到 Nginx 配置有upstream指令来保存多个主机名。您应该能够将其卷曲node-app1为:
$ curl -H 'Host: node.app1.com' localhost
Hello World 1
Run Code Online (Sandbox Code Playgroud)
etc/hosts您还可以将容器中文件的最后一行修改node-proxy为:
172.20.0.4 [docker-network-alias] node.app1.com node.app2.com
Run Code Online (Sandbox Code Playgroud)
然后你应该能够http://node.app1.com直接访问你的容器内部node-proxy。
这是在ubuntu 16 04上设置nginx虚拟主机的教程
评论一:
根据我的理解,它nginx-proxy倾向于将请求代理到后端服务,而不必在/etc/hosts文件中注册主机名。因此,我们触发一个带有Hostheader 的请求,该 header 是 Nginxupstream块中的虚拟主机名。
nginx-proxy当您在每个应用程序容器设置中创建环境变量时,他们已经为您完成了这部分VIRTUAL_HOST。但这并不意味着我们可以直接node.app1.com在浏览器中访问并期望请求将被node-app1容器代理并响应。
回到请求转发部分,请求到达localhostNginx监听的80/443端口。Nginx 然后检查Host标头以进入特定位置块。这就是为什么你不能在浏览器中直接访问http://node.app1.com,因为该主机名永远不会真正在 中注册etc/hosts,因此它永远不会被任何服务器、应用程序或我们的nginx-proxy.
如果我们想通过浏览器访问该主机名,则etc/hosts需要进行额外的设置。
该nginx-proxy项目提供了一些模板设置,因此您可能能够获取应用程序容器的 IP 及其VIRTUAL_HOST环境,然后将其附加到/etc/hosts文件中。但通过这种方式,这将直接访问节点应用程序服务器,而不是来自代理nginx-proxy。
如果不考虑生产级别,我建议将应用程序域附加到etc/hosts由 设定的文件的最后一行nginx-proxy,然后它应该按您的预期工作。nginx-proxy否则,需要从模板动态绑定主机名。
| 归档时间: |
|
| 查看次数: |
2357 次 |
| 最近记录: |