如何将我的NodeJS与我的Angular连接(在Nginx中)

时间:2016-01-19 09:27:55

标签: node.js nginx docker dockerfile

我有一个带有angular和nodejs的回购。 我在詹金斯演出:

# install globally
npm install -g bower
npm install -g gulp

# install
bower install
npm install

# build dist folder
gulp build

现在我已经扎根了:

Dockerfile.nginx  Dockerfile.nodejs  README.md  bower.json  dist  gulp.config.js  gulpfile.js  node_modules  package.json  server.js  src

我正在复制我的nginx容器中的dist文件夹。所以我主持角度。 (使用dockerfile)

FROM nginx
# copy folder
COPY dist /usr/share/nginx/html/dist

我正在将gulp.config.js gulpfile.js node_modules server.js复制到我的nodejscontainer。 (还有一个dockerfile)

FROM node

# Create app directory
RUN mkdir -p /usr/src/www
WORKDIR /usr/src/www 

# copy 
COPY node_modules /usr/src/www/
COPY gulpfile.js /usr/src/www/
COPY gulp.config.js /usr/src/www/
COPY server.js /usr/src/www/

 EXPOSE 8080
CMD [ "node", "server.js" ]

我运行了2个容器,但是nginx没有与nodejs进行通信

EDIT1: 启动容器:

docker run -d -p 8888:8888 --name "nodejs" localhost:5000/test/nodejs:1

docker run -d -p 80:80 --name "nginx" localhost:5000/test/nginx:1

EDIT2:我的nginx.conf看起来像这样:

http {

        upstream node-app {
              least_conn;
              server nodejs:8888 weight=10 max_fails=3 fail_timeout=30s;
        }

        server {
              listen 80;
              location /dist {
                alias /usr/share/nginx/html/dist/;
               }

              location ~* /api {
              #location / {
                proxy_pass http://node-app;
                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;
              }
        }
}

我的server.js看起来像:

app.get('/api/hello', requestProxy({
  url: xxx + "/hello"
}));

2 个答案:

答案 0 :(得分:2)

您需要公开nginx(angular)容器将连接到的node.js容器的端口。 请参阅docker文档的Connect using network port mapping部分。

更新:我认为,您需要将nginx配置文件配置到节点容器中。 This question包含与您的用例相关的示例nginx文件(尽管与容器无关)。

编辑:要使用nginx映射节点应用程序,首先需要将节点容器与nginx容器链接。

docker run -d -p 80:80 --name "nginx" --link nodejs:nodejs localhost:5000/test/nginx:1

当您将节点容器与nginx容器链接时,节点容器的地址将保存在/ etc / hosts中。因此,nginx容器可以从那里访问节点的地址。

因此,在nginx配置文件中,nodejs可以作为nodejs'容器地址:

http {

        upstream node-app {
              server nodejs:8888 weight=10 max_fails=3 fail_timeout=30s;
        }

        server {
              listen 80;

              location / {
                proxy_pass http://node-app;
                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;
              }
        }
}

答案 1 :(得分:1)

一个解决方案是link @manish's answer中描述的两个容器。

但请注意,这是将容器连接在一起的传统方式。

从现在开始,您可以使用new docker network feature 创建虚拟网络并将两个容器连接到该网络:

docker network create mynetwork
docker run -d --net=mynetwork -p 8888:8888 --name "nodejs" localhost:5000/test/nodejs:1
docker run -d --net=mynetwork -p 80:80 --name "nginx" localhost:5000/test/nginx:1

使用这样的设置,您的nginx配置文件必须使用

server nodejs:8888 weight=10 max_fails=3 fail_timeout=30s;

因为你现在用他们的名字来引用其他容器。