我已经这样做了很多次,但由于某种原因,我不能让我的容器沟通。
即使当我试图从前端 curl ,我也无法连接!
例如:
/etc/nginx # curl http://localhost:8081/v1/test
curl: (7) Failed to connect to localhost port 8081 after 0 ms: Connection refused
/etc/nginx #
bb36725aa567 vue-golang-grpc-base-client "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp, 0.0.0.0:80->8080/tcp vue-golang-grpc-base-client-1
8d9fa96e0e67 vue-golang-grpc-base-api "./main" 15 minutes ago Up 15 minutes 0.0.0.0:8081-8082->8081-8082/tcp vue-golang-grpc-base-api-1
我的nginx文件看起来像
upstream api {
server ${API_HOST}:8081;
}
server {
server_name localhost example.com www.example.com;
listen 8080;
root /usr/share/nginx/html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf)$ {
expires 1y;
add_header Cache-Control "public";
access_log off;
}
location / {
try_files $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;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_redirect off;
proxy_pass http://api;
add_header Cache-Control "no-store, no-cache, must-revalidate";
expires off;
}
}
我正在使用Vue.js 3与typescript和创建一个自定义的url处理程序,因为我没有使用webpack。
export class EnvironmentHelper {
public static get isDevelopment(): boolean {
return process.env.NODE_ENV === "development";
}
public static get isProduction(): boolean {
return process.env.NODE_ENV === "production";
}
public get baseUrl(): string {
if (EnvironmentHelper.isDevelopment) {
return "http://localhost:8081"
}
if (EnvironmentHelper.isProduction) {
return "http://localhost:8080/"
}
return "/";
}
}
那么我有一个.env
文件
NODE_ENV=development
API_HOST=localhost
我使用axios
第一个
然后我用docker compose构建图像
version: '3.0'
services:
api:
build:
context: ./api
ports:
- "8082:8082" # gRPC
- "8081:8081" # gRPC Gateway
networks:
- personal
client:
build:
context: ./client
environment:
- API_HOST=api
- NODE_ENV=production
env_file:
- client/.env.local
networks:
- personal
ports:
- "80:8080"
networks:
personal:
我有两个.env文件
.env
.env.production
而且两者是相同的
NODE_ENV=production
API_HOST=api
如有任何建议,我们将不胜感激...
- ----更新-----
最后,我尝试了许多被接受的答案建议,但问题是路由。我把它设置为api
,而不是v1
,即/v1/test
。
不过,我希望这篇文章能帮助其他人正确配置。魔鬼在细节@masseyb
1条答案
按热度按时间zfciruhq1#
client
服务中的localhost
是容器localhost
,而不是Map端口的PC的localhost
。nginx
正在尝试将连接传递到upstream { server localhost:8081; }
(给定API_HOST
环境变量),client
服务中没有侦听端口8081
的内容,因此“连接被拒绝”。您可以将您的
API_HOST
更新为api
,例如upstream { server api:8081; }
,api
将被解析为容器IP,并且连接将被传递到<container_ip>:8081
而不是localhost:8081
(首选),或者您可以在host
网络上运行client
服务并继续使用localhost
。