एक जीवित डॉकटर कंटेनर पर एक बंदरगाह का प्रदर्शन


408

मैं एक डॉकटर कंटेनर बनाने की कोशिश कर रहा हूं जो एक पूर्ण-आभासी मशीन की तरह काम करता है। मुझे पता है कि मैं एक पोर्ट को उजागर करने के लिए एक डॉकफाइल के अंदर एक्सपोजर इंस्ट्रक्शन का उपयोग कर सकता हूं, और मैं पोर्ट को असाइन करने के लिए -pध्वज का उपयोग कर सकता हूं docker run, लेकिन एक बार कंटेनर वास्तव में चल रहा है, क्या अतिरिक्त पोर्ट को खोलने / मैप करने के लिए एक कमांड है?

उदाहरण के लिए, मान लें कि मेरे पास डॉकटर कंटेनर है जो sshd चला रहा है। कंटेनर ssh का उपयोग कर कोई और httpd स्थापित करता है। क्या कंटेनर पर पोर्ट 80 को बेनकाब करने और होस्ट पर 8080 को पोर्ट करने के लिए इसे मैप करने का कोई तरीका है, ताकि लोग कंटेनर में चलने वाले वेब सर्वर पर जाकर उसे पुनः आरंभ कर सकें?


1
आप कंटेनर को एक निष्क्रिय आईपी दे सकते हैं , इसलिए पोर्ट मैपिंग की आवश्यकता नहीं है।
मैट

जवाबों:


331

आप डॉकर के माध्यम से ऐसा नहीं कर सकते, लेकिन आप मेजबान मशीन से कंटेनर के अन-एक्सपोज़र पोर्ट तक पहुँच सकते हैं।

यदि आपके पास एक कंटेनर है जो 8000 बंदरगाह पर चल रहा है, तो आप चला सकते हैं

wget http://container_ip:8000

कंटेनर का आईपी पता प्राप्त करने के लिए, 2 कमांड चलाएं:

docker ps

docker inspect container_name | grep IPAddress

आंतरिक रूप से, जब आप एक छवि चलाते हैं, तो डॉकटर iptables को कॉल करता है, इसलिए शायद इस पर कुछ बदलाव काम करेगा।

कंटेनर की पोर्ट 8000 को अपने लोकलहोस्टेस पोर्ट 8001 पर उजागर करने के लिए:

 iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000

एक तरह से आप इसे बाहर काम कर सकते हैं, एक अन्य कंटेनर को पोर्ट मैपिंग के साथ सेटअप करना है जिसे आप चाहते हैं, और iptables-save कमांड के आउटपुट की तुलना करें (हालांकि, मुझे कुछ अन्य विकल्पों को हटाना पड़ा जो ट्रैफ़िक को डॉकटर के माध्यम से जाने के लिए मजबूर करते हैं। प्रॉक्सी)।

नोट: यह सबकुछ करने वाला है, इसलिए इसे इस जागरूकता के साथ किया जाना चाहिए कि यह अच्छी तरह से नीला धुआं पैदा कर सकता है

या

एक और विकल्प है, नया (नई पोस्ट 0.6.6?) -प ऑप्शन देखना है - जो रैंडम होस्ट पोर्ट का उपयोग करेगा, और फिर उन्हें वायर करेगा।

या

0.6.5 के साथ, आप नए कंटेनर को लाने के लिए लिंक सुविधा का उपयोग कर सकते हैं जो उस कंटेनर के-पी झंडे के साथ कुछ अतिरिक्त रिले के साथ मौजूदा एक से बात करता है? (मैंने अभी तक लिंक का उपयोग नहीं किया है)

या

डॉकटर के साथ 0.11? आप docker run --net host ..अपने कंटेनर को होस्ट के नेटवर्क इंटरफेस से सीधे संलग्न करने के लिए उपयोग कर सकते हैं (अर्थात, नेट नाम-स्थान नहीं है) और इस प्रकार आपके द्वारा कंटेनर में खोले गए सभी पोर्ट उजागर हो जाते हैं।


6
यह कम से कम 1.3.0 के साथ काम करने के लिए प्रकट नहीं होता है। DOCKER DNAT नियम -p के साथ docker चलाते समय बनाया जाता है, लेकिन इसे मैन्युअल रूप से जोड़ने से कनेक्शन की अनुमति नहीं लगती है। अजीब तरह से नियम को हटाते हुए जब कंटेनर चल रहा है, तो इसे काम करने से रोकने के लिए नहीं लगता है ...
silasdavis

4
धन्यवाद। मुझे सुरक्षा की भावना से वंचित किया गया था कि संयुक्त राष्ट्र के उजागर बंदरगाह सुरक्षित थे।
शेंमक्ल

चीजों को स्वचालित करना और jq + sed का उपयोग करना, यह उपयोगी हो सकता है: CONTAINER_IP=$(docker inspect container_name | jq .[0].NetworkSettings.IPAddress | sed -r 's/\"([^\"]+)\"/\1/''])'); iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination ${CONTAINER_IP}:8000
ericson.cepeda

5
@ ericson.cepeda चालान के बजाय jqऔर sedआप के -fविकल्प का उपयोग कर सकते हैं docker inspect:CONTAINER_IP=$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' container_name)
pwes

उन है कि पसंद करते हैं के लिए kmkeen.com/jshon jshon -e 0 -e NetworkSettings -e Networks -e bridge -e IPAddress -u
SLF

138

यहाँ मैं क्या करूँगा:

  • लाइव कंटेनर को कमिट करें।
  • नई छवि के साथ कंटेनर फिर से चलाएँ, बंदरगाहों के साथ खुला (मैं एक साझा मात्रा बढ़ते और ssh बंदरगाह खोलने के साथ ही सलाह देंगे)
sudo docker ps 
sudo docker commit <containerid> <foo/live>
sudo docker run -i -p 22 -p 8000:80 -m /data:/data -t <foo/live> /bin/bash

31
मेरे प्रश्न का मुख्य भाग यह है कि कंटेनर को फिर से शुरू किए बिना ऐसा करने की आवश्यकता है ... नए कंटेनर में शिफ्टिंग फाइलें रख सकती हैं, लेकिन प्रभावी रूप से किसी भी चलने वाली प्रक्रियाओं को मार देगा, और एक भौतिक मशीन पर रिबूट के समान होगा। मुझे ऐसा किए बिना ऐसा करने की आवश्यकता है। फिर भी आपका धन्यवाद!
reberhardt

ठीक है। मैं एक समानांतर उदाहरण शुरू करने के लिए इसकी तुलना अधिक करूँगा। चूंकि दोनों अब (पुराने और नए) चल रहे हैं, नए कंटेनर के लिए प्रॉक्सी करना आसान हो सकता है, एक बार आवश्यक माइग्रेशन किए जाते हैं।
bosky101

हां, समानांतर उदाहरण और रिवर्स प्रॉक्सिंग कुछ प्रमुख कारण हैं जो मुझे डॉकर से प्यार है। हालांकि, इस परिदृश्य में, मुझे कंटेनर में सभी चलने वाली प्रक्रियाओं को संरक्षित करने की आवश्यकता है जो एसएसएच के माध्यम से शुरू हो सकती हैं। जबकि निष्पादकों को छवि को संरक्षित करने और एक समानांतर उदाहरण शुरू करने में संरक्षित किया जाएगा, जबकि निष्पादक स्वयं शुरू नहीं होंगे और रैम में कुछ भी खो जाएगा।
reberhardt

6
तुम क्यों दौड़ते हो sudo dockerऔर सिर्फ नहीं docker?
थियागो फिगुएइरो

इस टिप ने मुझे बहुत मदद की क्योंकि मैंने धीमे नेटवर्क में कई टन पैकेज स्थापित किए। चलाकर docker commitमैं सब कुछ फिर से स्थापित करने के लिए घंटों खर्च करने के बजाय फिर से आवेदन का परीक्षण करने के लिए तैयार था।
gustavohenke

49

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

# docker run \
  --rm \
  -p $PORT:1234 \
  verb/socat \
    TCP-LISTEN:1234,fork \
    TCP-CONNECT:$TARGET_CONTAINER_IP:$TARGET_CONTAINER_PORT

काम किया उदाहरण

एक वेब-सेवा लॉन्च करें जो पोर्ट 80 पर सुनती है, लेकिन इसके आंतरिक पोर्ट 80 (उफ़!) को उजागर करें।

# docker run -ti mkodockx/docker-pastebin   # Forgot to expose PORT 80!

इसका डॉकर नेटवर्क आईपी खोजें:

# docker inspect 63256f72142a | grep IPAddress
                    "IPAddress": "172.17.0.2",

verb/socatपोर्ट 8080 के साथ लॉन्च करें, और इसे IP के पोर्ट 80 पर TCP ट्रैफ़िक को अग्रेषित करने के लिए प्राप्त करें:

# docker run --rm -p 8080:1234 verb/socat TCP-LISTEN:1234,fork TCP-CONNECT:172.17.0.2:80

अब आप http: // localhost: 8080 / पर पास्टबिन का उपयोग कर सकते हैं , और आपके अनुरोध इसके लिए socat:1234आगे बढ़ते हैं pastebin:80, और प्रतिक्रिया रिवर्स में उसी पथ पर जाती है।


7
बहुत चालाक है! फिर भी, शायद उपयोग करने के लिए बेहतर है verb/socat:alpine, क्योंकि इसकी छवि में 5% पदचिह्न हैं (जब तक कि आप लिबास या डीएनएस असंगतताओं में नहीं चलते हैं )।
जेपी

3
वहाँ भी हैalpine/socat
Jamby

3
बहुत बढ़िया जवाब। सरल, एक लाइनर जो इसे किसी भी गंदे हैक के बिना प्राप्त करेगा।
ब्रूनो ब्रांट

2
यह मेरे लिए पूरी तरह से काम किया, धन्यवाद! मुझे --net myfoldername_defaultअपने verb/socatलॉन्च कमांड से जोड़ना पड़ा क्योंकि मैंने एक डॉक रचना में अन-एक्सपोज़र कंटेनर शुरू किया जो एक नेटवर्क बनाता है।
emazzotta

35

IPtables हैक काम नहीं करते हैं, कम से कम Docker 1.4.1 पर।

सबसे अच्छा तरीका यह होगा कि एक्सपोजर पोर्ट के साथ एक और कंटेनर को चलाया जाए और सोसाइट के साथ रिले किया जाए। यह वही है जो मैंने (अस्थायी रूप से) SQLPlus के साथ डेटाबेस से कनेक्ट किया है:

docker run -d --name sqlplus --link db:db -p 1521:1521 sqlplus

Dockerfile:

FROM debian:7

RUN apt-get update && \
    apt-get -y install socat && \
    apt-get clean

USER nobody

CMD socat -dddd TCP-LISTEN:1521,reuseaddr,fork TCP:db:1521

2
Iptables हैक्स को होस्ट मशीन से चलना चाहिए, डॉकटर कंटेनर से नहीं। यह आवश्यक रूप से मेजबान पर कुछ बंदरगाहों को उपयुक्त डॉकटर कंटेनर बंदरगाहों में अनुरोध अग्रेषित कर रहा है। यह बिल्कुल विशिष्ट नहीं है, और आप इसे पूरी तरह से अलग मेजबान के लिए कर सकते हैं। क्या आप अपनी डॉकर फ़ाइल में कोड स्वरूपण जोड़ सकते हैं? यह बहुत उपयोगी लगता है।
अनुस्वार

1
फरवरी 2016: डॉकर 1.9.1 रनिंग, यह एकमात्र समाधान था जिसने मेरे लिए सफलतापूर्वक काम किया। IPTables समाधान में से कोई भी काम नहीं किया। FROMसंसाधनों के कुशल उपयोग के लिए अपने डीबी कंटेनर के रूप में एक ही आधार छवि का उपयोग करने की सलाह दी जाती है ।
एक्सकैलिबर

4
आप एपलाइन / सोसाइटी को एक कोशिश देना चाह सकते हैं । यह सोसाइटी प्रीइंस्टॉल्ड के साथ आता है और सोसाइटी ऑप्शन को कमांड के रूप में स्वीकार करता है, इसलिए आपको डॉकरीफाइल लिखने की आवश्यकता नहीं है।
ट्राईच

35

यहाँ एक और विचार है। पोर्ट अग्रेषण करने के लिए SSH का उपयोग करें; ओएस एक्स (और शायद विंडोज) में काम करने का लाभ तब होता है जब आपका डोकर होस्ट एक वीएम होता है।

docker exec -it <containterid> ssh -R5432:localhost:5432 <user>@<hostip>

4
मेरे मामले में जो डॉकटर छवि चल रही थी, उसमें बाइनरी एसएच नहीं है
रादु टोडर

क्या मुझे अपनी मशीन पर SSH कुंजी बनाने और इसके लिए docker कंटेनर में डालने की आवश्यकता है?
अष्टकवर्ग

कंटेनर के अंदर @octavian ssh-keygen -t rsa।
ल्यूक डब्ल्यू

8

मुझे इसी मुद्दे से निपटना था और अपने किसी भी चलने वाले कंटेनर को रोककर इसे हल करने में सक्षम था। यह फरवरी 2016 तक एक सॉल्यूशन-अप-टू-डेट है, जिसमें डॉकर 1.9.1 का उपयोग किया गया है। वैसे भी, यह उत्तर @ ricardo-branco के उत्तर का एक विस्तृत संस्करण है, लेकिन नए उपयोगकर्ताओं के लिए अधिक गहराई में।

मेरे परिदृश्य में, मैं एक कंटेनर में चलने वाले MySQL से अस्थायी रूप से जुड़ना चाहता था, और चूंकि अन्य अनुप्रयोग कंटेनर इससे जुड़े हुए हैं, रोकना, पुन: कॉन्फ़िगर करना और डेटाबेस कंटेनर को फिर से चलाना एक गैर स्टार्टर था।

चूंकि मैं MySQL डेटाबेस को बाह्य रूप से (SSH टनलिंग के माध्यम से सीक्वल प्रो) एक्सेस करना चाहता हूं, मैं 33306होस्ट मशीन पर पोर्ट का उपयोग करने जा रहा हूं । (नहीं 3306, बस के मामले में एक बाहरी MySQL उदाहरण चल रहा है।)

लगभग एक घंटे के ट्विस्टिंग के आईपबल्स भले ही बेकार साबित हुए:

कदम से कदम, यहाँ मैंने क्या किया है:

mkdir db-expose-33306
cd db-expose-33306
vim Dockerfile

dockerfileइसे अंदर रखकर संपादित करें :

# Exposes port 3306 on linked "db" container, to be accessible at host:33306
FROM ubuntu:latest # (Recommended to use the same base as the DB container)

RUN apt-get update && \
    apt-get -y install socat && \
    apt-get clean

USER nobody
EXPOSE 33306

CMD socat -dddd TCP-LISTEN:33306,reuseaddr,fork TCP:db:3306

फिर चित्र बनाएँ:

docker build -t your-namespace/db-expose-33306 .

फिर इसे चलाएं, अपने चल रहे कंटेनर से लिंक करें। ( स्पष्ट रूप से रोका और हटाए जाने तक पृष्ठभूमि में रखने के -dबजाय इसका उपयोग करें -rm। मैं केवल यह चाहता हूं कि इसे इस समय अस्थायी रूप से चलाया जाए।)

docker run -it --rm --name=db-33306 --link the_live_db_container:db -p 33306:33306  your-namespace/db-expose-33306

आप क्रिया / सामाजिक या अल्पाइन / सामाजिक छवि का उपयोग कर सकते हैं। देखें क्रिया /
समाज

7

स्वीकृत उत्तर iptables समाधान में जोड़ने के लिए , मुझे इसे बाहरी दुनिया में खोलने के लिए होस्ट पर दो और कमांड चलाने होंगे।

HOST> iptables -t nat -A DOCKER -p tcp --dport 443 -j DNAT --to-destination 172.17.0.2:443
HOST> iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source 172.17.0.2 --destination 172.17.0.2 --dport https
HOST> iptables -A DOCKER -j ACCEPT -p tcp --destination 172.17.0.2 --dport https

नोट: मैं पोर्ट https (443) खोल रहा था, मेरा डॉकटर आंतरिक आईपी था 172.17.0.2

नोट 2: ये नियम और अस्थायी रूप से और केवल तब तक चलेगा जब तक कि कंटेनर पुनः चालू नहीं हो जाता


यह मेरे लिए काम कर रहा था ... हालांकि बाद में कुछ कैवेट थे। नोट 2 के अनुसार, यह बंद हो जाएगा यदि कंटेनरों को फिर से शुरू किया जाता है, तो यह एक अलग आईपी पर हो सकता है। लेकिन अधिक महत्वपूर्ण रूप से docker को इस iptable प्रविष्टियों के बारे में कोई जानकारी नहीं है, इसलिए जब आप बाद में पूरी तरह से सेवा को पुनः आरंभ करते हैं और इसे ठीक से करने के लिए docker प्राप्त करते हैं, तो उन्हें हटाया नहीं जाएगा। परिणाम कई iptable प्रविष्टियाँ थीं जो बिल्कुल एक जैसी थीं, जिसके कारण यह बिना किसी त्रुटि या संकेत के कारण थोड़ा विफल हो गया। एक बार जब अतिरिक्त नियमों का फैसला किया गया, तो समस्या समाप्त हो गई। अन्य पासवर्डों में, किसी भी परिवर्तन के बाद अपने IP तालिकाओं को बहुत ध्यान से देखें।
एंथनी

5

आप एसएसएच का उपयोग सुरंग बनाने और अपने मेजबान में अपने कंटेनर को उजागर करने के लिए कर सकते हैं।

आप इसे कंटेनर से होस्ट तक और होस्ट से कंटेनर तक दोनों तरह से कर सकते हैं। लेकिन आपको SSH टूल की आवश्यकता है जैसे OpenSSH दोनों में (एक में क्लाइंट और दूसरे में सर्वर)।

उदाहरण के लिए, कंटेनर में, आप कर सकते हैं

$ yum install -y openssh openssh-server.x86_64
service sshd restart
Stopping sshd:                                             [FAILED]
Generating SSH2 RSA host key:                              [  OK  ]
Generating SSH1 RSA host key:                              [  OK  ]
Generating SSH2 DSA host key:                              [  OK  ]
Starting sshd:                                             [  OK  ]
$ passwd # You need to set a root password..

आप इस लाइन से (कंटेनर में) कंटेनर आईपी पता पा सकते हैं:

$ ifconfig eth0 | grep "inet addr" | sed 's/^[^:]*:\([^ ]*\).*/\1/g'
172.17.0.2

तब मेजबान में, आप बस कर सकते हैं:

sudo ssh -NfL 80:0.0.0.0:80 root@172.17.0.2

यह मेरे लिए काम करता है, एक छोटे सुधार के साथ ... इस कमांड ने काम किया: sudo ssh -NfL 25252: 172.17.0.50: 22 $ USER @ localhost
अलेक्जेंडर गुओ

3

यदि कोई उत्तर किसी के लिए काम नहीं कर रहा है, तो जांच लें कि क्या आपका लक्ष्य कंटेनर पहले से ही डॉक नेटवर्क में चल रहा है:

CONTAINER=my-target-container
docker inspect $CONTAINER | grep NetworkMode
        "NetworkMode": "my-network-name",

इसे बाद में चर में सहेजें $NET_NAME:

NET_NAME=$(docker inspect --format '{{.HostConfig.NetworkMode}}' $CONTAINER)

यदि हाँ, तो आपको उसी नेटवर्क में प्रॉक्सी कंटेनर चलाना चाहिए।

अगला कंटेनर के लिए उपनाम देखें:

docker inspect $CONTAINER | grep -A2 Aliases
                "Aliases": [
                    "my-alias",
                    "23ea4ea42e34a"

इसे बाद में चर में सहेजें $ALIAS:

ALIAS=$(docker inspect --format '{{index .NetworkSettings.Networks "'$NET_NAME'" "Aliases" 0}}' $CONTAINER)

अब socatएक कंटेनर में नेटवर्क में चलाने के $NET_NAMEलिए $ALIASएड कंटेनर के संपर्क में आए (लेकिन प्रकाशित नहीं) पोर्ट:

docker run \
    --detach --name my-new-proxy \
    --net $NET_NAME \
    --publish 8080:1234 \
    alpine/socat TCP-LISTEN:1234,fork TCP-CONNECT:$ALIAS:80

2

आप बुन नेट की तरह एक ओवरले नेटवर्क का उपयोग कर सकते हैं , जो प्रत्येक कंटेनर को एक अद्वितीय आईपी पता प्रदान करेगा और नेटवर्क के प्रत्येक कंटेनर हिस्से को सभी बंदरगाहों को स्पष्ट रूप से उजागर करेगा।

बुनाई मेजबान नेटवर्क एकीकरण भी प्रदान करता है । यह डिफ़ॉल्ट रूप से अक्षम है, लेकिन, यदि आप भी होस्ट से कंटेनर आईपी पते (और इसके सभी बंदरगाहों) का उपयोग करना चाहते हैं, तो आप बस चला सकते हैं weave expose

पूर्ण प्रकटीकरण: मैं बुनकरों पर काम करता हूं।


2

एक आसान HAProxy आवरण है।

docker run -it -p LOCALPORT:PROXYPORT --rm --link TARGET_CONTAINER:EZNAME -e "BACKEND_HOST=EZNAME" -e "BACKEND_PORT=PROXYPORT" demandbase/docker-tcp-proxy

यह लक्ष्य कंटेनर में एक HAProxy बनाता है। बहुत आसान।


2

यहां कुछ उपाय दिए गए हैं:

https://forums.docker.com/t/how-to-expose-port-on-running-container/3252/12

कंटेनर को चलाते समय मैपिंग पोर्ट का समाधान।

docker run -d --net = मेजबान myvnc

वह आपके मेजबान को पोर्ट को स्वचालित रूप से उजागर और मैप करेगा


1

पहले रिकार्डो की प्रतिक्रिया पढ़ें । इसने मेरे लिए काम किया।

हालाँकि, एक ऐसा परिदृश्य मौजूद है जहाँ यह काम नहीं करेगा यदि रनिंग कंटेनर को डॉकटर-कंपोज़ का उपयोग करके बंद कर दिया गया था। ऐसा इसलिए है क्योंकि docker- रचना (I do 1.17 चल रहा है) एक नया नेटवर्क बनाता है। इस परिदृश्य को संबोधित करने का तरीका होगा

docker network ls

फिर निम्नलिखित को संलग्न करें docker run -d --name sqlplus --link db:db -p 1521:1521 sqlplus --net network_name


0

पोर्ट पोर्ट मैपिंग करना संभव नहीं है, लेकिन ऐसे कई तरीके हैं जिनसे आप डॉकटर कंटेनर दे सकते हैं कि वर्चुअल मशीन जैसी वास्तविक इंटरफ़ेस में कितनी मात्रा होगी।

मैकवलन इंटरफेस

Docker में अब Macvlan नेटवर्क ड्राइवर शामिल है । यह एक डॉकटर नेटवर्क को "वास्तविक दुनिया" इंटरफ़ेस से जोड़ता है और आपको उस नेटवर्क को सीधे कंटेनर में भेजने की अनुमति देता है (जैसे वर्चुअल मशीन ब्रिज मोड)।

docker network create \
    -d macvlan \
    --subnet=172.16.86.0/24 \
    --gateway=172.16.86.1  \
    -o parent=eth0 pub_net

pipeworkडॉकटर के पुराने संस्करणों में एक कंटेनर में एक वास्तविक इंटरफ़ेस मैप कर सकते हैं या एक उप इंटरफ़ेस सेट कर सकते हैं ।

आईपी ​​के रूटिंग

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

फिर आप उस नेटवर्क को कंटेनर में असाइन करते हैं और डॉक नेटवर्क के माध्यम से पैकेट को रूट करने के लिए अपने डॉकर होस्ट को सेटअप करते हैं।

होस्ट इंटरफ़ेस साझा किया गया

--net hostविकल्प मेजबान इंटरफ़ेस एक कंटेनर में साझा करने के लिए अनुमति देता है, लेकिन यह शायद साझा प्रकृति के कारण एक मेजबान पर कई कंटेनर चलाने के लिए एक अच्छा सेटअप नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.