我有一个我想通过Nginx服务器的reactjs应用程序。该应用程序使API请求一个node.js Express服务器。我决定将nginx与静态网站文件(来自reactjs应用程序)一起打包在一个docker-compose文件中。我为Express服务器创建了另一个docker-compose文件。这些容器当前在我的笔记本电脑上,并且正在使用localhost
。很长一段时间以来,我一直无法让他们工作,但是不幸的是,互联网上对此的信息并不多。 (当网站和Express服务器不在Docker内时,它们可以工作。)
首先,我创建了一个新的docker网络:
docker network create --driver bridge appstore-net
这是我用于网站和nginx的docker-compose文件:
version: '3.5'
services:
appstore-front:
container_name: appstore-front-production
build:
context: .
dockerfile: Dockerfile-prod
ports:
- '80:80'
networks:
- appstore-net
external_links:
- appstore-bl-server-production
networks:
appstore-net:
external: true
这是我的Express服务器的docker-compose文件:
version: '3'
services:
appstore-bl-server:
container_name: appstore-bl-server-production
build:
dockerfile: Dockerfile-prod
context: .
volumes:
- ".:/usr/src/app"
ports:
- "3000:3000"
networks:
- appstore-net
networks:
appstore-net:
external: true
这是我的nginx配置:
server {
listen 80;
listen [::]:80;
#Docker DNS
resolver 127.0.0.11;
server_name localhost;
access_log /var/log/nginx/appstore.access.log;
error_log /var/log/nginx/appstore.error.log;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
#hack to prevent nginx to resolve container's host on start up
set $docker_host "appstore-bl-server";
proxy_pass http://$docker_host:3000;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
如您所见,我正在使用docker DNS解析器,并为包含Express容器名称的URL创建“传递代理”。
我如何使其起作用?
编辑::我发现了两个可能是原因的问题:
1)external_links
需要引用容器名称,而不是容器服务。
2)nginx中的docker_host
变量需要引用服务名称,而不是容器名称。
通过这些更正,设置可以正常工作(也对OP中的值进行了更正)。