基于多租户架构的两个 docker 容器之间的通信

Communication between two docker containers based on multi-tenant architecture

我有两个 django 项目(微服务),运行 在单独的 docker 容器中。两个项目都在使用 django-tenant-schemas。如何在 url http://boohoo.site.com:18150/api/me/、[=13= 上将 serice-bar 的请求发送到 service-foo ]是project-a的PORT?我需要使用租户 url 以便 project-a 可以验证租户并处理请求。

我可以使用容器名称发送请求,但这不起作用,因为如果我使用 http://site.foo:18150/api/me,它会成功发送请求,但没有定义为 site.foo 的租户。

这是docker-compose.yml

version: '3.3'

services:
  db:
    container_name: site.postgres
    image: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  foo:
    container_name: site.foo
    build:
      context: ../poll
    command: python /app/foo/src/manage.py runserver 0.0.0.0:18150
    depends_on:
      - db
    environment:
      - DB_HOST=site.postgres
      - DJANGO_SETTINGS_MODULE=main.settings.dev
    stdin_open: true
    tty: true
    ports:
      - "18150:18150"

  bar:
    container_name: site.bar
    build:
      context: ../toll
    command: python /app/bar/src/manage.py runserver 0.0.0.0:18381
    depends_on:
      - db
    environment:
      - DB_HOST=site.postgres
      - DJANGO_SETTINGS_MODULE=main.settings.dev
    stdin_open: true
    tty: true
    ports:
      - "18381:18381"

您可以在默认(或任何其他...)网络上使用别名来执行此操作。有关此功能的更多信息,请参阅 documentation。我检查了一下,您当前的撰写文件版本 (3.3) 支持这一点,但我建议您尽可能升级到支持的最新版本 (3.7)。

为了简洁起见,我只在下面复制修改后的 foo 服务声明,其中我只添加了必要的 networks 节。

  foo:
    container_name: site.foo
    build:
      context: ../poll
    command: python /app/foo/src/manage.py runserver 0.0.0.0:18150
    depends_on:
      - db
    environment:
      - DB_HOST=site.postgres
      - DJANGO_SETTINGS_MODULE=main.settings.dev
    networks:
      default:
        aliases:
          - boohoo.site.com
    stdin_open: true
    tty: true
    ports:
      - "18150:18150"

此更改后,您的 foo 服务容器将可以从同一网络上的任何其他容器通过 foo(服务名称)、site.foo(您的自定义容器名称)或 boohoo.site.com(网络别名)。