我有一个基于 PHP (lumen) 的 API 和一个基于 React 的电子商务。
两者的工作都很好。当我尝试通过 Docker 使其工作时,问题就来了。
我想部署仅运行一个命令的整个应用程序。
问题是 react 应用程序没有与 API 连接。
我在这篇文章中尝试了@Suman Kharel 的回答
Proxying API Requests in Docker Container running react app
但它不起作用。有谁知道我怎样才能解决它?
这是我在 bitbucket 上的 repo。
https://bitbucket.org/mariogarciait/ecommerce-submodule/src/master/
希望有人知道我做错了什么。
谢谢
最佳答案
使用 docker-compose 仅用于测试目的或非常有限的生产基础设施。最好的方法是将您的工件分别放在不同的主机中。
请阅读这些以了解一些要点:
当您使用 docker-compose 时,所有服务都部署在同一台机器上,但每个服务都在一个容器中。并且只有一个进程在容器内运行。
因此,如果您进入一个容器(例如 nodejs 中的 Web)并列出进程,您将看到如下内容:
nodejs .... 3001
并进入另一个容器,如数据库 postgres:postgres .... 5432
所以,如果nodejs web需要连接数据库,从内部,必须需要ip来代替本地主机 postgress 数据库,因为在 nodejs 容器内部,只有一个进程在本地主机中运行:localhost 3001
所以,使用 localhost:5432
不会在 nodejs 容器内工作。解决办法是使用postgres的ip代替localhost:10.10.100.101:5432
解决方案当我们有多个容器 (docker-compose) 并且它们之间存在依赖关系时,docker 建议我们:
总而言之,通过这些功能,docker 创建了一种“特殊网络”,您的所有容器都可以在其中安静地离开,而不会受到 ips 的影响!
带有 host.docker.internal 的 Docker 网络
仅用于测试、快速部署或在非常有限的生产环境中,您可以使用最新版本的 docker-compose(1.29.2) 和 docker 中的新功能。
在 docker-compose 的末尾添加这个
networks:
mynetwork:
driver: bridge
如果某些容器需要主机 ip,请使用 host.docker.internal 而不是ipenvironment:
- DATABASE_HOST=host.docker.internal
- API_BASE_URL=host.docker.internal:8020/api
最后在使用 的容器中host.docker.internal 添加这个:extra_hosts:
- "host.docker.internal:host-gateway"
只需将此添加到您的所有容器中networks:
- mynetwork
Note: This was tested on ubuntu, not on mac or windows, because no bodies deploy its real applications on that operative systems
环境变量方法
在我看来,Docker 链接或网络是一种幻觉或欺骗,因为这仅适用于一台机器(开发或登台),隐藏了我们和其他复杂主题的依赖关系,当您的应用程序离开您的笔记本电脑并转到您的准备好供您的用户使用的真实服务器。
无论如何,如果您将 docker-compose 用于开发人员或实际目的,这些步骤将帮助您管理容器之间的 ip:
例子:
db:
image: mysql:5.7.22
container_name: db_ecommerce
ports:
- "5003:3306"
environment:
MYSQL_DATABASE: lumen
MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
api-php:
container_name: api_ecommerce
ports:
- "8020:80"
- "445:443"
environment:
- DATABASE_HOST=$MACHINE_HOST
- DATABASE_USER=$DATABASE_USER
- DATABASE_PASSWORD=$DATABASE_PASSWORD
- ETC=$ETC
web-react:
container_name: react_ecommerce
ports:
- 3001:3000
environment:
- API_BASE_URL=$MACHINE_HOST:8020/api
docker-compose up -d
同样在您的 react 应用程序中,使用 package.json 中的 var 代替代理读取您的 api 的 url:
process.env.REACT_APP_API_BASE_URL
查询 this了解如何从 react 应用程序读取环境变量。在这里您可以找到更详细的使用步骤 MACHINE_HOST 变量及其用途:
建议
关于reactjs - 如何通过 docker 连接 API 和 React App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63136530/