簡體   English   中英

Docker中如何讓客戶端和服務器監聽同一個端口

[英]How to get client and server to listen to the same port in Docker

這個 Docker 網絡包含兩個 Java 文件,一個客戶端和一個服務器。 目標是讓客戶端向服務器發送消息。

我已經硬編碼服務器來監聽端口7892 因此,如果我在 Docker 之外本地運行服務器,它將監聽localhost:7892 同樣,我對客戶端進行了硬編碼,以將其消息發送到傳遞的 IP 地址上的端口 7892,如果在本地運行,我傳遞localhost

一旦我將服務器和客戶端容器化到 Docker 中,就很難讓客戶端將其消息發送到服務器。 客戶端將嘗試發送其消息,但我不確定它會將其發送到哪里。 服務器正在偵聽某個端口,但我不確定為什么兩者沒有相互連接。

docker-compose.yml:

version: '3.9'

services:
  server:
    build:
      context: ./
      dockerfile: Dockerfile-project1
    image: project1:latest
    container_name: server
    working_dir: /parallelcomputing
    networks:
      - project1network
    ports:
      - 7892 # this is what I've put in my TCPClient and TCPServer
    command:
      - /bin/bash
      - -c
      - |
        echo "Initialize client...done!"
        cd project1
        java -cp ../socket_programming/target/socket_programming-1.0-SNAPSHOT.jar edu.rit.cs.socket.TCPServer
        tail -f /dev/null

  client:
    image: project1:latest
    container_name: client
    depends_on:
      - server
    working_dir: /parallelcomputing
    networks:
      - project1network
    command:
      - /bin/bash
      - -c
      - |
        echo "Initialize server...done!"
        cd project1
        java -cp ../socket_programming/target/socket_programming-1.0-SNAPSHOT.jar edu.rit.cs.socket.TCPClient affr.csv host.docker.internal
        tail -f /dev/null

networks:
  project1network:

當我運行docker ps時,我可以看到

0f9857535e5a   project1:latest   "/bin/bash -c 'echo …"   2 minutes ago   Up 2 minutes                             client
71b499a3c71f   project1:latest   "/bin/bash -c 'echo …"   2 minutes ago   Up 2 minutes   0.0.0.0:55000->7892/tcp   server

看來服務器正在偵聽 docker 網絡 localhost 上的端口 7892(據我了解,它是host.docker.internal )。

在我的 docker-compose.yml 中,我嘗試告訴客戶端將其消息發送到 docker 網絡本地主機上的端口 7892,但它不起作用。

client    | IO:Connection refused (Connection refused)

我嘗試了多種其他端口配置,搜索了網絡文檔,但我不確定如何讓兩者連接?

同樣,我對客戶端進行了硬編碼,以將其消息發送到傳遞的 IP 地址上的端口 7892,如果在本地運行,我傳遞 localhost。
....客戶端將嘗試發送它的消息,但我不確定它發送到哪里......

由於您沒有提供目標 IP 或主機名,因此您的客戶端實現正在向自身發送請求(相同的 docker 容器)。

我建議閱讀Compose 文檔中的官方 Docker Networking文檔。

例如,假設您的應用位於名為 myapp 的目錄中,並且您的 docker-compose.yml 如下所示:

 version: "3.9" services: web: build: . ports: - "8000:8000" db: image: postgres ports: - "8001:5432"

每個容器現在可以查找主機名 web 或 db 並取回相應容器的 IP 地址。 例如,web 的應用程序代碼可以連接到 URL postgres://db:5432 並開始使用 Postgres 數據庫。

或者,您可以指定服務器的主機名,也可以使用客戶端實現中的主機名。

version: '3'
services:
  dns:
    hostname: 'server0001'

然后您的客戶端應用程序應該向server0001:7892發送請求

暫無
暫無

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

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