[英]react can't access API docker-compose
我有三個容器:MySQL 8、Spring Boot 和 React,並制作了 docker-compose.yml,完全基於 Callicoder https://github.com/callicoder/spring-security-react-ant-design-polls-app
還嘗試了 npm 啟動而不是構建的開發環境版本,沒有 nginx,並得到了 nodejs api 錯誤 ECONNREFUSED。 但是我可以 go 到 postman 並在 localhost:8080 中正常使用 api,所以我猜這是一個 docker 容器通信問題,但不知道如何解決它
docker-compose.yml
version: "3.8"
services:
app-server:
build:
context: olimpoback
dockerfile: Dockerfile
ports:
- "8080:8080"
restart: always # "no" always unless-stopped
depends_on:
- mysqldb
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb:3306/Olimpo?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
SPRING_DATASOURCE_USERNAME: admin
SPRING_DATASOURCE_PASSWORD: senha
networks:
- backend
- frontend
#volumes:
# – /data/spring-boot-app
# Frontend Service
app-client:
build:
context: olimpoFront
dockerfile: Dockerfile.prod
args:
REACT_APP_API_BASE_URL: http://localhost:8080/
ports:
- "80:80"
restart: always
depends_on:
- app-server
networks:
- frontend
mysqldb:
image: mysql:8.0.21
container_name: mysqlDB
command: --default-authentication-plugin=mysql_native_password
ports:
- "3306:3306"
restart: always
environment:
- MYSQL_DATABASE=Olimpo
- MYSQL_USER=admin
- MYSQL_PASSWORD=senha
- MYSQL_ROOT_PASSWORD=senha
volumes:
- mysql_data:/var/lib/mysql
- ./mysql-dump:/docker-entrypoint-initdb.d
networks:
- backend
volumes:
mysql_data:
driver: local
networks:
backend:
frontend:
DockerFile(前端)
FROM node:14.15.1 as build
WORKDIR /app
EXPOSE 3000
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json package-lock.json ./
RUN npm install --silent && npm install react-scripts@3.3.0 -g --silent
COPY . ./
ARG REACT_APP_API_BASE_URL
ENV REACT_APP_API_BASE_URL=${REACT_APP_API_BASE_URL}
RUN npm run build
FROM nginx:1.20.1
WORKDIR /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf
COPY --from=build /app/build /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]
package.json
...
"proxy": "http://127.0.0.1:8080",
...
Docker 的localhost
localhost
您嘗試使用 Postman 訪問的本地主機不同。發生這種情況是因為app-server
、 app-client
和mysqldb
是在同一網絡中運行的 3 個不同容器。 他們每個人都有自己的名字。
因此,要從容器內部訪問您的app-server
,您可以使用: http://app-server:8080
例如,查看您的數據庫 url:
jdbc:mysql://mysqldb:3306/Olimpo?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
您可能會注意到,出於同樣的原因,您正在嘗試訪問 url mysqldb
而不是localhost
。 您指的是數據庫 url 作為容器名稱。
你可以在這里更深入地了解
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.