使用服务名称在 docker-compose React 容器中调用 API 到 django 容器

2024-03-22

我有一个 docker compose,其中包含一个 React 应用程序和其他 django 容器。它们位于同一网络中,因此当我尝试使用服务名称从 React 容器向其中一个 django 服务发出curl 请求时,它可以工作,但在 Web 应用程序中它不起作用,它说:

POST http://backend-account:8000/api/auth/login/ net::ERR_NAME_NOT_RESOLVED

这是我的码头工人组成:

version: "3.9"
services:
  db-account:
    restart: always
    container_name: ctr-db-account-service
    image: mysql:8
    environment:
      - MYSQL_DATABASE=dtp_db
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=ictf
      - MYSQL_HOST=db
      - MYSQL_PORT=3306
      - MYSQL_ROOT_HOST=%
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - account-data:/var/lib/mysql
    networks:
      - dtp-network

  db-stream:
    restart: always
    container_name: ctr-db-stream-service
    image: mysql:8
    environment:
      - MYSQL_DATABASE=dtp_db
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=ictf
      - MYSQL_HOST=db
      - MYSQL_PORT=3306
      - MYSQL_ROOT_HOST=%
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - stream-data:/var/lib/mysql
    networks:
      - dtp-network

  backend-account:
    restart: always
    container_name: ctr-account-service
    command:
      # bash -c "python check_db.py --service-name db --ip db --port 3306 &&
      bash -c "sleep 20 &&
      python manage.py migrate &&
      python manage.py runserver 0.0.0.0:8000"
    env_file:
      - ./dtp-account-management-app/account_management/.env
    build:
      context: ./dtp-account-management-app/account_management/
      dockerfile: Dockerfile
    expose: 
      - 8000
    ports:
      - "8080:8000"
    depends_on:
      - db-account
    links:
      - db-account
    networks:
      - dtp-network

  backend-stream:
    restart: always
    container_name: ctr-stream-service
    command:
      # bash -c "python check_db.py --service-name db --ip db --port 3306 &&
      bash -c "sleep 20 &&
      python manage.py migrate &&
      python manage.py runserver 0.0.0.0:7000"
    env_file:
      - ./dtp-stream-management-app/stream_management/.env
    build:
      context: ./dtp-stream-management-app/stream_management/
      dockerfile: Dockerfile
    expose: 
      - 7000
    ports:
      - "7000:7000"
    depends_on:
      - db-stream
    links:
      - db-stream
    networks:
      - dtp-network

  frontend:
    restart: always
    command: npm start
    container_name: ctr-frontend-service
    build:
      context: ./dtp-frontend-app/
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    stdin_open: true
    depends_on:
      - backend-account
      - backend-stream
    links:
      - backend-stream
      - backend-account
    networks:
      - dtp-network

networks:
  dtp-network:
    driver: bridge

volumes:
  account-data:
    driver: local
  stream-data:
    driver: local

此外,当错误发生时,我在终端中什么也没有得到,更像是没有通信,但是尝试在反应容器中运行curl请求,我得到了这个响应:

/react # curl -i -X GET --url http://backend-account:8000/api/auth/login/
HTTP/1.1 200 OK
Date: Mon, 13 Sep 2021 11:25:06 GMT
Server: WSGIServer/0.2 CPython/3.9.6
Content-Type: application/json
Vary: Accept, Origin
Allow: POST, OPTIONS
X-Frame-Options: DENY
Content-Length: 40
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin

您的 Web 应用程序(React)最终在用户的浏览器中运行,而不是在容器中运行。此时,它们不在同一个 docker 网络中,并且使用服务名称将无法像在容器内使用curl 时那样工作。

因此,您需要在服务器上公开您的服务,以便用户在家里的自己的计算机上使用浏览器可以发出网络请求。

然后,您需要在前端代码中使用您设置的服务器IP地址或域名来访问Django后端。

由于您已经发布了后端的端口,8080:8000 and 7000:7000,如果您的防火墙允许,您可以在您的服务器 IP 上访问该服务。

例如,在前端代码中使用其中之一。

http://<your-server-ip>:8080
# or
http://<your-server-ip>:7000

也就是说,我建议购买一个域名并设置指向您的服务器的 DNS 记录。然后,您还可以提供适当的 SSL 证书,对流量进行加密。

顺便说一句,如果您只想在服务之间与 docker 进行内部通信,那么您不需要像以前那样发布端口。这可能会也可能不会导致安全问题。例如,您的数据库没有发布端口,后端仍然可以连接。但正如我所说,这更多的是一个随机的侧面事实,而不是实际答案的一部分。要解决您的问题,您需要执行我上面描述的操作。

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

使用服务名称在 docker-compose React 容器中调用 API 到 django 容器 的相关文章

随机推荐

  • Coq 中 MSet 的使用示例

    MSets https coq inria fr library Coq MSets MSets html似乎是 OCaml 式有限集的最佳选择 可悲的是 我找不到示例用途 如何定义一个空的MSet或单身人士MSet 我怎样才能结合两个MS
  • 正确实施全局配置

    我的目标是在我正在开发的 C 游戏中拥有全局常量 以表示一些图形信息等 我当前的实现是将它们全部放在 h 中并将它们包含在各处 这是可行的 只是每次我更改设置时 都必须重新编译整个代码库 所以 我的下一个想法是将它们放入一些配置 txt 文
  • 如何替换 JUnit 5 中的 WireMock @Rule 注释?

    我在测试中使用 WireMock 并有这样一行代码 Rule public WireMockRule wireMockRule new WireMockRule 8080 我想切换到 JUnit 5 所以我添加了下一个依赖项 使用 Grad
  • C++ 数组中对象的多态性

    我是一名嵌入式软件工程师 来自位和 C 世界 在那个世界里 闪存中有数据 用C语言的const表示 RAM中有数据 RAM 昂贵且有限 而闪存则便宜且足够 此外 由于碎片问题或安全规定 不允许使用 new delete malloc 等动态
  • 创建并加载用于 openGL 的 RGBA4444 RGBA5551 中的 .png

    我正在创建一个 openGL 游戏 到目前为止 我一直在使用 RGBA8888 格式的 png 作为纹理表 但这些太占用内存了 而且我的应用程序经常崩溃 我在 Apple 网站上读到 这种格式仅在需要太多质量时才使用 并建议使用 RGBA4
  • R 赋值的 Python 等价物

    在 R 中 我可以使用assign https stat ethz ch R manual R devel library base html assign html动态地为环境中的名称分配一个值 而不是 lt Example gt ass
  • Rails 5“gemify”资产清单文件

    Update 在工作状态下得到这个 宝石可以在这里找到 https github com jakehockey10 popcircle https github com jakehockey10 popcircle 原帖 我正在尝试将 jq
  • 加载 ember.js 对象时,动画 gif 暂停

    当 ember js 正在做它的事情时 旋转器实际旋转时遇到问题 我有一个非常通用的 jsfiddle 示例来说明这个问题 http jsfiddle net h4ZcZ 2 http jsfiddle net h4ZcZ 2 我认为必须有
  • CSS3 非线性动画路径

    如何使用 css3 制作非线性动画 基本上 如果我需要从视口中取出一个盒子 并且它是一条直线向下的路径 那么使用以下代码就很容易做到 transition transform 0 5s ease in And some JS to trig
  • SoX 使用 ProcessBuilder 运行缓慢

    我正在使用 java 中的 ProcessBuilder 来运行 SoX 它将 WAV 文件修剪为 30 秒长的 WAV 文件 SoX 正在运行 因为我可以成功修剪文件的前 30 秒并将其保存为新文件 但它停在那里 但它仍在运行 这是命令生
  • 在存储到 mysql 数据库之前压缩文本

    我正在使用 php 和 MySQL 开发一个 Web 应用程序 在存储在 MySQL 数据库中 在数据库中存储压缩形式的文本之前 我使用 gzcompress php 函数压缩文本 我的问题是这样可以吗 存储压缩形式 或者这个方法会不会给我
  • 使用 Android 相机进行图像处理

    我想使用 onPreviewFrame 在将图像显示给用户之前对其进行后处理 即应用色调 棕褐色等 据我了解 返回给回调的 byte 数据以 YUV420sp 编码 人们是否已经在 J ava 中或使用 NDK 本机代码 将其解码为 RGB
  • Scala dropWhile 与过滤器

    val xs Iterator from 1 dropWhile 2 0 takeWhile lt 10 toList val ys Iterator from 1 filter 2 0 takeWhile lt 10 toList pri
  • 如何用python生成a-z范围内的随机值

    我有 python 代码 它将生成随机值 例如 JAY5uFy4F 这是我运行 python 脚本时的第一个输出 这是我的代码 a n 1 c 1 c2 3 Start 10 n 1 End 10 n 1 while 1 Num rando
  • “无法找到一组匹配的功能”——Selenium 与 Python 2.7

    将 Selenium 3 8 1 与 Python 2 7 和 Firefox Portable 54 64 位结合使用 运行此脚本时收到以下错误消息 from selenium import webdriver from selenium
  • 了解 Azure Functions 高级计划计费

    我一直在阅读有关此问题的各种文档 但无法清楚地确认我的理解 我们正在评估 Azure Functions Premium Plan 并希望对成本有更清晰的了解 我的理解如下 在高级计划中 我们可以配置最小实例数和突发大小 这是高级计划实例的
  • Android SDK 管理器下载完成后校验和错误?

    I am using Android SDK Manager revision 23 0 5 I tried to update some SDK but got this errors I tried a lot of times And
  • 测量Java中单链表的大小/长度?

    我需要帮助int size Java 中单向链表的方法 这是我到目前为止所拥有的 但它没有返回列表的正确大小 public int size int size 0 Node CurrNode head while CurrNode next
  • 如何限制 Sinatra/Active Record 中数据库字符串值的字符/字数?

    我的专栏里有一个ActiveRecord我想要有一定字数限制的数据库 本质上 我创建了一个允许用户输入文本 字符串 的表单 我想限制该字符串中允许的字符数 allposts Post limit 20 这是我到目前为止在 get 方法中所拥
  • 使用服务名称在 docker-compose React 容器中调用 API 到 django 容器

    我有一个 docker compose 其中包含一个 React 应用程序和其他 django 容器 它们位于同一网络中 因此当我尝试使用服务名称从 React 容器向其中一个 django 服务发出curl 请求时 它可以工作 但在 We