Web容器无法从docker compose调用后端容器

2024-01-21

我仍在码头工人的世界中找到自己的立足点。我正在尝试将我的小宠物项目 Docker 化。前端是一个 vue-cli 应用程序,它与包含 spring boot 制作的 Restful API 的后端进行通信。

所以我的方法是为后端和前端声明两个单独的 dockerfile,并通过一个 docker compose 文件将它们组合起来。所以文件夹结构是 -

backend/
       - Dockerfile
frontend/
       - Dockerfile
docker-compose.yml

由于前端需要能够调用后端服务,因此我创建了一个桥接网络并在它们之间共享网络。这是我的 docker 撰写文件 -

version: "2"
services:
  backend:
    build: backend/.
    networks:
      - movie-network
    ports:
      - "8098:8098"
  frontend:
    build: frontend/.
    ports:
      - "8812:8080"
    networks:
      - movie-network

networks:
  movie-network:
    driver: bridge

我在后端暴露了一个端点,称为/api/findAll。现在,如果前端服务通过以下方式调用 APIhttp://localhost:8098:/api/findAll(主机网络),我可以从我的浏览器查看它(http://本地主机:8812 http://localhost:8812),一切正常。

但是如果前端使用相同的 API 调用backend:8098/api/findAll;利用桥接网络 - 它在我的浏览器中给出错误 -

如果我做一个docker exec前端ping后端,ping成功

那么,为什么它在我的浏览器中给出错误(http://本地主机:8812 http://localhost:8812)?我在概念上做错了什么吗?寻求建议。

前端 Dockerfile -

FROM node:lts-alpine

# install simple http server for serving static content
RUN npm install -g http-server

# make the 'app' folder the current working directory
WORKDIR /app

# copy both 'package.json' and 'package-lock.json' (if available)
COPY package*.json ./

# install project dependencies
RUN npm install

# copy project files and folders to the current working directory (i.e. 'app' folder)
COPY . .

# build app for production with minification
RUN npm run build

EXPOSE 8080

后端 Dockerfile -

FROM openjdk:11-jre-slim
# Creating app directory
WORKDIR /usr/src/movies
# Copying Jar (didn't use FROM maven to save some time)
COPY target/movies*.jar movies.jar

RUN pwd

RUN ls -la
# Exposing Port
EXPOSE 8098
# Running App
ENTRYPOINT ["java","-jar","/usr/src/movies/movies.jar"]

此设置的重要一点是,您的实际前端代码不是在 Docker 中运行,而是在浏览器中运行。这意味着它不了解 Docker 网络、容器或其他任何东西;您提供的 URL 必须能够到达主机上已发布的端口。这就是为什么localhost在这里工作(如果浏览器和容器在同一主机上运行)但是backend没有。

一种典型的方法是设置某种反向代理,它既可以托管前端应用程序代码,又可以代理后端应用程序。 (例如,设置 Nginx,其位置为/api route proxy_pass http://backend:8098,及其/路线要么try_files预构建的 Javascript 应用程序或proxy_pass http://frontend:8080.)

如果你这样做,那么e.g. http://localhost:8900是前端并且http://localhost:8900/api从浏览器的角度来看,是后端。这避免了 @coedycode 中暗示的 CORS 问题他们的答案 https://stackoverflow.com/a/60988610/10008173;但这也意味着前端代码可以使用相对URL/api(没有主机名)并回避整个问题。

+-------------+                  | Docker >           /     +----------+
+-------------+                  |                 /------> | frontend |
|             |  localhost:8900  |    +-------+    |        +----------+
|   Browser   | ---------------> | -> | nginx | -> +
|             |                  |    +-------+    | /api   +----------+
|             |                  |                 \------> | backend  |
+-------------+                  |                          +----------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web容器无法从docker compose调用后端容器 的相关文章

随机推荐

  • 理解特异性:在不使用 !important [重复] 的情况下实现所需的选择器结果

    这个问题在这里已经有答案了 我试图理解特异性 in CSS 我目前的理解是特异性与继承非常相似 但在某种程度上定义更具体 Mozilla 特异性定义 https developer mozilla org en docs Web CSS S
  • 如何为下一个子例程保留该变量的值?

    我是一名初级程序员 没有经验 正在为我现在正在做的工作学习 Visual Basic 我读了一天左右 终于决定开始制作所需的程序了 但是 我遇到了一些问题 现在我有两个子程序 第一个子例程让用户输入他们有多少个数据对 以便我可以创建一个表供
  • clojure类型转换字符串到符号

    在 clojure 中我有向量 myfn1 myfn2 myfn3 我如何使用该向量中的字符串调用名为 myfn1 的函数 调用绑定到 Var 的函数myfn1给定字符串 myfn1 你可以这样做 resolve symbol myfn1
  • Spring security/hibernate:即使它们是正确的,凭证也不好?

    嘿 我的基于 springsecurity 的登录有点混乱 我不断收到错误 凭据错误 这是我的用户表 用户表 1 这是我的 applicationContext 中的数据源
  • 如何在 PowerShell 中解析来自 Invoke-WebRequest 的 JSON?

    当向服务器发送 GET 请求时 使用自签名证书 add type using System Net using System Security Cryptography X509Certificates public class Trust
  • Docker 远程 API 是否有等效的“docker run --rm ...”?

    我希望能够在容器退出后轻松清理它们 这可以通过远程 API 实现吗 除了我自己发现出口并使用 DELETE containers 端点删除 拉斯克斯的答案现在已经过时了 Docker 远程 API 1 25shifted rm从客户端到服务
  • 如何使用 python 或(和)ruby 卸载任何应用程序

    我没有通过这个问题在网上找到任何有用的主题 这些都是关于如何卸载 python 或卸载 ruby 但没有关于 TOPIC 的信息 主要问题是我使用了其他有趣的answers https stackoverflow com questions
  • GDI泄漏问题

    我注意到使用任务管理器 以下代码中存在 GDI 泄漏 每次执行此代码时 执行此代码的进程中 GDI 对象的计数都会增加 1 但我似乎找不到问题 任何帮助 将不胜感激 create new DC based on current HDC hD
  • 如何让网页高度适合屏幕高度

    我需要使我的网页高度适合屏幕尺寸的高度而不滚动 HTML
  • 使用 R ggplot2 和 ggplotly 在地图上一年的累积点

    我正在尝试在地图上累计绘制每个月打开的新位置 我可以每月创建一个包含新位置的动画 但不能累积 换句话说 我希望看到新地点添加到现有地点 这是示例数据 DF lt data frame latitude c 42 29813 41 83280
  • 从 WooCommerce 购物车错误消息中删除库存数量

    在 WooCommerce 中 我将 woocommerce gt settings gt products gt inventory gt stock display format 设置为 永远不要显示剩余库存数量 但是 如果客户将产品广
  • 将 Numpy 数组保存为图像(说明)

    我在之前的帖子中找到了答案 将 Numpy 数组保存为图像 https stackoverflow com questions 902761 saving a numpy array as an image 唯一的问题是 没有太多关于使用
  • 在 Python/Bash 中通过 SSH/Sudo 测试文件/目录是否存在 [重复]

    这个问题在这里已经有答案了 我正在远程服务器上安装证书 并想在覆盖它们之前检查它们是否存在 服务器仅允许通过 ssh 公钥进行非 root 访问 我可以sudo s在 shell 中 root 一次 需要 root 权限 因为其他人无法读取
  • Play 框架模板自动导入模型。_ 除其他外

    似乎在 Play 框架模板中 有一个隐式的 import models 和 import play api data Form 因为我的代码 title String myForm Form User 无需在第一行后放置显式导入语句即可工作
  • ASP运行在64位环境下,使用Access数据库

    我有一位客户自 2003 年以来一直在运行一个使用 asp 3 0 构建的简单网站 其中包含一个 access 数据库文件 mdb 最近 该客户购买了一台带有 Windows 2003 Server 64 位的新服务器 该网站不再运行 显示
  • WMI 调用获取驱动程序

    我是 WMI 的新手 它是什么 例如 我可以在 C 中使用 WMI 调用来获取我的 PC 上的驱动程序列表吗 如果是这样 我该打电话给哪个班级 要列出已安装的驱动程序 您可以使用Win32 PnPSignedDriver http msdn
  • Python 中的球形 k 均值实现

    我一直在使用scipy 的 k 均值 http docs scipy org doc scipy reference cluster vq html已经有一段时间了 我对它在可用性和效率方面的工作方式感到非常满意 然而 现在我想探索不同的
  • C# 5.0 异步中的可等待和等待者

    Task 或Task 对象是可等待的 因此我们可以对返回值为Task 或Task 的对象使用await 键 Task 或 Task 是最常用的可等待对象 我们还可以定义自己的可等待对象 该对象应该具有以下资格 它有一个 GetAwaiter
  • 绑定字符串格式

    我有一组要显示的文本块 并且我需要每个文本块的文本以不同的方式显示 我当前正在标记属性中保存格式字符串 并且需要以此格式显示文本 如何绑定 StringFormat 部分 类似于下面的部分
  • Web容器无法从docker compose调用后端容器

    我仍在码头工人的世界中找到自己的立足点 我正在尝试将我的小宠物项目 Docker 化 前端是一个 vue cli 应用程序 它与包含 spring boot 制作的 Restful API 的后端进行通信 所以我的方法是为后端和前端声明两个