簡體   English   中英

如何使 docker-compose 服務可以相互訪問?

[英]How to make docker-compose services accesible with each other?

我正在嘗試使前端應用程序可以訪問外部。 它依賴於其他幾個模塊,用作服務/后端。 其他服務也依賴於 Kafka 和 OpenLink Virtuoso(數據庫)之類的東西。

我怎樣才能讓所有這些都可以相互訪問,我應該如何將我的前端暴露給外部互聯網? 我是否還應該刪除代碼中的任何“localhost/port”,並將其替換為服務名稱? 我是否還應該將代碼中的每個端口都替換為 docker 的等效端口?

這是我的 docker-compose.yml 文件的摘錄。

version: '2'
services:
    zookeeper:
        image: confluentinc/cp-zookeeper:latest
        environment:
          ZOOKEEPER_CLIENT_PORT: 2181
          ZOOKEEPER_TICK_TIME: 2000
        ports:
          - 22181:2181

    kafka:
        image: confluentinc/cp-kafka:latest
        depends_on:
          - zookeeper
        ports:
            - 29092:29092
        environment:
          KAFKA_BROKER_ID: 1
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
          KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
          KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
          KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
   frontend:
       build:
          context: ./Frontend
          dockerfile: ./Dockerfile
       image: "jcpbr/node-frontend-app"
       ports:
          - "3000:3000"
       # Should I use links to connect to every module the frontend access and for the other modules as well?
       links: 
           - "auth:auth"
    auth:

      build:
          context: ./Auth
          dockerfile: ./Dockerfile
      image: "jcpbr/node-auth-app"
      ports:
          - "3003:3003" 
   (...)

我怎樣才能使所有 [我的服務] 都可以相互訪問?

絕對什么都不做。 刪除過時的links:阻止你。 Compose 會自動創建一個名為default的網絡,您可以使用該網絡在容器之間進行通信,並且它們可以使用其他 Compose 服務名稱作為主機名; 例如,您的auth容器可以連接到kafka:9092 另請參閱 Docker 文檔中的 Compose 網絡

(其他一些設置將提倡手動創建 Compose networks:並覆蓋container_name: ,但這不是必需的。為了簡單起見,我會刪除這些行。)

我應該如何將我的前端暴露給外部互聯網?

這就是ports: ['3000:3000']行所做的。 任何可以通過端口 3000(第一個端口號)訪問您的主機系統的人都可以訪問frontend容器。 就外部調用者而言,他們不知道事情是否在 Docker 中運行,只是您的主機在端口 3000 上運行 HTTP 服務器。

設置反向代理,可能基於 Nginx,稍微復雜一些,但解決了從瀏覽器應用程序到后端容器通信的一些問題。

我還應該刪除代碼中的任何“localhost/port”嗎?

是的,一點沒錯。

...並將其替換為服務名稱? 每個端口?

不,因為這些設置在您的非容器開發環境中將不正確,並且如果您將生產部署到雲環境,則可能再次不正確。

這里最簡單的正確答案是使用環境變量。 在 Node 代碼中,您可以嘗試

const kafkaHost = process.env.KAFKA_HOST || 'localhost';
const kafkaPort = process.env.KAFKA_PORT || '9092';

如果您在沒有設置這些環境變量的情況下在本地運行它,您將獲得通常正確的開發人員默認設置。 但是在基於 Docker 的設置中,您可以設置這些環境變量

services:
  kafka:
    image: confluentinc/cp-kafka:latest
    environment:
       KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092  # must match the Docker service name
  app:
    build: .
    environment:
      KAFKA_HOST: kafka
      # default KAFKA_PORT is still correct

暫無
暫無

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

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