Node.js 角度前端Docker容器不';t从node express后端Docker容器发送/接收数据

Node.js 角度前端Docker容器不';t从node express后端Docker容器发送/接收数据,node.js,angular,docker,nginx,dockerfile,Node.js,Angular,Docker,Nginx,Dockerfile,所以我是码头集装箱 我有一个用Angular编写的前端应用程序 如果proxy.conf.json持有: /api": { "target": "http://127.0.0.1:3000", "secure": false } 我还在环境.prod.ts中添加了: export const environment = { production: true, api: 'http://127.0.0.1:3000', }; 最后,我的后端是用Node.js(Expre

所以我是码头集装箱

我有一个用Angular编写的前端应用程序

如果proxy.conf.json持有:

/api": {
    "target": "http://127.0.0.1:3000",
    "secure": false
}
我还在
环境.prod.ts
中添加了:

export const environment = {
  production: true,
  api: 'http://127.0.0.1:3000',
};
最后,我的后端是用Node.js(Express)编写的

在我的
app.js
中:

...
app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next()
});
...
当我构建我的应用程序,并在正确设置配置文件的情况下将前端添加到Nginx local,并且PM2运行后端时,我的应用程序运行平稳,没有任何问题

因此,根据指南和文档,我为前端创建了一个容器

Dockerfile:

FROM nginx
COPY dist /usr/share/nginx/html
和一个用于我的后端的容器:

# Install the app dependencies in a full Node docker image
FROM node:10

WORKDIR "/app"
# Install OS updates 
RUN apt-get update \
 && apt-get dist-upgrade -y \
 && apt-get clean \
 && echo 'Finished installing dependencies'
# Copy package.json and package-lock.json
COPY package*.json ./
# Install app dependencies
RUN npm install --production
# Copy the dependencies into a Slim Node docker image
FROM node:10-slim

WORKDIR "/app"
# Install OS updates 
RUN apt-get update \
 && apt-get dist-upgrade -y \
 && apt-get clean \
 && echo 'Finished installing dependencies'
# Install app dependencies
COPY --from=0 /app/node_modules /app/node_modules
COPY . /app
ENV NODE_ENV production
ENV PORT 3000
USER node
EXPOSE 3000
CMD ["npm", "start"]
所以你可能已经猜到了,当我在笔记本电脑上运行这两个容器时(就在我完成docker构建之后),我可以访问它们中的每一个,但是当我尝试登录时,我有一个帖子。。。404错误(未找到)

如果我在本地运行前端,而在容器中运行后端,它就像一个符咒

我在谷歌上搜索了很多,似乎找不到答案

谢谢你的时间和帮助, 干杯

编辑

根据请求,我的Docker运行命令:

docker run -d -p 3000:3000 myUserName/cis-backend
docker run -d -p 4200:80 myUserName/cis-frontend

127.0.0.1在前端容器中指的是它自己。这就解释了为什么它没有连接

尝试使用以下步骤启动

这将启动后端容器并将名称设置为cis后端

docker run -d -p 3000:3000 --name cis-backend myUserName/cis-backend
启动cis前端容器并将其链接到后端容器

docker run -d -p 4200:80 --link cis-backend:cis-backend myUserName/cis-frontend

Syntax for link:
--link <container-name>:<alias>

This will add alias in the /etc/hosts file in the container
docker run-d-p 4200:80——链接cis后端:cis后端myUserName/cis前端
链接的语法:

--链接:是一项传统功能,建议在多容器应用程序中使用

经过几个小时的挫折,我终于明白了。 是的,我的一个问题是我从来没有链接过我的容器,我使用了一个简单的docker composer文件。 但主要的问题是,在我在线阅读的指南中,没有一个说我应该更新容器nginx映像中的default.conf

对于下一个像我一样挣扎的人,这里有一个简单的步骤: 在docker.com中,为后端编写一个特定的名称。在我的例子中,我把它命名为backend。我建议为前端创建一个简单的docker容器,这样您就可以在其中执行(docker exec-it containerId bash)以获取必要的信息,否则可能会使用google默认的.conf nginx docker映像。。。 如果创建快速前端容器只是为了将文件放在以下位置:

/etc/nginx/conf.d/default.conf
安装vim或任何您想要的。。 我使用的简单代码:

apt-get update
apt-get install vim
导航并打开default.conf文件,然后将其复制粘贴到某个位置。 在为前端创建dockerfile的同一文件夹中创建Nginx-custom.conf文件。 复制与在default.conf中找到的信息完全相同的信息 并在位置{..}下添加以下内容

...
location /api/ {
             proxy_pass http://nameOfTheBackendContainer:portTheBackendIsRunninG;
#   Example: proxy_pass http://backend:3000
             proxy_http_version 1.1;
        }
...
在docker文件中添加以下复制命令:

COPY nginx-custom.conf /etc/nginx/conf.d/default.conf
现在在前端代码中(请注意其角度), 如果为api使用了proxy.conf.json文件,则需要更改api url。 在我的情况下,它从:

"target": "http://localhost:3000",

我希望这能帮助一些新手,像我一样挣扎

请注意,我在这方面绝对不是专业人士。。。事实上,我只是在学习所有的知识,并试图学好它,这可能是一个非常错误的答案,但它对我来说很有效,也许它也将成为其他人的起点。


如果有人需要更多帮助或更好的解释,请随时给我发消息。

可以添加docker run命令吗。看起来您可能未链接容器或未公开端口correctly@AvinashReddy,谢谢您的快速重播。我只是按照你的要求进行了编辑。谢谢,我会尝试这个,并在有结果后尽快更新。我尝试了,但不幸的是没有帮助。我修复了environment.prod.ts和proxy.conf.json,使它们都具有:“我还尝试了”构建列表文件。构建docker容器。并使用您提供的命令运行docker容器。同样的404错误。我将花时间阅读您今晚提供的两个链接。查看docker composeCan,您可以将其执行到cis前端容器中,并检查/etc/hosts文件。还可以尝试对CI执行nslookup-backend@AvinashReddy,这是我的主机:127.0.0.1 localhost::1 localhost i[6-localhost ip6环回fe00::0 ip6 localnet ff00::0 ip6 mcastprefix ff02::1 ip6所有节点ff02::2 ip6所有路由器172.17.0.2 cis后端d95c9438d78a 172.17.0.3 196fadb8e93b
"target": "http://backend:3000",