क्या उपयोगकर्ताओं के लिए वेब साइटों को अलग करने के लिए डॉकर का उपयोग करना संभव है?


12

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

जो मैं समझता हूं, आप उनके बंदरगाहों के माध्यम से डॉकर उदाहरण को उजागर कर सकते हैं, इसलिए यदि आप एक ही सर्वर पर दो डॉक उदाहरणों को चलाते हैं, तो आपको दो अलग-अलग बंदरगाहों को उजागर करना होगा।

लेकिन क्या बंदरगाहों को निर्यात करना संभव है, लेकिन सर्वर नाम, जैसे:

  • www.somewebsite.com: डॉकर उदाहरण 1
  • www.otherwebsite.com: डॉकर उदाहरण 2
  • www.etc.com: डॉकर उदाहरण ...

और वह, उसी सर्वर में।

मैंने सर्वर पर केवल अपाचे को स्थापित करने के बारे में सोचा, जो कि सर्वर के नाम के आधार पर समर्पित डॉकर उदाहरण के लिए अनुरोध को पुनर्निर्देशित करेगा, लेकिन फिर मुझे किसी भी डॉकर इंस्टेंसेस पर Apache (फिर!) औरMySQL को स्थापित करना होगा।

क्या यह संभव है और इसके अलावा, क्या यह प्रदर्शन की अवधि में दिलचस्प है (या बिल्कुल नहीं)?

आपके सहयोग के लिए धन्यवाद।


1
सैद्धांतिक रूप से यह संभव है, Apache पोर्ट की ओर एक ProxyPass करेगा जो प्रत्येक डॉकर का उदाहरण सुन रहा है।
थानिसिस्क

जवाबों:


12

हाँ यह संभव है। आपको जो करने की आवश्यकता है वह कई 80 पोर्ट प्रदान कर रहा है। प्रत्येक URL के लिए एक। आप इसका उपयोग कर सकते हैं, उदाहरण के लिए वर्चुअल होस्ट ऑफ अपाचे जो डॉकर होस्ट सर्वर पर चल रहा है।

  1. DNS CNAME सेट करें।
  2. Docker इंस्टेंसेस को रन करें और अपने पोर्ट 80 को पोर्ट करें, कहते हैं, 12345 ~ 12347 docker होस्ट के।
  3. Docker होस्ट पर Apache सर्वर चलाएं और प्रत्येक URL के लिए एक वर्चुअल होस्ट सेट करें और ProxyPass और ProxyPassReverse को localhost: 12345 पर सेट करें, जो आपके docker इंस्टेंस में से एक है।

अपाचे कॉन्फिग फाइल इस तरह दिखाई देगी:

<VirtualHost *:80>
ServerName www.somewebsite.com
  <Proxy *>
    Allow from localhost
  </Proxy>
  ProxyPass        / http://local.hostname.ofDockerHost:12345/
  ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>

4
धन्यवाद! इससे काफी मदद मिली। इसके अलावा, वहाँ है ProxyPreserveHost On, इसलिए आप local.hostname.ofDockerHost के बहुत सारे लिंक के साथ समाप्त नहीं होते हैं: 12345 अपनी वेब साइट पर जोर देते हैं । यहाँ अधिक जानकारी है जो मेरे लिए उपयोगी थी: digitalocean.com/community/tutorials/…
सेबेस्टियन

क्या डेटाबेस में परिवर्तन आदि को बचाएंगे?
एमिनेज़आर्टस

3

हो सकता है। आप मुख्य कंटेनर में अपाचे (या बेहतर अभी तक, हैप्रोक्सी, नेग्नेक्स या वार्निश का उपयोग कर सकते हैं, जो मुख्य सर्वर में बस उस पुनर्निर्देशन कार्य के लिए अपाचे से अधिक कुशल हो सकता है), प्रत्येक कंटेनर के अपाचे बंदरगाहों पर पुनर्निर्देशित करने के लिए।

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


आपके उत्तर के लिए धन्यवाद। दरअसल, "होस्टिंग" सेवा मैं प्रदान करेगा जिसमें Prestashop, Wordpress, आदि जैसी चीजें शामिल हैं, इसलिए, PHP और भारी इंजन पर बहुत कुछ आधारित है (मैं यहां Prestashop के बारे में अधिक बात कर रहा हूं)।
सिरिल एन।

1
क्या Dockerized virtual hosting system PHP को अपने Docker कंटेनर (s) में अलग करके बेहतर modularized होगा और Apache container (ओं) को PHP प्रोसेसिंग के लिए उस कंटेनर का उपयोग करेगा? क्या डेटाबेस के लिए भी यही लागू होगा? उदा। अपाचे कंटेनरों (जिसमें उपयोगकर्ता वेबसाइटें हैं) में प्रॉक्सी ट्रैफ़िक होस्ट किया गया है, जो बदले में सभी PHP प्रोसेसिंग को एक PHP कंटेनर में भेजता है और डेटाबेस MySQL कंटेनर को पढ़ता / लिखता है? या PHP इस तरह से किसी भी कम संसाधन-भूखा होगा? क्या PHP-FPM, SuPHP या इसी तरह का एक गैर-डॉकर वातावरण में एक ही तरह का सेटअप प्रदान करेगा?
ओज्रस्क

: एक कंटेनर में पीएचपी-एफ पी एम कम से कम एक सा अनावश्यक filespace के लिहाज से होगा code.google.com/p/sna/wiki/NginxWithPHPFPM The Apache / Nginx स्थापना के क्रम में पीएचपी-एफ पी एम कंटेनर के लिए खत्म हो पीएचपी फ़ाइलों की प्रतिलिपि बनाने की जरूरत इस प्रणाली के लिए काम करने के लिए। क्या एक साझा साझा डेटा कंटेनर इस समस्या को हल करेगा?
ojrask

यदि आपको कंटेनरों के बीच डेटा (यानी php फ़ाइलें) साझा करने की आवश्यकता है, तो वॉल्यूम जाने का तरीका है, आप उन्हें अन्य कंटेनरों से माउंट कर सकते हैं (यहां तक ​​कि डेटा समर्पित हैं) या वास्तविक फाइलसिस्टम। Apache मॉड्यूल php कोड को चलाने के लिए सबसे तेज़ तरीका होता था, जिसमें केवल php के लिए एक होता है, स्थिर फ़ाइलों के लिए नहीं और स्थिर / cacheable सामग्री (Ie वार्निश) देने के लिए एक ऊपरी परत होती है जो एक अच्छा कॉम्बो हो सकता है।
gmuslera 14

3

मुझे पता है कि यह पहले ही उत्तर दिया जा चुका है लेकिन मैं इसे एक कदम आगे ले जाना चाहता हूं और आपको एक उदाहरण दिखाता हूं कि यह कैसे किया जा सकता है, ताकि अधिक संपूर्ण उत्तर प्रदान किया जा सके।

कृपया इसका उपयोग करने के निर्देशों के साथ यहां मेरी डॉक छवि देखें, यह आपको दिखाएगा कि कैसे दो साइटों को कॉन्फ़िगर किया जाए https://hub.docker.com/r/vect0r/httpd-proxy/

जैसा कि jihun ने कहा कि आपको यह सुनिश्चित करना होगा कि आपके पास अपना vhost कॉन्फ़िगरेशन सेट है। मेरा उदाहरण परीक्षण साइट example.com और 81 को परीक्षण साइट example2.com प्रदर्शित करने के लिए पोर्ट 80 का उपयोग करता है। यह भी नोट करना महत्वपूर्ण है कि आपको अपनी सामग्री को निर्दिष्ट करने की आवश्यकता होगी और अपने डॉकफेराइल में आवश्यक बंदरगाहों को उजागर करना होगा, जैसे;

FROM centos:latest
Maintainer vect0r
LABEL Vendor="CentOS"

RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all

EXPOSE 80 81

#Simple startup script to aviod some issues observed with container restart
ADD run-httpd.sh /run-httpd.sh
RUN chmod -v +x /run-httpd.sh

#Copy config file across
COPY ./httpd.conf /etc/httpd/conf/httpd.conf
COPY ./example.com /var/www/example.com
COPY ./example2.com /var/www/example2.com
COPY ./sites-available /etc/httpd/sites-available
COPY ./sites-enabled /etc/httpd/sites-enabled

CMD ["/run-httpd.sh"]

आशा है कि इससे प्रक्रिया को थोड़ा और समझाने में मदद मिलेगी। कृपया बेझिझक मुझसे इस पर कोई और सवाल पूछें, मदद करने के लिए खुश।

सादर,

वी


मैंने जीथब पर इस छवि को बनाने के लिए उपयोग की गई फ़ाइलों को भी अपलोड किया है; github.com/V3ckt0r/docker-httpd-proxy
Vect0r

1

मेरे मामले में मुझे SSLProxyEngine On , ProxyPreserveHost On और RequestHeader को अपने Apache 2.4 vhost फ़ाइल में "On" पर सेट करने की आवश्यकता थी , क्योंकि मैं SSL को docker कंटेनर पर सक्षम करना चाहता था। Local.hostname.ofDockerHost के बारे में , मेरे मामले में डॉक कंटेनर चलाने वाले होस्ट सर्वर का नाम लुकास था , और डॉक कंटेनर के पोर्ट 443 में मैप किया गया 1443 था (क्योंकि पोर्ट 443 पहले से ही मेजबान में अपाचे द्वारा उपयोग में था। सर्वर), ताकि लाइन इस तरह समाप्त हो गई https: // lucas: 1443 /

यह अंतिम सेटअप है, और यह ठीक काम कर रहा है!

<VirtualHost *:443> # Change to *:80 if no https required
    ServerName www.somewebsite.com
    <Proxy *>
        Allow from localhost
    </Proxy>
    SSLProxyEngine On # Comment this out if no https required
    RequestHeader set Front-End-Https "On" # Comment this out if no https required
    ProxyPreserveHost    On
    ProxyPass        / http://local.hostname.ofDockerHost:12345/
    ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>

अंत में, डॉकटर कंटेनर में मुझे प्रॉक्सी एसएसएल हेडर सेटअप करना पड़ा। मेरे मामले में, कंटेनर नेगीक्स चला रहा था और रूबी एप्स को स्थापित करने के लिए ऑम्निबस नामक कुछ । मुझे लगता है कि यह एक nginx config फाइल में भी सेटअप किया जा सकता है। इसे लिखेंगे जैसा कि किसी को यह मददगार लगता है

nginx['redirect_http_to_https'] = true
nginx['proxy_set_headers'] = {
    "Host" => "$http_host",
    "X-Real-IP" => "$remote_addr",
    "X-Forwarded-For" => "$proxy_add_x_forwarded_for",
    "X-Forwarded-Proto" => "https",
    "X-Forwarded-Ssl" => "on"
}
nginx['real_ip_trusted_addresses'] = ['10.0.0.77'] # IP for lucas host
nginx['real_ip_header'] = 'X-Real-IP'
nginx['real_ip_recursive'] = 'on'

अपाचे के लिए पूरा गाइड, आईएसपी कॉन्फ़िग, Ubuntu सर्वर 16.04 यहाँ https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

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