मैंने नीचे Dockerfile का उपयोग करके docker चित्र बनाए हैं।

 FROM ubuntu
 RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    net-tools \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    netcat \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
EXPOSE 1234
ENTRYPOINT bin/bash
CMD ["nc", "-l", "1234"]

मैंने उपरोक्त डॉकर फ़ाइल से छवि बनाई और नीचे दिए गए आदेश को चलाकर छवि का उपयोग करके डॉकर कंटेनर चलाएं।

docker run -d  -i -p 1234:1234 --name daemon  nc-ubuntu nc -l 1234

दूसरे टर्मिनल में, मैं नीचे कमांड चलाता हूं।

telnet localhost 1234

मुझे नीचे का आउटपुट मिला।

$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

मैं यह कोशिश कर रहा हूं क्योंकि यह डोकर को डेमन प्रक्रिया के रूप में चलाने के लिए मैनिंग द्वारा अध्याय 2 में अभ्यास में पुस्तक डॉकर से नमूना है।

लेखक के अनुसार मुझे परिणाम नीचे मिलना चाहिए।

$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon

कोई विचार क्यों मुझे अपेक्षित आउटपुट नहीं मिल रहा है।

4
Rajkumar Natarajan 10 सितंबर 2017, 19:21

2 जवाब

सबसे बढ़िया उत्तर

यह कभी काम नहीं करेगा। आपके Dockerfile में कई समस्याएं हैं।

1

ENTRYPOINT को /bin/bash पर सेट करने का मतलब है कि docker run... बस bash शुरू करने जा रहा है। यह सवाल <कोड के बारे में पढ़ें >ENTRYPOINT और CMD

2

चूंकि आप गैर-संवादात्मक मोड में हैं, bash तुरंत बाहर निकलने वाला है। विचार करना:

host$ docker run nc-ubuntu
host$

बनाम:

host$ docker run -it nc-ubuntu
root@e3e1a1f4e453:/# 

बाद वाला, -it (जो एक ट्टी डिवाइस आवंटित करता है, जिसे इंटरेक्टिव मोड में बैश की आवश्यकता होती है) के कारण, एक bash प्रॉम्प्ट मिलता है।

3

कोई भी आह्वान कंटेनर को netcat चलाने का कारण नहीं बनेगा...और अगर ऐसा हुआ भी, तो आपके Dockerfile में कुछ भी hello daemon प्रतिक्रिया उत्पन्न नहीं करेगा जिसकी आप अपेक्षा कर रहे हैं।

4

nc कमांड लाइन गलत है। वाक्यविन्यास है:

nc -l -p <port>

तो आपको आवश्यकता होगी:

CMD ["nc", "-l", "-p", "1234"]

5

यदि आप वास्तव में चाहते हैं कि nc आपको hello daemon प्रतिक्रिया प्रदान करे, तो आपको अपनी nc कमांड लाइन में एक उपयुक्त -c कमांड जोड़ने की आवश्यकता होगी, जैसे:

CMD ["nc", "-l", "-p", "1234", "-c", "echo hello daemon"]

यह अंतिम डॉकरफाइल जैसा दिखता है:

FROM ubuntu
RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    net-tools \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    netcat \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
EXPOSE 1234
CMD ["nc", "-l", "-p", "1234", "-c", "echo hello daemon"]

और अगर मैं इसे बनाता हूं:

docker build -t nc-ubuntu .

और इसे चलाएं:

docker run -d  -i -p 1234:1234 --name daemon  nc-ubuntu

फिर मैं अपने होस्ट पर 1234 पोर्ट करने के लिए टेलनेट कर सकता हूं और अपेक्षित प्रतिक्रिया देख सकता हूं:

host$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon
Connection closed by foreign host.

इस बिंदु पर, कंटेनर बाहर निकल गया होगा क्योंकि nc एकल कनेक्शन (अतिरिक्त मापदंडों के बिना) को स्वीकार करने के बाद बाहर निकलता है, और जब अग्रभूमि प्रक्रिया बाहर निकलती है, तो एक डॉकर बाहर निकलता है।


मेरे पास पुस्तक तक पहुंच नहीं है इसलिए मैं यह नहीं बता सकता कि क्या यह पुस्तक के साथ किसी समस्या के लिए है या यदि आपने अपने कार्यान्वयन में कोई गलती की है, लेकिन मैं सुझाव दूंगा कि कई ऑनलाइन डॉकर ट्यूटोरियल हैं जो शायद कम से कम उतने ही अच्छे हैं।

11
larsks 10 सितंबर 2017, 19:44

एक सरल उपाय जो मेरे लिए काम करता है - docker run -p 1234:1234 -it --rm alpine /bin/sh -c "nc -l -p 1234"

दूसरे टर्मिनल रन से nc localhost 1234

2
Avik Chakraborty 5 फरवरी 2020, 11:21