Node.js 何时在docker中将localhost替换为服务名称?

Node.js 何时在docker中将localhost替换为服务名称?,node.js,reactjs,docker,express,mern,Node.js,Reactjs,Docker,Express,Mern,我已将reactjs应用程序和express应用程序对接 这是我的docker-compose.yml文件: version: "3" services: client: image: react-app build: ./client ports: - "3000:3000" volumes: - ./client/:/usr/src/app - /usr/src/app/node

我已将reactjs应用程序和express应用程序对接
这是我的docker-compose.yml文件:

version: "3"

services:
  client:
    image: react-app
    build: ./client
    ports:
      - "3000:3000"
    volumes:
      - ./client/:/usr/src/app
      - /usr/src/app/node_modules
    container_name: mern-app-client
    environment:
      CHOKIDAR_USEPOLLING: "true"
  server:
    image: express-app
    build: ./server
    ports:
      - "5000:5000"
    volumes:
      - ./server/:/usr/src/app
      - /usr/src/app/node_modules
    container_name: mern-app-server
    environment:
      CHOKIDAR_USEPOLLING: "true"
我有2个DockerFile,每个客户端和服务器中有1个(根据节点映像构建)
在运行docker compose up之后,我让服务器运行在http://localhost:5000 并在应用程序中作出反应http://localhost:3000.
当我有基本url时,一切正常http://localhost:5000 在react应用程序的axios/fetch中。在一些博客(不一定是mern)中,我看到localhost被服务名替换
我尝试了同样的方法,并将react应用程序中的基本url替换为http://server:5000 但它不起作用
现在我对什么时候应该替换基本url以及为什么需要它这一核心概念感到困惑?
如果有人能解释一下,我将不胜感激。
谢谢您的时间。

当您进入浏览器并键入
http://localhost:3000
在中,浏览器调用
客户端
容器,执行HTTP GET检索Javascript代码,浏览器实际运行代码。这是一个关键的区别:来自React应用程序的任何
fetch
调用或类似调用都在最终用户的浏览器中运行,而不是在Docker中运行

如果来自浏览器的呼叫;它是前端应用程序的一部分;或者它来自Docker外部,那么您需要使用主机系统的DNS名称和第一个发布的
端口:
编号。如果浏览器和容器都在同一系统上运行,则可以使用
localhost
;如果Docker在VM中运行(可能在旧的Docker工具箱设置中),则需要VM的IP地址

+--------------++-----------------------+
|浏览器|http://localhost:3000/ |客户:|
|React应用程序|------------------------->|端口:['3000:…']|
+-------------+                         +-----------------------+
一个容器也可以直接互相调用。可能
客户端
容器会调用
服务器
,作为将页面发送回浏览器之前预呈现页面的一部分;也许
服务器
有一个备份
db
。在这种情况下,您可以使用Compose服务名称作为主机名,以及服务器进程正在侦听的任何端口<代码>端口:不是必需的,如果存在则忽略

+------------++-------------------------+
|服务端:|postgres://db:5432/ |db:|
||------------------->|#端口:['…:5432']|
+----------+                      +-------------------------+
Docker文档中将进一步介绍此设置。通常不需要明确指定
容器名称:
网络:
;Compose为您提供了这些东西的合理工作默认值


对于需要为应用程序本身和单独的API服务器配置URL的基于浏览器的应用程序,一个好的做法是将反向代理设置为容器。这可能类似于Nginx,或者在纯开发环境Webpack的代理服务器中。由于代理在两个容器之间进行调用,因此您需要使用Docker内部URL
http://server:5000
用于后端。这意味着浏览器中的代码和后端api都位于同一主机和端口上,因此您可以使用仅路径相对URL
/api/…
,绕过使用哪个主机和端口的问题。

所以现在我们不能用服务名称替换localhost,因为浏览器在docker之外,它不知道服务名称?但一旦部署,我们可以用IP地址或域名替换它吗?如果我们使用nginx反向代理,react应用程序中的axios基本URL是什么?