簡體   English   中英

當多個其他服務正在使用Redis和Elastic Search之類的服務時,是否應該為它們創建單獨的Docker容器?

[英]Should you create separate docker containers for services like redis and elastic search when they are being used by more than one other service?

我將整個堆棧放在docker compose容器設置中。 當前,負載可以全部在單個實例上運行。 我有兩個單獨的應用程序,它們都使用Redis和彈性搜索。

我見過有人建議,在類似MySQL的情況下,正確的容器理論建議,如果您有兩個使用它們的獨立應用程序,則應該為兩個獨立的數據庫擁有兩個獨立的容器。

我認為這對MySQL很好,因為我的理解是,單獨的MySQL實例實際上並不會增加太多的內存或處理器開銷。

我想知道是否應該將相同的策略應用於redis和elasticsearch。 我的理解是,這兩個應用程序都可能帶來相當大的開銷。 因此,似乎無法運行多個實例。

這是一個有趣的問題,但是我不確定對此是否有一個普遍的答案。 這主要取決於您的情況。

但是,如果您將唯一的容器用於多個應用程序,則必須了解其優缺點。 舉個例子,假設您只有兩個應用程序容器: AB ,以及一個共享的DB容器,無論使用哪種技術。

好處

  • 資源使用受到限制。 但是,正如您在問題中指出的那樣,如果數據庫容器開銷不是那么重要,那么這並不是真正的優勢。

缺點

如果AB是獨立的應用程序,則共享DB的主要缺點是您將打破這種獨立性,並通過DB緊密耦合您的應用程序:

  • 您不能獨立更新數據庫容器。 需要針對兩個應用程序調整數據庫版本。 如果A需要新版本的DB (例如,需要新功能),則必須升級DB ,從而可能破壞B
  • 對於ABDB的配置不能不同:如果A發出的寫操作多於讀取的操作,並且如果B密集地讀取數據,那么您可能找不到兩種用法的理想配置
  • 數據庫崩潰對兩個應用程序都有影響: A甚至可能通過使數據庫崩潰而崩潰B
  • 安全問題:即使AB具有在數據庫單獨的數據庫實例中可能可能進入菜單B數據庫實例,除非您設置不同的訪問/角色; 在這里,每個應用程序只有一個容器可能更容易,並且如果它們位於同一網絡中,也不必擔心訪問(當然,如果不能從外部訪問數據庫
  • 您必須將ABDB服務放在同一個docker-compose文件中

結論

如果AB已經是緊密耦合的應用程序,那么您可能可以選擇1 DB 如果您沒有很多資源,也可以共享DB 但是不要忘記這樣做,您可以耦合應用程序,而這可能是您不想要的。 否則,最干凈的解決方案是每個應用程序使用1個DB

我看到的主要好處是,泊塢窗組成堆棧中具有所有鏈接的服務,然后泊塢窗將確保所有必需的服務正常運行。 但是,使用redis和elastic之類的服務時,最好將它們與應用程序一起獨立安裝,僅通過泊塢窗組成文件中傳遞的環境變量指向它們。

例如

 myapp:
    image: myawesomerepo/myapp:latest
    depends_on:
     - someother_svc_in_same_docker_compose
    environment:
      - DB_HOST=172.17.2.73
      - REDIS_HOST=172.17.2.103
      - APP_ENV=QA
      - APM_ENABLE=false
      - APM_URL=http://172.17.2.103:8200
      - CC_HOST=cc-3102
    volumes:
      - /opt/deploy/cc/config:/server/app/config
      - /opt/deploy/cc/slogs:/server/app/logs
    command: node ./app/scheduler/app.js

例如,將來如果您決定要托管這些服務,則只需將URL指向正確的方向即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM