![](/img/trans.png)
[英]How could I create connection between two services in docker-compose so that they can ping each other?
[英]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.