尝试连接到节点应用程序作为反向代理时,Nginx连接被拒绝

我试图用Docker容器构build一个web应用程序,并且在尝试运行Nginx作为我的节点应用程序的反向代理时,连接被拒绝。 我不知道这是一个nginx服务器configuration问题或docker-composeconfiguration问题。

[error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.20.0.1, server: foo.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:7770/", host: "foo.com" 

当遇到foo.com时,我得到这个错误,奇怪的是我的应用程序在端口号被引用时工作,所以foo.com:7770运行应用程序。

我的nginx服务器configuration:

 server { listen 80; server_name foo.com; port_in_redirect off; autoindex on; location / { proxy_pass http://127.0.0.1:7770; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } 

我的Docker撰写文件:(这里可能有些冗余的东西)

 version: "2" services: nginx: build: ./nginx ports: - "80:80" depends_on: - app links: - app app: build: context: . dockerfile: DockerFile ports: - "7770:7770" links: - mongo depends_on: - mongo mongo: image: mongo ports: - "27017:27017" volumes_from: - mongodata depends_on: - mongodata mongodata: image: tianon/true volumes: - /data/db 

我的节点Dockerfile:

 FROM node:latest ADD package.json /tmp/package.json RUN cd /tmp && npm install RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/ WORKDIR /opt/app ADD . /opt/app EXPOSE 7770 CMD ["npm", "start"] 

我的ngnix Dockerfile

 FROM nginx:1.10 COPY default.conf /etc/nginx/conf.d/default.conf 

在npm开始,这将运行:

 app.get('*', function(req, res) { res.sendFile(path.join(__dirname, 'index.html')); }); app.listen(7770, function(err) { if (err) { console.log(err); return; } console.log('Listening at http://localhost:7770'); }); 

这是我第一次在docker工作,所以我可能混淆了一些东西。 另外我在/ private / etc / hosts中将foo.com指向127.0.0.1。

C-霍姆斯

首先,您需要记住每个容器都有自己的networking堆栈,因此无法使用容器内的localhost访问在Docker主机中运行的服务。

对于这个特定的项目,您需要将Nginx服务器configuration中的proxy_pass指令指向访问app容器的值。 就像是:

proxy_pass http://app:7770;

您需要做的是正确的,因为在docker-compose上下文中,您的容器名称将映射到内部DNS条目。 因此,您不需要将应用程序容器的7770发布到外部世界,并且如果您的MongoBD将仅由您的应用程序容器访问,则不需要发布27017端口。

如果你想将stream量从nginx路由到app你必须使用proxy_pass上的app容器的IP地址或DNS。 使用Docker Compose服务可以使用服务名称相互发现,所以在nginx conf中改变

proxy_pass http://app:7770;

您不需要将7770端口发布到外部世界。 也为mongo你不需要发布27017端口。