这里使用一个例子docker-compose.yml
// docker-compose.yml
# 确保所有服务在同一网络
version: '3.8'
services:
app:
networks:
- mynetwork
depends_on:
- mysql
- redis
mysql:
networks:
- mynetwork
redis:
networks:
- mynetwork
imotor-ltq:
image: phm-ltq:1.0.0
container_name: imotor-ltq
restart: always
networks:
- app_net
deploy:
resources:
limits:
cpus: '3.00'
memory: 5G
reservations:
cpus: '3.00'
memory: 2G
ports:
- "7953:8080"
spectral-ltq-web:
image: spectral-ltq-web:1.0.0
container_name: spectral-ltq-web
restart: always
networks:
- app_net
deploy:
resources:
limits:
cpus: '1.00'
memory: 1G
reservations:
cpus: '1.00'
memory: 1G
ports:
- "7777:8080"
depends_on:
imotor-algo:
condition: service_healthy
networks:
mynetwork:
driver: bridge
前端nginx 镜像容器配置:
location /api/ {
proxy_pass http://imotor-ltq:7953/;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header remote_addr $remote_addr;
proxy_http_version 1.1;
proxy_connect_timeout 4s;
proxy_read_timeout 600s;
proxy_send_timeout 12s;
}
当后端开发新功能发版后偶现
发现服务不能使用了,每次出现这个问题时 都需要重启前端项目,
后面开始排查:查看docker 网络
docker network ls
docker network inspect <network_name>
多次重启后发现IP地址会发生变化,基本可以确定是使用服务名DNS解析时存在缓存
使用的是之前的服务IP地址,所以找不到
进一步确定问题:
不停重启后端服务,直到让 ip发生变化:
每次重启后观察观察ip变化直到跟之前不一样为止
这里从172.18.0.15/16 变为172.18.0.17/16
然后请求接口:查看nginx 日志:
docker logs -f --tail=100 spectral-ltq-web
发现日志打印的还是之前的ip 172.18.0.15
解决方法:
server {
listen 8080;# 访问端口
server_name localhost;
resolver 127.0.0.11 valid=10s; # Docker 内置 DNS
location /api/ {
set $algo_host imotor-ltq; rewrite ^/api/(.*)$ /$1 break; //使用rewrite重置为后端需要的地址
proxy_pass http://$algo_host:8080;
}
}
// 添加 resolver 127.0.0.11 valid=10s; # Docker 内置 DNS
使用变量
set $algo_host imotor-ltq;
rewrite ^/api/(.*)1 break;
proxy_pass http://$algo_host:8080;
之前想省略 rewrite ^/api/(.*)1 break;直接在后面加/
server {
listen 8080;# 访问端口
server_name localhost;
resolver 127.0.0.11 valid=10s; # Docker 内置 DNS
location /api/ {
set $algo_host imotor-ltq;
proxy_pass http://$algo_host:8080/;
}
}
发现找不到服务地址,不知道什么原因
使用了变量后,proxy_pass http://$algo_host:8080/;应该替换的路径不正确,尝试了一些方法,在请求头加调试参数,还是没办法找到问题
发现报错时会打印日志upstream:代理转发后的地址
于是随便设置了一个不存在的服务设置变量set $algo_host “127.0.0.7”;
于是看到了日志
发先uri 本整个替换成了http://127.0.0.7:8083/ 这下终于找到问题了,花费了大量时间