मेरे पास बैकएंड अप (नोडजेएस) है जो कुछ बंदरगाह पर सुन रहा है (इस उदाहरण में 2345)। क्लाइंट एप्लिकेशन एक रिएक्ट ऐप है। दोनों आपस में संवाद करने के लिए socket.io का लाभ उठा रहे हैं। दोनों कंटेनरीकृत हैं। मैं फिर "नेटवर्क" ध्वज का उपयोग करके उन दोनों को एक ही नेटवर्क पर चलाता हूं:

docker run -it --network=test1 --name serverapp server-app docker run -it --network=test1 client-app

क्लाइंट में, मेरे पास यह कोड है (सर्वर में कोड बहुत मानक है, लगभग socket.io पेज से कॉपी-पेस्ट):

const socket = io.connect('http://serverapp:2345');
socket.emit('getData');
  socket.on('data', function(data) {
      console.log('got data: ${data}');
  })

मुझे जो संदेह है वह यह है कि समस्या का संबंध http-server पैकेज द्वारा क्लाइंट (रिएक्ट) ऐप परोसने से है, और फिर ब्राउज़र के संदर्भ में, होस्टनाम को समझा नहीं जाता है और इसलिए इसका समाधान नहीं किया जा सकता है। जब मैं ब्राउज़र कंसोल में जाता हूं, तो मुझे निम्न त्रुटि दिखाई देती है: GET http://tbserver:2345/socket.io/?EIO=3&transport=polling&t=MzyGQLT net::ERR_NAME_NOT_RESOLVED

अब अगर मैं (क्लाइंट-ऐप में) होस्टनाम serverapp को लोकलहोस्ट पर स्विच करता हूं (जिसे ब्राउजर समझता है लेकिन डॉकटर में उपयोग करने की अनुशंसा नहीं की जाती है क्योंकि इसे अलग तरीके से व्याख्या किया जाता है), सर्वर सॉकेट से कनेक्ट करने का प्रयास करते समय, मैं त्रुटि प्राप्त करें: <मजबूत> प्राप्त करें .io/?EIO=3&transport=polling&t=MzyFyAe net::ERR_CONNECTION_REFUSED।

एक और जानकारी यह है कि हम वर्तमान में रिएक्ट ऐप बनाते हैं (npm run build का उपयोग करके), और फिर हम निम्नलिखित Dockerfile का उपयोग करके Docker कंटेनर बनाते और चलाते हैं:

FROM mhart/alpine-node
RUN npm install -g http-server
WORKDIR /app
COPY /app/build/. /app/.
EXPOSE 2974 2326 1337 2324 7000 8769 8000 2345
CMD ["http-server", "-p", "8000"]`

(इसलिए, कंटेनर बनाते समय रिएक्ट ऐप का कोई निर्माण नहीं होता है; हम एक बार पूर्वनिर्मित पर भरोसा करते हैं)

मुझे यकीन नहीं है कि मैं यहां क्या खो रहा हूं और अगर इसका http-server से कोई लेना-देना है या नहीं, लेकिन इससे पहले मैं एक ही डॉकर नेटवर्क का उपयोग करके 2 NodeJS अनुप्रयोगों के बीच पूरी तरह से काम कर रहे socket.io कनेक्शन प्राप्त करने में कामयाब रहा, तो यह एक कोड मुद्दा नहीं होना चाहिए।

3
Hummus 6 जिंदा 2020, 22:25
क्या आप इस पते को अपने डॉकटर में प्राप्त कर सकते हैं और देख सकते हैं कि यह काम करता है? 'http://serverapp:2345' हो सकता है कि आपके पास docker के अंदर DNS न हो
 – 
Oded BD
6 जिंदा 2020, 22:31
डॉकर में wget से आपका क्या मतलब है? आपका मतलब डॉकर निष्पादन का उपयोग करके है?
 – 
Hummus
6 जिंदा 2020, 22:43
इस कमांड को डॉकर शेल के अंदर चलाएँ
 – 
Oded BD
6 जिंदा 2020, 22:45
Docker exec -it cdbd wget 'serverapp:2345' उत्पन्न करता है: wget: खराब पता 'serverapp:2345'
 – 
Hummus
6 जिंदा 2020, 22:47
अपने डोमेन को आदि/होस्टों में इस तरह जोड़ने का प्रयास करें: thegeekdiary.com/… मुझे बताएं कि क्या यह काम करता है इसलिए मैं उत्तर के रूप में पोस्ट करूंगा
 – 
Oded BD
6 जिंदा 2020, 22:50

1 उत्तर

आपके ब्राउज़र को यह जानने की जरूरत है कि सॉकेटियो सर्वर पते को कैसे हल किया जाए। आप serverapp के पोर्ट 2345 और अपने होस्ट के पोर्ट 2345 को serverapp के पोर्ट 2345 से बाइंड कर सकते हैं

docker run -it --network=test1 -p 2345:2345 --name serverapp server-app

इस तरह आप अपने क्लाइंट कोड में लोकलहोस्ट का उपयोग कर सकते हैं

const socket = io.connect('http://localhost:2345');

अपने क्लाइंट Dockerfile से 2345 से भी छुटकारा पाएं

1
prithajnath 6 जिंदा 2020, 23:32