我有一个用于前端的Angluar应用程序,并且我有一个REST API监听端口3001(码头化的Rails后端)。
我正在使用以下命令运行我的角度应用程序:
ng serve --proxy-config proxy.conf.json
并带有以下proxy.conf.json文件:
{
"/server": {
"target": "http://localhost:3001",
"secure": false,
"pathRewrite": {"^/server" : ""}
},
"/api": {
"target": "http://localhost:3001",
"secure": false
},
"/base": {
"target": "http://localhost:3001",
"secure": false
},
"/users": {
"target": "http://localhost:3001",
"secure": false
}
}
这工作得很好-我的角度应用程序在端口4200上运行,并且可以与我的dockerized后端正常通信。
我现在也想使用nginx对前端进行docker化。
这是我的dockerfile:
FROM node:8.9 as node
WORKDIR /app
COPY package.json /app/
RUN npm install
COPY ./ /app/
ARG env=prod
RUN npm run build -- --prod --environment $env
FROM nginx:1.13
COPY --from=node /app/dist/ /usr/share/nginx/html
COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
我的nginx-custom.conf看起来像这样:
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
location /server {
proxy_pass http://localhost:3001;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_buffering off;
proxy_set_header Accept-Encoding "";
}
location /api {
proxy_pass http://localhost:3001;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_buffering off;
proxy_set_header Accept-Encoding "";
}
location /base {
proxy_pass http://localhost:3001;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_buffering off;
proxy_set_header Accept-Encoding "";
}
location / {
try_files $uri $uri/ /index.html =404;
}
}
我通过以下应用程序进行构建:
docker build -t client:prod .
然后我以以下方式启动我的应用程序:
docker run -p 80:80 client:prod
我的Angular应用程序正在端口80上启动,并且可以看到我的第一个屏幕。但这与我的其余api无关。在我的浏览器中,我看到我的有角度的应用程序将html请求发送到4200。我不确定这是正确的,并且根本原因是什么?由于我在端口80上使用了nginx-我的角度应用程序的请求现在不应该转到端口80吗?
我将我的nginx配置更改为侦听端口4200,并使用端口4200:4200启动了dockerized应用,但这都不起作用。
有什么主意在这里吗?
谢谢, 迈克尔
答案 0 :(得分:0)
我认为问题在于容器未链接..所以他们看不到对方..
尝试与--link参数一起使用(已弃用,但仍可以使用),或者尝试为您的容器定义一个网络。
类似:
docker run -p 80:80 client:prod --link nomeofyourrailsbackendcontainer
或:
docker network create my-net
然后:
docker network connect my-net client:prod
和
docker network connect my-net backendconatiner
希望对您有帮助!
答案 1 :(得分:0)
制作一个docker-compose文件。这样会自动为您创建网络。同一网络上的容器可以互相访问。
也可以代替localhost:3001在您的Nginx配置中。使用api:3001。 “ api”是在docker-compose文件中定义的名称。 Docker会将其解析为容器IP地址。
让我知道这是否可以解决您的问题或需要更多信息。