我有以下设置:
docker-compose.yml中的四项服务:my_nginx
,my_client
,my_api
和my_db
。
my_nginx
作为代理传递来达到my_client:8000
和my_api:8001
(都是Node.js)。my_client
是具有服务器端呈现的Angular应用程序。my_api
是一个节点应用程序,它从my_db
获取数据。然后,在我的windows hosts
文件中,我有与my_nginx
配置服务器块中定义的相同的主机名:
`127.0.0.1 my-app.local api.my-app.local`
所以可以通过主机名访问它们。
接下来,在我的角度应用程序中,我在每个环境文件中定义了api url,因此对于本地开发环境,它是http://api.my-app.local
。
当api请求来自浏览器时,它工作得很好。但是当服务器端启动请求时,从my_client
容器中,我得到一个很长(很多行)的错误,但它的要点(以及我可以通过搜索Google找到它的常用文本)是:message: 'Http failure response for (unknown url): 0 Unknown Error'
。但是,我能找到的其他问题并没有回答我的问题。它们要么不是服务器呈现的,要么提及CORS或没有Internet访问的容器。
我允许任何客户来自我的api:res.setHeader('Access-Control-Allow-Origin', '*');
,CORS不是问题。此外,如果我用http://api.my-app.local
替换http://some-real-website.com
,那么请求有效,它通过,我只是没有收到适当的数据,因为它不是我的api,但重点是我的容器能够访问互联网。跳进my_client
容器和ping api.my-app.local
工程(显示127.0.0.1,不知道这是否意味着什么)。我不知道为什么这样有效,虽然ping用http://...
不行,但我不能用我的Angular应用程序中的http://api.my-app.local
替换api.my-app.local
,因为那样它会向自己提出请求,例如:http://my-app.local/api.my-app.local
。
最后,如果我ping http://api.my-app.local
然后我得到unknown host
。不知道为什么,就容器而言,http://api.my-app.local
在互联网上,对吗?我的意思是,无论是谁/什么/在哪里尝试访问,我都希望事情能够发挥作用,例如:
http://api.my-app.local
(可以是我/浏览器,可以是容器,无论如何)127.0.0.1
my_nginx
容器api.my-app.local
my_api
容器。应该很简单。
编辑:
Docker版本:17.12.0-ce-win47(15139)稳定
docker-compose.yml
:
version: '3.4'
services:
my_nginx:
container_name: my_nginx
build:
context: ./nginx
image: my_nginx
ports:
- '80:80'
- '443:443' # SSL (not used on 'my-app.local')
links:
- my_api
- my_client
my_api:
container_name: my_api
build:
context: ./node_api
image: my_api
ports:
- '8001:8001'
volumes:
- ./node_api/app:/var/www/api.my-app.com
- /var/www/api.my-app.com/node_modules
links:
- my_db
depends_on:
- my_db
networks:
default:
aliases:
- api.my-app.local
tty: true
# command: ["pm2-docker", "pm2.config.json"] < moved to Dockerfile
my_client:
container_name: my_client
build:
context: ./node_client
image: my_client
ports:
- '8000:8000'
volumes:
- ./node_client/app:/var/www/my-app.com
- /var/www/my-app.com/node_modules # Inside the container, use the node_modules installed there.
links:
- my_api
tty: true
command: ["pm2-docker", "pm2.config.json"]
my_db:
container_name: my_db
build:
context: ./mysql
image: my_db
restart: always
ports:
- '3306:3306'
volumes:
- './_space/mysql:/var/lib/mysql'
Nginx config api服务器块:
server {
listen 80;
server_name api.my-app.local;
charset utf-8;
client_max_body_size 4096M;
location / {
proxy_pass http://my_api:8001;
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;
}
location ~ /\.ht {
deny all;
}
}
当然,除了server_name
和proxy_pass
指令外,客户端的指令是相同的。我不知道proxy_http_version
,proxy_set_header
和proxy_cache_bypass
是什么,我只是从一个在线示例中复制了配置。
在docker-compose.yml中,您需要声明my_nginx的别名并链接my_client:
my_nginx:
networks:
default:
aliases:
- api.my-app.local
my_client:
links:
- my_nginx