Node.js 何时在docker中将localhost替换为服务名称?
我已将reactjs应用程序和express应用程序对接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
这是我的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是什么?