डॉक्स बंदरगाहों को वीहोस्टेस सौंपना


83

मेरे पास एक वाइल्डकार्ड डीएनएस सेट है ताकि डॉक होस्ट के आईपी पते पर एक कस्टम डोमेन (* .foo) मैप के सभी वेब अनुरोध। यदि मेरे पास कई कंटेनर हैं जो अपाचे (या निगनेक्स) उदाहरण से चल रहे हैं, तो प्रत्येक कंटेनर अपाचे पोर्ट (80) को कुछ बाहरी इनबाउंड पोर्ट पर मैप करता है।

मैं क्या करना चाहूंगा, कन्टेनर-1 के लिए एक निवेदन करना चाहता हूं। यदि मेरे कस्टम DNS सर्वर के माध्यम से पहले से ही सही आईपी एड्रेस (डॉकर होस्ट का) के लिए मैप किया जाता है, लेकिन सही डॉक बाहरी के लिए डिफ़ॉल्ट पोर्ट 80 के अनुरोध को प्रॉक्सी करता है पोर्ट ऐसे निर्दिष्ट कंटेनर से सही अपाचे उदाहरण कस्टम डोमेन के आधार पर प्रतिक्रिया करने में सक्षम है। इसी तरह, कंटेनर-2.foo एक दूसरे कंटेनर के अपाचे को प्रॉक्सी करेगा, और इसी तरह।

क्या इसके लिए कोई पूर्व-निर्मित समाधान है, डॉकर होस्ट पर नग्नेक्स प्रॉक्सी को चलाने के लिए मेरा सबसे अच्छा दांव है, या मुझे एक नोड लिखना चाहिए। डॉक्स कंटेनर (स्टार्ट / स्टॉप / री-यूल्ड) वेब के माध्यम से प्रबंधित करने की क्षमता के साथ प्रॉक्सी। ), या ...? मेरे पास क्या विकल्प हैं जो डोकर कंटेनरों को प्राकृतिक घटना की तरह उपयोग कर रहे हैं और बाहरी बंदरगाहों और कंटेनर के साथ कुछ नहीं कर रहे हैं?


मेरे पास यह प्रश्न भी है - जहां तक ​​मैं बता सकता हूं, प्रत्येक एप्लिकेशन को एक डॉकटर कंटेनर में चला रहा है और फिर एक nginx सर्वर का उपयोग करके मेजबान पर राउटिंग कर रहा है (शायद यह खुद का कंटेनर है) इसे करने का तरीका है। मैं सोच रहा हूं कि क्या मुझे ऐप सर्वर स्टैंडअलोन (यानी एक php-fpm, puma, आदि सर्वर को चलाना चाहिए) या एक व्यर्थ (?) Nginx उदाहरण को भी शामिल करना चाहिए।
रॉस

पर एक नजर डालें github.com/dotcloud/hipache , जो redis के माध्यम से एक रिवर्स-प्रॉक्सी विन्यास योग्य है।
ZeissS

जवाबों:


81

यह उत्तर थोड़ा देर से हो सकता है, लेकिन आपको जो चाहिए वह एक स्वचालित रिवर्स प्रॉक्सी है। मैंने उसके लिए दो समाधानों का उपयोग किया है:

  • jwilder / nginx-प्रॉक्सी
  • Traefik

समय के साथ, मेरी प्राथमिकता ट्राफिक का उपयोग करना है। ज्यादातर क्योंकि यह अच्छी तरह से प्रलेखित और बनाए रखा गया है, और अधिक सुविधाओं (विभिन्न रणनीतियों और प्राथमिकताओं के साथ संतुलन, स्वास्थ्यवर्धक, सर्किट ब्रेकर, एसीएमई / लेट्स एनक्रिप्ट, ... के साथ स्वचालित एसएसएल प्रमाणपत्र लोड करता है) के साथ आता है।


Jwilder / nginx- प्रॉक्सी का उपयोग करना

डॉकटर कंटेनर चलाते समय जेसन वाइल्डर की नग्नेक्स-प्रॉक्सी डॉकर छवि को , आपको अपने अन्य कंटेनरों के लिए रिवर्स प्रॉक्सी के रूप में सेट किया गया एक nginx सर्वर मिलता है जिसमें कोई विन्यास नहीं है।

बस अपने अन्य कंटेनरों को चलाएं VIRTUAL_HOST पर्यावरण के चर के और nginx -xy उनके आईपी की खोज करेगा: पोर्ट और आपके लिए nginx कॉन्फ़िगरेशन को अपडेट करेगा।

मान लें कि आपका DNS सेट अप किया गया है, ताकि *.test.localआपके डॉकर होस्ट के आईपी पते पर मैप करें, फिर त्वरित डेमो चलाने के लिए बस निम्नलिखित कंटेनर शुरू करें:

# start the reverse proxy
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

# start a first container for http://tutum.test.local
docker run -d -e "VIRTUAL_HOST=tutum.test.local" tutum/hello-world

# start a second container for http://deis.test.local
docker run -d -e "VIRTUAL_HOST=deis.test.local" deis/helloworld

ट्राफिक का उपयोग करना

जब एक चल Traefik कंटेनर, तो आप एक रिवर्स प्रॉक्सी सर्वर की स्थापना की है जो अपने अग्रेषण नियम को पुन: कॉन्फ़िगर जाएगा दिया मिलता है डोकर लेबल अपने कंटेनर पर पाया।

मान लें कि आपका DNS सेट अप किया गया है, ताकि *.test.localआपके डॉकर होस्ट के आईपी पते पर मैप करें, फिर त्वरित डेमो चलाने के लिए बस निम्नलिखित कंटेनर शुरू करें:

# start the reverse proxy
docker run --rm -it -p 80:80 -v /var/run/docker.sock:/var/run/docker.sock traefik:1.7 --docker

# start a first container for http://tutum.test.local
docker run -d -l "traefik.frontend.rule=Host:tutum.test.local" tutum/hello-world

# start a second container for http://deis.test.local
docker run -d -l "traefik.frontend.rule=Host:deis.test.local" deis/helloworld

-v /var/run/docker.sock:/tmp/docker.sockक्या यह खतरनाक समाधान है? इस nginx प्रॉक्सी को कंटेनर होस्ट डेमॉन तक पहुंच प्राप्त है? क्या यह संभव सुरक्षा छेद हो सकता है?
मिकेल

संभवतः। यह भी ध्यान दें कि साझा नहीं करना /var/run/docker.sockया तो एक वारंटी नहीं है कि कंटेनर से डॉकटर होस्ट का शोषण नहीं किया जा सकता है। डॉकर सुरक्षा अपने आप में एक विषय है।
थॉमसलेविल

क्या कोई ज्ञात सुरक्षा समस्या है? जब आप डॉकटर को कंटेनर से होस्ट कर सकते हैं।
मिकल

अतीत में एक शोषण मौजूद था और यह मुद्दा अब तय हो गया है लेकिन भविष्य में नए कारनामे सामने आ सकते हैं। डॉकर सुरक्षा जोड़ने के बारे में नहीं है, यह तैनाती में आसानी के बारे में है
थॉमसलेविल

5
आप नेगनेक्स-प्रॉक्सी और डॉकटर-जीन को अलग-अलग भी चला सकते हैं, ताकि डॉक सॉकेट नगनेक्स कंटेनर पर न चढ़े।
जेसन वाइल्डर

42

(1) सेटअप बंदरगाहों सीधे डोकर साथ vhosts, या (2) का उपयोग करें और प्रॉक्सी के Nginx / अपाचे का उपयोग करें: यहाँ दो संभव जवाब हैं Dokku आप के लिए बंदरगाहों और vhosts प्रबंधन करने के लिए (जो मैं कैसे विधि 1 करने के लिए सीखा)।

विधि 1a (सीधे docker के साथ पोर्ट असाइन करें)

चरण 1: वांछित पोर्ट नंबर असाइनमेंट के साथ होस्ट पर nginx.conf या Apache सेटअप करें। होस्ट पर चल रहा यह वेब सर्वर, vhost proxying करेगा। डॉकर के संबंध में इसके बारे में कुछ विशेष नहीं है - यह सामान्य vhost होस्टिंग है। अगला भाग आता है, स्टेप 2 में, डॉकर को सही होस्ट पोर्ट नंबर का उपयोग करने के लिए।

चरण 2: डॉकर के पोर्ट मैपिंग सेट करने के लिए "-पी" के साथ डॉकर में फोर्स पोर्ट नंबर असाइनमेंट, और "-ई" डॉकर के भीतर कस्टम पर्यावरण चर सेट करने के लिए, निम्नानुसार है:

port=12345 # <-- the vhost port setting used in nginx/apache
IMAGE=myapps/container-1
id=$(docker run -d -p :$port -e PORT=$port $IMAGE)
# -p :$port will establish a mapping of 12345->12345 from outside docker to
# inside of docker.
# Then, the application must observe the PORT environment variable
# to launch itself on that port; This is set by -e PORT=$port.

# Additional goodies:
echo $id # <-- the running id of your container
echo $id > /app/files/CONTAINER # <-- remember Docker id for this instance
docker ps # <-- check that the app is running
docker logs $id # <-- look at the output of the running instance
docker kill $id # <-- to kill the app

विधि 1 बी हार्ड-कोडित एप्लिकेशन पोर्ट

... यदि आप अनुप्रयोग हार्डकॉस्ट पोर्ट का उपयोग करते हैं, उदाहरण के लिए पोर्ट 5000 (अर्थात PORT पर्यावरण चर के माध्यम से कॉन्फ़िगर नहीं किया जा सकता है, जैसा कि विधि 1a में है), तो इसे इस तरह डॉकर के माध्यम से हार्डकोड किया जा सकता है:

publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
# -p $publicPort:5000 will map port 12345 outside of Docker to port 5000 inside
# of Docker. Therefore, nginx/apache must be configured to vhost proxy to 12345,
# and the application within Docker must be listening on 5000.

विधि 2 (Dokku बंदरगाहों का पता लगाने दें)

फिलहाल, डोकर vhosts के प्रबंधन के लिए एक बहुत अच्छा विकल्प है Dokku । एक आगामी विकल्प फ्लिन का उपयोग करना हो सकता है , लेकिन अभी के रूप में फ्लिन अभी शुरू हो रहा है और काफी तैयार नहीं है। इसलिए हम अभी के लिए Dokku के साथ चलते हैं: Dokku स्थापित निर्देशों का पालन करने के बाद, एक ही डोमेन के लिए, "VHOST" फ़ाइल बनाकर vhosts को सक्षम करें:

echo yourdomain.com > /home/git/VHOST
# in your case: echo foo > /home/git/VHOST

अब, जब कोई ऐप SSH के माध्यम से Dokku (यह करने के लिए Dokku डॉक्स देखें) के माध्यम से धकेल दिया जाता है, तो Dokku VHOST फ़ाइल को देखेगा और विशेष एप्लिकेशन के लिए धकेल दिया जाएगा (मान लें कि आपने "कंटेनर -1" धक्का दिया), यह उत्पन्न करेगा निम्न फ़ाइल:

/home/git/container-1/nginx.conf

और इसमें निम्नलिखित सामग्री होगी:

upstream container-1 { server 127.0.0.1:49162; }
server {
  listen      80;
  server_name container-1.yourdomain.com;
  location    / {
    proxy_pass  http://container-1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

जब सर्वर को रिबूट किया जाता है, तो डोकू यह सुनिश्चित करेगा कि डॉकर अपने आरंभिक रूप से तैनात पोर्ट (49162) में मैप किए गए पोर्ट के साथ एप्लिकेशन शुरू करता है, बजाय यादृच्छिक रूप से दूसरे पोर्ट को असाइन किए। इस नियतात्मक असाइनमेंट को प्राप्त करने के लिए, Dokku शुरू में असाइन किए गए पोर्ट को सहेजता है /home/git/container-1/PORTऔर अगले लॉन्च पर यह PORTपर्यावरण को इस मूल्य पर सेट करता है, और होस्ट-साइड और ऐप-साइड दोनों पर इस पोर्ट होने के लिए डॉकर के पोर्ट असाइनमेंट को मैप करता है। यह पहले लॉन्च के विरोध में है, जब डॉक्यू सेट करेगाPORT=5000 और फिर वीपीएस की तरफ जो भी रैंडम पोर्ट डोकु मैप्स होंगे, उन्हें ऐप साइड में 5000 तक कर देगा। यह दौर है (और भविष्य में भी बदल सकता है), लेकिन यह काम करता है!

वीएचएसटी, हुड के तहत काम करता है, यह है: एसएसएच के माध्यम से ऐप का एक जोरदार धक्का करने पर, डोकू उन हुक को निष्पादित करेगा जो अंदर रहते हैं /var/lib/dokku/plugins/nginx-vhosts। ये हुक भी यहां डॉक्यू सोर्स कोड में स्थित हैं और nginx.confसही vhost सेटिंग्स के साथ फाइल लिखने के लिए जिम्मेदार हैं। यदि आपके पास यह निर्देशिका नहीं है /var/lib/dokku, तो चलाने का प्रयास करें dokku plugins-install


3

डॉकटर के साथ, आप चाहते हैं कि आंतरिक ips सामान्य रहें (उदाहरण के लिए 80) और यह पता लगाएं कि यादृच्छिक पोर्ट्स को कैसे वायर किया जाए।

उन्हें संभालने का एक तरीका, हिपा जैसे रिवर्स प्रॉक्सी के साथ है। इस पर अपने बिंदुओं को इंगित करें, और फिर आप प्रॉक्सी को फिर से कॉन्फ़िगर कर सकते हैं क्योंकि आपके कंटेनर ऊपर और नीचे आते हैं। Http://txt.fliglio.com/2013/09/protyping-web-stuff-with-docker/ पर एक नज़र डालें कि यह कैसे काम कर सकता है।

यदि आप कुछ अधिक मजबूत देख रहे हैं, तो आप "सेवा खोज" पर एक नज़र डालना चाहते हैं। (docker के साथ सेवा खोज पर एक नज़र: http://txt.fliglio.com/2013/12/service-discovery-with-docker-docker-links-and-beyond/ )

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