मैं TCP पर docker API को कैसे उजागर करूं?


13

मैं पोर्टेनेर का उपयोग कर रहा हूं और दूरस्थ समापन बिंदुओं को प्रबंधित करने में असमर्थ हूं। मैंने रिमोट डॉक नोड्स से कनेक्ट करने के लिए कमांड लाइन का उपयोग करने की कोशिश की, लेकिन एक संदेश मिला Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?

हां, वे भाग रहे हैं। मैंने खुद को डॉकटर ग्रुप में जोड़ा है और नोड्स में SSHing करके डॉकटर तक पहुंच बना सकता हूं। हालाँकि मैं किसी भी डॉक नोड को दूरस्थ रूप से एक्सेस नहीं कर सकता।

मैंने /etc/defaultजोड़ने / असहज करने के लिए संशोधित कियाDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

मैं भी संशोधित /etc/init.d/dockerऔर /etc/init/docker.confशामिल करने के लिए DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

मैंने docker सेवा को फिर से शुरू किया, लॉग आउट किया और प्रक्रिया में कई बार लॉग इन किया, लेकिन फिर भी दूरस्थ नोड से कनेक्ट नहीं हो सका। मैं IP पास करके स्थानीय नोड से कनेक्ट नहीं कर सकता।

मुझे क्या याद किया? टीसीपी पर एपीआई किस फ़ाइल में कॉन्फ़िगरेशन को उजागर करता है?

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<REMOTE_IP>:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://127.0.0.1:2375 info
Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://<LOCAL_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?
user@hostname:~$

संपादित करें:ps aux | grep -i docker यह रिटर्न लौटा रहा है -

root      3581  0.1  0.2 596800 41540 ?        Ssl  04:17   0:35 /usr/bin/dockerd -H fd://
root      3588  0.0  0.0 653576 14492 ?        Ssl  04:17   0:18 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

क्या 2375 सुन रहा है? ss -ntl
jscott

नहीं, 2375 पर कुछ भी नहीं सुना जा रहा है। और मैं यह पता नहीं लगा सकता कि किस फाइल में क्या कॉन्फ़िगरेशन प्रभावित करता है। मैंने ps auxअपने उत्तर के आउटपुट को शामिल किया है यदि वह मदद करता है।
भगवान लोह।

मैंने ऐसी ही चीजों की कोशिश की और संदेह किया कि फाइलें / etc / default / docker, /etc/init/docker.conf और /etc/init.d/docker केवल dock-ce की स्थापना के साथ Ubuntu 16.04 पर नजरअंदाज की जाती हैं, क्या कोई पुष्टि कर सकता है ? मुझे लगता है कि जब मैं "सर्विस डॉकटर स्टेटस" चलाता हूं, तो वास्तव में "सिस्टेक्ट्ल स्टेटस डॉकटर" होता है, एक पूरी अन्य प्रबंधन प्रणाली।
1844

जवाबों:


22

मुझे इवान क्रिज़सन की पोस्ट के लिए एक समाधान मिला ।

मुझे /lib/systemd/system/docker.serviceलाइन को संशोधित करने के लिए अपने Ubuntu 16.04.2 LTS सिस्टम पर संपादन करना पड़ा

ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:

फिर

sudo systemctl daemon-reload
sudo systemctl restart docker.service

और सब कुछ काम :-)। अगला कदम यह पता लगाने का है कि डॉकमैन डेमन फॉर्म को अपहृत किए जाने से कैसे बचाया जाए।


1
मैं इस परिवर्तन की पुष्टि करता है कि डॉकर-सीड 17.06 के साथ उबंटू के 16.04 पर HTTP अनुरोधों को सुनने के लिए डॉकडर की आवश्यकता है। सेवा स्क्रिप्ट को सीधे संशोधित करना गलत लगता है।
क्रिसिनटाउन

7
कभी भी docker सेवा स्क्रिप्ट (या कोई सेवा स्क्रिप्ट) को सीधे संपादित न करें। SystemD में एक अंतर संपादन सुविधा है, जिसका उपयोग करें systemctl edit docker.serviceऔर systemctl आपके संपादन के साथ एक नई फ़ाइल बनाएगा। यह आपके परिवर्तनों को अपडेट करने से रोकता है। SystemD दो फाइलों को रनटाइम पर मर्ज करेगा। यहाँ अच्छा दस्तावेज़: digitalocean.com/community/tutorials/…
Routhinator

धन्यवाद! यह बहुत उपयोगी है। मैं अपडेट के दौरान चेतावनी देता रहता हूं। मैं इस पर गौर करूँगा: _)
भगवान लोह।

4
उबंटू सर्वर 18.04 पर, इसने इस तरह काम किया:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
ल्यूसियन अक्ला

जब मैं -H tcp://सेटिंग के बिना अपने आप सेटिंग का उपयोग करता -H fd://हूं, तो मैं इश्यू और क्लाइंट कमांड जारी नहीं कर सकता, जैसे .., डॉक जानकारी, डॉक वर्जन, आदि
क्रिस एफ

3

/ Etc / डिफ़ॉल्ट निर्देशिका वह जगह है जहाँ वितरण अनुरक्षक अपनी विन्यास फाइल रखते हैं। यदि आप डॉकर की रिपॉजिटरी से सीधे डॉकटर स्थापित करते हैं, तो इस निर्देशिका का उपयोग नहीं किया जाएगा।

/ Lib / systemd निर्देशिका वह जगह है जहाँ संकुल अपनी systemd फ़ाइलों को स्थापित करेगा, और वे उन्नयन पर वहाँ किसी भी परिवर्तन को अधिलेखित कर देंगे। यदि आप इसका उपयोग करते हैं, तो आपके परिवर्तन खो जाएंगे।

एक सिस्टम यूनिट फ़ाइल के लिए अपने स्वयं के परिवर्तन करने के लिए जो बनी रहती है, आप /etc/systemd/system/docker.service.d/ में एक यूनिट फ़ाइल बना सकते हैं, जैसे यहाँ मेरा मानक /etc/systemd/systemd/docker.service है। घ / override.conf:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

यह ओवरराइड करता है बस कमांड लाइन के सभी झंडे को सिस्टमड से डॉकर्ड डेमॉन तक अनसेट करता है। एक बार हो जाने पर, आप /etc/docker/daemon.json से हर सेटिंग को ओवरराइड कर सकते हैं, जो डॉकटर द्वारा उपयोग किया जाता है, और सेटिंग के आधार पर, डेमॉन को फिर से शुरू किए बिना फिर से लोड किया जा सकता है। जैसे यहाँ एक उदाहरण /etc/docker/daemon.json है:

{
"debug": false,
"experimental": true,
"hosts": ["fd://", "tcp://0.0.0.0:2376"],
"labels": ["foo=bar", "fez=baz"],
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"},
"storage-driver": "overlay2",
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/host-cert.pem",
"tlskey": "/etc/docker/certs/host-key.pem",
"tlsverify": true
}

अपने उद्देश्यों के लिए, आपको केवल मेजबानों को सेट करने के लिए लाइन की आवश्यकता है।

उपरोक्त कॉन्फ़िगरेशन फ़ाइल का एक अत्यंत महत्वपूर्ण हिस्सा TLS सेटिंग्स हैं। यदि आप क्लाइंट और सर्वर के बीच पारस्परिक TLS को कॉन्फ़िगर नहीं करते हैं, और आप नेटवर्क पर सुनने के लिए docker को खोलते हैं, तो आप बिना पासवर्ड के रूट लॉगिन के साथ एक ओपन टेलनेट सर्वर के बराबर चल रहे हैं। यदि आप टेलनेट पर ssh पसंद करते हैं, या यदि आप अपने रूट खाते के लिए पासवर्ड रखना पसंद करते हैं, तो आपको TLS को कॉन्फ़िगर करना होगा। Docker API पोर्ट इंटरनेट पर अक्सर स्कैन किए जाते हैं, और यदि आप कभी भी इस कॉन्फ़िगरेशन चरण को छोड़ देते हैं, तो आपको थोड़ी देर में आपके होस्ट पर मैलवेयर इंस्टॉल हो जाएगा।

क्लाइंट और सर्वर के लिए TLS कुंजियों को कॉन्फ़िगर करने के बारे में पूर्ण विवरण यहां पाया जा सकता है: https://docs.docker.com/engine/security/https/


1
एक बहुत अच्छा जवाब जो कि डॉकटर सेवा के भविष्य के अपडेट से बचेगा। यह इसे करने का सही तरीका है।
फोपेडुश

2

यदि आप अपने डॉक डेमॉन को फिर से कॉन्फ़िगर और पुनः आरंभ नहीं करना चाहते हैं, तो आप यूनिक्स सॉकेट को टीसीपी सॉकेट ncat( nmapपैकेज से) का उपयोग करके पा सकते हैं :

ncat -lknvp 2375 -c "ncat -U /var/run/docker.sock"

विकल्प के रूप में, आप सोसैट या अन्य उपकरणों का उपयोग कर सकते हैं ।


गजब का! क्या मैं इस कमांड को पृष्ठभूमि में रख सकता हूँ? जब मैं बंद मेरी टर्मिनल कनेक्शन खो जाता है
फेलिक्स

आह मुझे मिला nohupऔर&
फेलिक्स

0

एक आधिकारिक दस्तावेज वर्णन करता है कि कैसे कॉन्फ़िगर किया जाए जहां डोकर डेमॉन कनेक्शन के लिए सुनता है

systemd बनाम daemon.json

Docker को Systemd यूनिट फ़ाइल और daemon.json फ़ाइल दोनों का उपयोग करके कनेक्शन के लिए सुनने के लिए कॉन्फ़िगर करना एक संघर्ष का कारण बनता है जो Docker को शुरू होने से रोकता है।

सिस्टमड यूनिट फ़ाइल के साथ रिमोट एक्सेस को कॉन्फ़िगर करना

  1. एक पाठ संपादक में docker.service के लिए एक ओवरराइड फ़ाइल खोलने के लिए कमांड sudo systemctl edit docker.service का उपयोग करें।

  2. अपने स्वयं के मूल्यों को प्रतिस्थापित करते हुए, निम्नलिखित पंक्तियों को जोड़ें या संशोधित करें।

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. फ़ाइल सहेजें।

  4. सिस्टमैक्टल कॉन्फ़िगरेशन को पुनः लोड करें।

    $ sudo systemctl daemon-reload
    
  5. डॉकटर को पुनः आरंभ करें।

    $ sudo systemctl restart docker.service
    
  6. यह देखने के लिए जांचें कि क्या डॉकटर कॉन्फ़िगर पोर्ट पर सुन रहा है पुष्टि करने के लिए नेटस्टैट के आउटपुट की समीक्षा करके परिवर्तन को सम्मानित किया गया था।

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

के साथ दूरस्थ पहुँच कॉन्फ़िगर करना daemon.json

  1. इस प्रकार के रूप में UNIX सॉकेट और एक आईपी पते से कनेक्ट करने के लिए /etc/docker/daemon.json में मेजबान सरणी सेट करें:

    {
    "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
    

    Docker को Systemd यूनिट फ़ाइल और daemon.json फ़ाइल दोनों का उपयोग करके कनेक्शन के लिए सुनने के लिए कॉन्फ़िगर करना एक संघर्ष का कारण बनता है जो Docker को शुरू होने से रोकता है।

    1. अपने स्वयं के मूल्यों को प्रतिस्थापित करते हुए, निम्नलिखित पंक्तियों को जोड़ें या संशोधित करें।

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. फ़ाइल सहेजें।

    3. सिस्टमैक्टल कॉन्फ़िगरेशन को पुनः लोड करें।

      $ sudo systemctl daemon-reload
      
  2. डॉकटर को पुनः आरंभ करें।

  3. यह देखने के लिए जांचें कि क्या डॉकटर कॉन्फ़िगर पोर्ट पर सुन रहा है पुष्टि करने के लिए नेटस्टैट के आउटपुट की समीक्षा करके परिवर्तन को सम्मानित किया गया था।

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

डॉक क्लाइंट क्लाइंट के DOCKER_HOSTलिए -Hध्वज सेट करने के लिए पर्यावरण चर का सम्मान करेगा । निम्न आदेशों में से एक का उपयोग करें:

$ docker -H tcp://127.0.0.1:2375 ps

या

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.