[英]How to code retry policy for port in server side to listen client request?
[英]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.