一尘不染

码头工人ERR_NAME_NOT_RESOLVED http ajax

docker

我有3个简单的微服务(mysql,apirest,gui),我开始使用docker-compose:

version: '3.2'
services:
  mysql:
  image: mysql/mysql-server:5.6
  container_name: mysql
  restart: always
  volumes:
    - mysql:/var/lib/mysql/data
  ports:
    - "3306:3306"
  networks:
    - mynetwork
  deploy:
    mode: replicated
    replicas: 1
  environment:
    - MYSQL_ROOT_PASSWORD=mypwd
    - MYSQL_USER=myuser
    - MYSQL_PASSWORD=myuserpwd
    - MYSQL_DATABASE=my-db
apirest:
  image: .....apirest:latest
  container_name: apirest
  restart: always
  volumes:
    - apirest:/apirest/tmp
  ports:
    - "30000:3000"
  networks:
    - mynetwork
  deploy:
    mode: replicated
    replicas: 2
gui:
  image: ......gui:latest
  container_name: gui
  restart: always
  links:
      - apirest
  ports:
    - "34200:4200"
  networks:
    - mynetwork

networks:
 mynetwork:

volumes:
 apirest:
 mysql:

MySQL的apirest 微服务没有问题可以进行通信(我可以连接到我的数据库 apirest 使用 的MySQL
作为主机名。

但是,当我尝试使用 apirest* 作为主机名执行http请求(角度)时,我在 gui 微服务中收到以下错误: *

无法加载资源:net :: ERR_NAME_NOT_RESOLVED

gui 微服务中,我可以ping apirest

docker exec -it gui ping apirest

--- apirest ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.069/0.203/0.338 ms

如果我使用公共服务器地址(http:// serverip:30000 / api /
test
)来执行http请求而不是 apirest
,则没有问题,http请求成功。

我究竟做错了什么??

谢谢


阅读 333

收藏
2020-06-17

共1个答案

一尘不染

AJAX请求是浏览器请求,而不是服务器端请求,并且您的浏览器不是mynetwork的一部分。发出ajax请求(客户端浏览器必须是公共域或具有服务节点端口的映射主机文件)。您仍然需要在浏览器主机中映射主机文件,或者在gui代码中使用带有服务节点端口的完整url。

如果您想避免使用端口,在我使用Nginx的情况下,代理是公开服务的最佳方法

GUI-ajax req(浏览器到服务器req)----> PROXY(NGINX)—(服务器到服务器)-> apirest

2020-06-17