sách gpt4 ai đã đi

Dịch vụ Docker quản lý việc gọi các phiên bản từ các container Docker riêng biệt như thế nào?

In lại 作者:行者123 更新时间:2023-12-02 19:45:07 29 4
mua khóa gpt4 Nike

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

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

  • 服务在 docker-compose.yml文件中定义如下:
    version: "3.7"
    dịch vụ:
    # 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
    phụ thuộc vào:
    - redis

    làm lại:
    image: redis
    cổng:
    - 6379:6379
    entrypoint: redis-server
    为了简单起见,我为订户保留了代码,我认为在 订户容器中使用python交互式 shell 程序就足够了:
    python3
    >>> from worker import add
    >>> add.delay(2,3).get()
    5
    và trong 工作器容器日志中:
    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容器TRONG entrypoint启动的,因此, 订户是如何在所谓隔离的 worker容器中设法调用celery worker实例的?
    为了进一步验证它实际上是从 worker容器中调用celery worker实例,我停止了 worker容器,并在 用户容器中重复了python交互式shell示例。再次打开工作容器后,请求将等待(这是 celery 的预期结果),并返回相同的结果。因此,IMO,是的,来自一个容器的服务正在从另一个容器调用应用程序实例,而没有网络连接,例如连接到Redis(使用IP地址等)的情况。
    请告知我的理解是不正确的还是在我不知道的地方有错误的实现。

    1 Câu trả lời

    消费者(工作人员)和生产者(子投标人)都配置为将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
    行者123
    Hồ sơ cá nhân

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá Didi Taxi miễn phí
    Mã giảm giá Didi Taxi
    Giấy chứng nhận ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com