2017-03-08 46 views
0

我试图使用docker容器构建web应用程序,并且在尝试将Nginx作为反向代理运行到我的节点应用程序时,连接被拒绝。我不确定它是否是nginx服务器配置问题或docker-compose配置问题。尝试连接到节点应用程序作为反向代理时,Nginx连接被拒绝

[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服务器配置:

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; 
    } 
} 

我的码头工人撰写文件:(有可能在这里一些多余的东西)

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'); 
}); 

这是我在泊坞窗第一次运行,所以我可能已经糊涂了几件事情。另外我在/ private/etc/hosts中将foo.com指向127.0.0.1。

回答

2

C-福尔摩斯,

首先,你需要记住每个容器都有自己的网络堆栈,所以你不能使用localhost在容器内,以达到在泊坞窗主机上运行的服务。

对于这个特定的项目,您需要将您的Nginx服务器配置中的proxy_pass指令指向一个达到app容器的值。喜欢的东西:

proxy_pass http://app:7770;

您需要做,因为在docker-compose方面的容器名称将被映射到内部DNS进入权利。因此,您不需要将应用程序容器的7770发布到外部世界,并且如果您的MongoBD将仅由您的应用程序容器访问,则不需要发布27017端口。

0

如果您想要将流量从nginx转换为app,则必须使用app容器的ip地址或dns(位于proxy_pass)。随着多克撰写服务可以发现彼此的服务的名称,所以在nginx的的c​​onf改变

proxy_pass http://app:7770;

你并不需要发布端口7770到外面的世界。另外对于mongo,你不需要发布27017端口。

相关问题