gpt4 book ai didi

docker - docker 服务如何管理从单独的 docker 容器调用实例?

转载 作者:行者123 更新时间:2023-12-02 19:45:07 29 4
gpt4 key购买 nike

我最近开始使用Docker + Celery。我还共享了full sample codes for this example on github,以下是其中的一些代码段,以帮助解释我的观点。
就上下文而言,我的示例被设计为订阅微服务系统中的事件的节点。在此节点中,它包含以下服务:

  • 订阅服务器(使用kombu订阅事件)
  • worker (使用celery来对事件执行异步任务)
  • Redis(作为消息代理和celery的结果后端)

  • 服务在 docker-compose.yml文件中定义如下:
    version: "3.7"
    services:
    # To launch the Subscriber (using Kombu incl. in Celery)
    subscriber:
    build: .
    tty: true
    #entrypoint: ...

    # To launch Worker (Celery)
    worker:
    build: .
    entrypoint: celery worker -A worker.celery_app --loglevel=info
    depends_on:
    - redis

    redis:
    image: redis
    ports:
    - 6379:6379
    entrypoint: redis-server
    为了简单起见,我为订户保留了代码,我认为在 订户容器中使用python交互式 shell 程序就足够了:
    python3
    >>> from worker import add
    >>> add.delay(2,3).get()
    5
    并在 工作器容器日志中:
    worker_1      | [2020-09-17 10:12:34,907: INFO/ForkPoolWorker-2] worker.add[573cff6c-f989-4d06-b652-96ae58d0a45a]: Adding 2 + 3, res: 5
    worker_1 | [2020-09-17 10:12:34,919: INFO/ForkPoolWorker-2] Task worker.add[573cff6c-f989-4d06-b652-96ae58d0a45a] succeeded in 0.011764664999645902s: 5
    虽然一切似乎都正常,但我感到不安。我以为这个示例不尊重docker容器的隔离原理。

    Aren't containers designed to be isolated to the level of it's OS,processes and network? And if containers have to communicate, shouldn't it be done via IP address and network protocols (TCP/UDP etc.)


    首先,在我的示例中,工作程序和订户运行相同的代码库,因此,在import语句上不会出现任何问题。
    但是,celery worker是从 worker容器中的 entrypoint启动的,因此, 订户是如何在所谓隔离的 worker容器中设法调用celery worker实例的?
    为了进一步验证它实际上是从 worker容器中调用celery worker实例,我停止了 worker容器,并在 用户容器中重复了python交互式shell示例。再次打开工作容器后,请求将等待(这是 celery 的预期结果),并返回相同的结果。因此,IMO,是的,来自一个容器的服务正在从另一个容器调用应用程序实例,而没有网络连接,例如连接到Redis(使用IP地址等)的情况。
    请告知我的理解是不正确的还是在我不知道的地方有错误的实现。

    最佳答案

    消费者(工作人员)和生产者(子投标人)都配置为将Redis(redis)用作代理和结果后端。这就是为什么一切正常的原因。 -当您在订阅者容器中执行add.delay(2,3).get()时,它会将任务发送给Redis,并由运行在另一个容器中的Celery工作人员将其选中。
    请记住,运行add.delay(2,3).get()代码的Python进程正在订户容器中运行,而执行add()函数并将结果存储在结果后端中的ForkPoolWorker-2进程正在工作容器中运行。这些过程是完全独立的。
    订阅者进程未在工作容器中调用任何东西! -用简单的英语说,这是“我需要做的(在Redis中),请工作人员完成,并让我知道您已完成,以便我获取结果”。

    关于docker - docker 服务如何管理从单独的 docker 容器调用实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63935973/

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