gpt4 book ai didi

docker - 连接 dockerized 应用程序网络以进行 api 调用

转载 作者:行者123 更新时间:2023-12-02 00:50:07 24 4
gpt4 key购买 nike

我在连接这些点时遇到了一些问题。

我设法将我们的遗留应用程序和更新的应用程序 docker 化,但现在我需要让它们通过 API 调用相互交谈

项目:

  • Project1 = 使用 project1_appnet(网桥驱动程序)
  • Project2 = 使用 project2_appnet(网桥驱动程序)
  • Project3 = 使用 project3_appnet(网桥驱动程序)

在我的本地,我将这 3 个项目放在 3 个单独的文件夹中。每个项目都有自己的appdbcache 服务。

这是其中一个项目的 docker-compose.yml。 (他们有几乎所有相同的 docker-compose.yml 只是不同的图像和卷​​路径)

version: '3'
services:
app:
build: ./docker/app
image: 'cms/app:latest'
networks:
- appnet
volumes:
- './:/var/www/html:cached'
ports:
- '${APP_PORT}:80'
working_dir: /var/www/html
cache:
image: 'redis:alpine'
networks:
- appnet
volumes:
- 'cachedata:/data'
db:
image: 'mysql:5.7'
environment:
MYSQL_ROOT_PASSWORD: '${DB_ROOT_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USER}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
ports:
- '${DB_PORT}:3306'
networks:
- appnet
volumes:
- 'dbdata:/var/lib/mysql'
networks:
appnet:
driver: bridge
volumes:
dbdata:
driver: local
cachedata:
driver: local

问题:

  • 如何让他们能够通过 API 调用相互交谈? (在我的本地开发和生产环境中)
  • 在生产环境中,设置会有点不同,它们会在不同的机器上,但仍然在同一个 VPC 中,甚至通过公共(public)网络。这是什么设置?

注意:

  • 我一直在查看 link,但显然它已被 v3 弃用或不被推荐
  • 尝试从 project1 容器curl 到 project2 容器,方法是:
root@bc3afb31a5f1:/var/www/html# curl localhost:8050/login
curl: (7) Failed to connect to localhost port 8050: Connection refused

最佳答案

如果您的最终设置是每个服务将在物理上不同的系统上运行,那么实际上没有任何选择。一个系统不能直接访问另一个系统上的Docker网络;服务 1 能够访问服务 2 的唯一方法是通过其主机的 DNS 名称(或 IP 地址)和发布的端口。由于这在不同的环境中会有所不同,我建议将该值设为已配置的环境变量。

environment:
SERVICE_2_URL: 'http://service-2-host.example.com/' # default port 80

一旦您确定了这一点,您就可以对单主机部署使用相同的设置,大多数情况下。如果您的开发人员系统使用 Docker for Mac 或 Docker for Windows,您应该能够使用 special Docker hostname到达其他服务

environment:
SERVICE_2_URL: 'http://host.docker.internal:8082/'

(如果您在桌面上使用 Linux,则必须知道主机的一些 IP 地址;不是 localhost,因为那表示“此容器”,而不是 docker0 接口(interface)地址,因为它将在特定网络上,但类似于主机的 eth0 地址。)

您的另一个选择是“借用”另一个 Docker Compose 网络作为外部网络。如果您的所有 Docker Compose 设置都具有相同的名称,则有些棘手;从一些实验来看,Docker 内部 DNS 似乎总是首先解析为您自己的 Docker Compose 文件,并且您必须知道诸如 Compose 分配的容器名称(不难重建且稳定)之类的内容才能到达其他服务。

version: '3'
networks:
app2:
external:
name: app2_appnet
services:
app:
networks:
- appnet
- app2_appnet
environment:
SERVICE_2_URL: 'http://app2_app_1/' # using the service-internal port
MYSQL_HOST: db # in this docker-compose.yml

(我建议使用 Docker Compose default network 而不是声明您自己的;这将主要让您删除文件中的所有 networks: block 而不会产生任何不良影响,但在这种特定情况下,您将需要声明 networks: [default, app2_default] 以连接到两者。)

当您开始考虑这个时,您可能还会考虑多主机容器解决方案。 Kubernetes 有点重量级,但它会在集群中的任何节点上运行容器(你不必特别担心放置问题)并且它为你提供命名空间和自动 DNS 解析;您只需将 SERVICE_2_URL: 'http://app.app2/' 设置为指向其他命名空间,而无需担心这些网络细节。

关于docker - 连接 dockerized 应用程序网络以进行 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58255075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com