Nginx को अपस्ट्रीम प्रॉक्सी के रूप में उपयोग करने के लिए Docker पोर्ट मैपिंग को कैसे कॉन्फ़िगर करें?


86

अपडेट II

यह अब 16 जुलाई, 2015 है और चीजें फिर से बदल गई हैं। मैंने इस ऑटोमैटिक कंटेनर को जेसन वाइल्डर से खोजा है : https://github.com/jwilder/nginx-proxyऔर यह इस समस्या को हल करता है जब तक यह docker runकंटेनर में ले जाता है । अब इस समस्या का समाधान करने के लिए मैं इसका उपयोग कर रहा हूं।

अपडेट करें

यह अब 2015 का जुलाई है और नेटवर्किंग डॉकटर कंटेनरों के संबंध में चीजें काफी बदल गई हैं। अब कई अलग-अलग प्रसाद हैं जो इस समस्या को हल करते हैं (विभिन्न तरीकों से)।

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

इसके अतिरिक्त, आप शायद डॉकर्स के नवजात network, हैशिकॉर्प consul, वीवर्सवर्क्स weave, जेफ लिंडसे progrium/consulऔरgliderlabs/registrator , और Google की भी जांच करना चाहेंगे Kubernetes

वहाँ भी है CoreOS प्रसाद है कि का उपयोग etcd, fleetऔर flannel

और अगर आप वास्तव में एक पार्टी करना चाहते हैं, तो आप चलाने के लिए Mesosphere, या Deis, एक क्लस्टर को स्पिन कर सकते हैं Flynn

यदि आप नेटवर्किंग (मेरे जैसे) के लिए नए हैं, तो आपको अपने पढ़ने के चश्मे से बाहर निकलना चाहिए, वाई-हाय-फाई पर पॉप "द स्काई विद स्टार्स - द बेस्ट ऑफ़ एन्या" , और एक बियर को फोड़ना चाहिए - यह होने जा रहा है इससे पहले कि आप वास्तव में वास्तव में समझें कि यह आप क्या करने की कोशिश कर रहे हैं। सुझाव: आप Service Discovery Layerअपने में एक को लागू करने की कोशिश कर रहे हैं Cluster Control Plane। शनिवार की रात बिताना बहुत अच्छा तरीका है।

यह बहुत मज़ेदार है, लेकिन काश मैं सही समय से पहले डाइविंग करने से पहले अपने आप को सामान्य रूप से नेटवर्किंग के बारे में बेहतर ढंग से शिक्षित करने का समय लेता। मुझे आखिरकार दयनीय डिजिटल ओशन ट्यूटोरियल देवताओं से एक युगल पोस्ट मिला: Introduction to Networking Terminologyऔर Understanding ... Networking। मेरा सुझाव है कि डाइविंग से पहले कुछ समय पहले पढ़ना।

मज़े करो!



मूल पोस्ट

मैं Dockerकंटेनर के लिए पोर्ट मैपिंग को समझ नहीं सकता । विशेष रूप से कैसे एक ही सर्वर पर, दूसरे पोर्ट पर सुनने के लिए, नग्नेक्स से दूसरे कंटेनर में अनुरोध पारित करना है।

मुझे एक नगीनेक्स कंटेनर के लिए डॉकरीफाइल मिला है जैसे:

FROM ubuntu:14.04
MAINTAINER Me <me@myapp.com>

RUN apt-get update && apt-get install -y htop git nginx

ADD sites-enabled/api.myapp.com /etc/nginx/sites-enabled/api.myapp.com
ADD sites-enabled/app.myapp.com /etc/nginx/sites-enabled/app.myapp.com
ADD nginx.conf /etc/nginx/nginx.conf

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80 443

CMD ["service", "nginx", "start"]



और फिर api.myapp.comविन्यास फाइल ऐसा दिखता है:

upstream api_upstream{

    server 0.0.0.0:3333;

}


server {

    listen 80;
    server_name api.myapp.com;
    return 301 https://api.myapp.com/$request_uri;

}


server {

    listen 443;
    server_name api.mypp.com;

    location / {

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_pass http://api_upstream;

    }

}

और फिर दूसरे के लिए app.myapp.comभी।

और फिर मैं चला:

sudo docker run -p 80:80 -p 443:443 -d --name Nginx myusername/nginx


और यह सब ठीक है, लेकिन अनुरोधों को अन्य कंटेनरों / बंदरगाहों तक पारित नहीं किया जा रहा है। और जब मैं Nginx कंटेनर में ssh और लॉग का निरीक्षण करता हूं तो मुझे कोई त्रुटि नहीं दिखाई देती है।

कोई मदद?


1
कृपया अपने उत्तर में उत्तर सामग्री डालें, प्रश्न के शरीर में नहीं।
jscs

जवाबों:


56

@ T0xicCode का उत्तर सही है, लेकिन मुझे लगा कि मैं विवरणों पर विस्तार करूंगा क्योंकि यह वास्तव में मुझे लगभग 20 घंटे लग गए और आखिरकार एक काम करने वाला समाधान लागू हो गया।

यदि आप अपने स्वयं के कंटेनर में नग्नेक्स को चलाने के लिए देख रहे हैं और इसे एक ही सर्वर उदाहरण पर कई अनुप्रयोगों को संतुलित करने के लिए रिवर्स प्रॉक्सी के रूप में उपयोग करते हैं तो आपको जिन चरणों का पालन करने की आवश्यकता है वे इस प्रकार हैं:

अपने कंटेनरों को लिंक करें

जब आप docker runअपने कंटेनर, आमतौर पर एक शेल स्क्रिप्ट में इनपुट करके User Data, आप किसी भी अन्य चल रहे कंटेनरों के लिए लिंक की घोषणा कर सकते हैं । इसका मतलब है कि आपको अपने कंटेनरों को क्रम में शुरू करने की आवश्यकता है और केवल बाद वाले कंटेनर पूर्व वाले से लिंक कर सकते हैं। इस तरह:

#!/bin/bash
sudo docker run -p 3000:3000 --name API mydockerhub/api
sudo docker run -p 3001:3001 --link API:API --name App mydockerhub/app
sudo docker run -p 80:80 -p 443:443 --link API:API --link App:App --name Nginx mydockerhub/nginx

इस उदाहरण में, APIकंटेनर किसी भी अन्य से जुड़ा नहीं है, लेकिन Appकंटेनर से जुड़ा हुआ है APIऔर Nginxदोनों से जुड़ा हुआ है APIऔर App

इसी का परिणाम में परिवर्तन है envवार्स और /etc/hostsफ़ाइलों कि रहते भीतर APIऔर Appकंटेनरों। परिणाम इस तरह दिखते हैं:

/ Etc / hosts

cat /etc/hostsआपके Nginxकंटेनर के भीतर चलने से निम्नलिखित उत्पादन होगा:

172.17.0.5  0fd9a40ab5ec
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3  App
172.17.0.2  API



ईएनवी वार्स

envआपके Nginxकंटेनर के भीतर चलने से निम्नलिखित उत्पादन होगा:

API_PORT=tcp://172.17.0.2:3000
API_PORT_3000_TCP_PROTO=tcp
API_PORT_3000_TCP_PORT=3000
API_PORT_3000_TCP_ADDR=172.17.0.2

APP_PORT=tcp://172.17.0.3:3001
APP_PORT_3001_TCP_PROTO=tcp
APP_PORT_3001_TCP_PORT=3001
APP_PORT_3001_TCP_ADDR=172.17.0.3

मैंने कई वास्तविक वेरियंट्स को छोटा कर दिया है, लेकिन उपरोक्त महत्वपूर्ण मान हैं जिन्हें आपको अपने कंटेनरों को प्रॉक्सी ट्रैफ़िक की आवश्यकता है।

ऊपर चल रहे कंटेनर के भीतर एक कमांड चलाने के लिए एक शेल प्राप्त करने के लिए, निम्नलिखित का उपयोग करें:

sudo docker exec -i -t Nginx bash

आप देख सकते हैं कि आपके पास अब /etc/hostsफ़ाइल प्रविष्टियाँ और envसंस्करण दोनों हैं जो किसी भी कंटेनर के लिए स्थानीय आईपी पते से जुड़े हुए हैं। अब तक मैं बता सकता हूं, यह सब तब होता है जब आप घोषित किए गए लिंक विकल्पों के साथ कंटेनर चलाते हैं। लेकिन अब आप इस जानकारी का उपयोग nginxअपने Nginxकंटेनर में कॉन्फ़िगर करने के लिए कर सकते हैं ।



Nginx को कॉन्फ़िगर करना

यह वह जगह है जहाँ यह थोड़ा मुश्किल हो जाता है, और विकल्पों की एक जोड़ी है। आप बनाई गई /etc/hostsफ़ाइल में एक प्रविष्टि को इंगित करने के लिए अपनी साइटों को कॉन्फ़िगर करने का विकल्प चुन सकते हैं docker, या आप ENVवर्सेस का उपयोग कर सकते हैं और sedअपने nginx.confऔर किसी अन्य गोपनीय फाइलों पर एक स्ट्रिंग प्रतिस्थापन (मैंने इस्तेमाल किया ) चला सकते हैं /etc/nginx/sites-enabledजो आईपी डालने के लिए आपके फ़ोल्डर में हो सकता है मान।



विकल्प A: एनवीएक्स का उपयोग करके एनवीएक्स को कॉन्फ़िगर करें

यह वह विकल्प है जिसके साथ मैं गया था क्योंकि मुझे /etc/hostsकाम करने के लिए फ़ाइल विकल्प नहीं मिल सका । मैं जल्द ही विकल्प बी की कोशिश करूंगा और किसी भी निष्कर्ष के साथ इस पोस्ट को अपडेट करूंगा।

इस विकल्प और /etc/hostsफ़ाइल विकल्प का उपयोग करने के बीच का मुख्य अंतर यह है कि आप अपने Dockerfileस्क्रिप्ट को CMDतर्क के रूप में उपयोग करने के लिए कैसे लिखते हैं , जो बदले में स्ट्रिंग मान ENVको आपकी गोपनीय फ़ाइल (ओं) से कॉपी करने के लिए संभालता है ।

यहाँ विन्यास फाइल का सेट दिया गया है जिसके साथ मैं समाप्त हुआ:

Dockerfile

FROM ubuntu:14.04
MAINTAINER Your Name <you@myapp.com>

RUN apt-get update && apt-get install -y nano htop git nginx

ADD nginx.conf /etc/nginx/nginx.conf
ADD api.myapp.conf /etc/nginx/sites-enabled/api.myapp.conf
ADD app.myapp.conf /etc/nginx/sites-enabled/app.myapp.conf
ADD Nginx-Startup.sh /etc/nginx/Nginx-Startup.sh

EXPOSE 80 443

CMD ["/bin/bash","/etc/nginx/Nginx-Startup.sh"]

nginx.conf

daemon off;
user www-data;
pid /var/run/nginx.pid;
worker_processes 1;


events {
    worker_connections 1024;
}


http {

    # Basic Settings

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 33;
    types_hash_max_size 2048;

    server_tokens off;
    server_names_hash_bucket_size 64;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;


    # Logging Settings
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;


    # Gzip Settings

gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 3;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/xml text/css application/x-javascript application/json;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    # Virtual Host Configs  
    include /etc/nginx/sites-enabled/*;

    # Error Page Config
    #error_page 403 404 500 502 /srv/Splash;


}

नोट: यह सुनिश्चित करने के लिए कि आपका कंटेनर लॉन्च होने के तुरंत बाद बाहर न निकले daemon off;, आपकी nginx.confफ़ाइल में शामिल करना महत्वपूर्ण है ।

api.myapp.conf

upstream api_upstream{
    server APP_IP:3000;
}

server {
    listen 80;
    server_name api.myapp.com;
    return 301 https://api.myapp.com/$request_uri;
}

server {
    listen 443;
    server_name api.myapp.com;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_pass http://api_upstream;
    }

}

Nginx-Startup.sh

#!/bin/bash
sed -i 's/APP_IP/'"$API_PORT_3000_TCP_ADDR"'/g' /etc/nginx/sites-enabled/api.myapp.com
sed -i 's/APP_IP/'"$APP_PORT_3001_TCP_ADDR"'/g' /etc/nginx/sites-enabled/app.myapp.com

service nginx start

मैं यह करने के लिए nginx.confऔर सामग्री की सबसे के बारे में अपना होमवर्क करने के लिए आप पर छोड़ देंगे api.myapp.conf

जादू Nginx-Startup.shवहां होता है जहां हम sedउस APP_IPप्लेसहोल्डर पर स्ट्रिंग रिप्लेसमेंट करने के लिए उपयोग करते हैं जिसे हमने upstreamअपने api.myapp.confऔर app.myapp.confफाइलों के ब्लॉक में लिखा है ।

यह ask.ubuntu.com प्रश्न इसे बहुत अच्छी तरह से समझाता है: कमांड का उपयोग करके किसी फ़ाइल के भीतर पाठ को ढूंढें और प्रतिस्थापित करें

पकड़ लिया पर OSX, sedहैंडल विकल्पों को अलग ढंग से, -iझंडा विशेष रूप से। उबंटू पर, -iध्वज 'जगह' को संभाल लेगा; यह फाइल को खोलेगा, टेक्स्ट को बदलेगा, और फिर उसी फाइल को 'सेव' करेगा। OSX पर, -iध्वज को उस फ़ाइल एक्सटेंशन की आवश्यकता होती है, जिसके परिणामस्वरूप फ़ाइल आपके पास होनी चाहिए। यदि आप ऐसी फ़ाइल के साथ काम कर रहे हैं जिसका कोई विस्तार नहीं है तो आपको -iध्वज के मान के रूप में '' इनपुट करना होगा ।

गोटा रेगेक्स के भीतर ईएनवी संस्करण sedका उपयोग करने के लिए जो स्ट्रिंग को खोजने के लिए उपयोग करता है जिसे आप डबल-कोट्स के भीतर संस्करण को लपेटने की आवश्यकता है। तो सही, अलबत्ता winky-looking, वाक्यविन्यास ऊपर जैसा है।

इसलिए docker ने हमारे कंटेनर को लॉन्च किया है और Nginx-Startup.shस्क्रिप्ट को चलाने के लिए ट्रिगर किया है , जिसने कमांड में दिए गए संबंधित वैरिएबल sedके मान APP_IPको बदलने के लिए उपयोग किया है । अब हमारे पास हमारी निर्देशिका में फ़ाइलें हैं जिनके पास कंटेनर को शुरू करने के समय स्थापित करने वाले var से आईपी पते हैं । अपनी फ़ाइल के भीतर आप देखेंगे कि ब्लॉक इस में बदल गया है:ENVsed/etc/nginx/sites-enabledENVapi.myapp.confupstream

upstream api_upstream{
    server 172.0.0.2:3000;
}

आपके द्वारा देखा गया IP पता अलग हो सकता है, लेकिन मैंने देखा है कि यह आमतौर पर होता है 172.0.0.x

अब आपके पास उचित रूप से सब कुछ रूटिंग होना चाहिए।

पकड़ लिया तुम नहीं कर सकते हैं पुनः आरंभ / फिर से दौड़ना किसी भी कंटेनरों एक बार आप प्रारंभिक उदाहरण लांच दौड़े हैं। डॉकर प्रत्येक कंटेनर को लॉन्च पर एक नया आईपी प्रदान करता है और इसके पहले इस्तेमाल किए गए किसी भी उपयोग को फिर से उपयोग नहीं करता है। तो api.myapp.comपहली बार 172.0.0.2 मिलेगा, लेकिन फिर अगली बार 172.0.0.4 मिलेगा। लेकिन Nginxपहले से ही पहले आईपी को अपनी गोपनीय फाइलों में, या उसकी /etc/hostsफाइल में सेट कर दिया है, इसलिए यह नए आईपी के लिए निर्धारित नहीं कर पाएगा api.myapp.com। इस के समाधान का उपयोग करने की संभावना है CoreOSऔर इसकी etcdसेवा, जो मेरी सीमित समझ ENVमें एक ही CoreOSक्लस्टर में पंजीकृत सभी मशीनों के लिए एक साझा की तरह कार्य करती है । यह अगला खिलौना है जिसे मैं स्थापित करने जा रहा हूं।



विकल्प बी: /etc/hostsफ़ाइल प्रविष्टियों का उपयोग करें

यह ऐसा करने का सबसे तेज़, आसान तरीका होना चाहिए , लेकिन मैं इसे काम नहीं कर सका। मूल रूप से आप सिर्फ /etc/hostsअपने api.myapp.confऔर app.myapp.confफाइलों में प्रवेश के मूल्य का इनपुट करते हैं , लेकिन मुझे यह तरीका काम नहीं आया।

अद्यतन: इस विधि को काम करने के तरीके के निर्देशों के लिए @Wes टॉड का उत्तर देखें ।

यहाँ मैंने जो प्रयास किया है api.myapp.conf:

upstream api_upstream{
    server API:3000;
}

यह देखते हुए कि मेरी /etc/hostsफ़ाइल में इस तरह से एक प्रविष्टि है : 172.0.0.2 APIमुझे लगा कि यह सिर्फ मूल्य में खींच जाएगा, लेकिन ऐसा नहीं लगता है।

मैं भी Elastic Load Balancerसभी AZ से मेरे सोर्सिंग के साथ सहायक मुद्दों की एक जोड़ी थी, तो हो सकता है कि जब मैं इस मार्ग की कोशिश कर रहा हूं तो यह मुद्दा हो। इसके बजाय मुझे सीखना था कि लिनक्स में स्ट्रिंग्स की जगह को कैसे संभालना है, इसलिए यह मजेदार था। मैं थोड़ी देर में यह कोशिश करूँगा और देखूंगा कि यह कैसे जाता है।


2
लिंक का उपयोग करते हुए एक और गोचा यह है कि यदि आप एपीआई कंटेनर को पुनः आरंभ करते हैं तो यह संभवतः एक नया आईपी प्राप्त करेगा। यह नेगनेक्स कंटेनर / आदि / होस्ट्स फ़ाइल में परिलक्षित नहीं होता है जो पुराने आईपी का उपयोग करना जारी रखेगा, और इस तरह से इसे फिर से शुरू करना होगा।
जूडोले

13

मैंने लोकप्रिय जेसन वाइल्डर रिवर्स प्रॉक्सी का उपयोग करने की कोशिश की जो कोड-जादुई रूप से सभी के लिए काम करता है, और सीखा कि यह हर किसी के लिए काम नहीं करता है (यानी: मुझे)। और मैं एनजीआईएनएक्स के लिए बिल्कुल नया हूं, और मुझे यह पसंद नहीं था कि मैं उन तकनीकों को नहीं समझता, जिन्हें मैं उपयोग करने की कोशिश कर रहा था।

मेरे 2 सेंट जोड़ना चाहते थे, क्योंकि linkingएक साथ कंटेनर के ऊपर चर्चा अब एक दिनांकित विशेषता है। तो यहाँ इसका उपयोग कैसे करना है पर एक विवरण है networks। यह उत्तर निगंक्स की स्थापना का एक पूर्ण उदाहरण है, जो कि Docker Composeनिगनेक्स कॉन्फ़िगरेशन का उपयोग करके एक सांख्यिकीय रूप से पृष्ठांकित वेबसाइट पर एक रिवर्स प्रॉक्सी के रूप में है।

टी एल; डॉ;

उन सेवाओं को जोड़ें जिन्हें एक पूर्वनिर्धारित नेटवर्क पर एक दूसरे से बात करने की आवश्यकता है। डॉकर नेटवर्क पर एक कदम-दर-चरण चर्चा के लिए, मैंने यहां कुछ चीजें सीखीं: https://technologyconversations.com/2016/04/25/docker-networking-and-dns-the-good-the-bad-and-and- बदसूरत/

नेटवर्क को परिभाषित करें

सबसे पहले, हमें एक ऐसे नेटवर्क की आवश्यकता है जिस पर आपकी सभी बैकएंड सेवाएं बात कर सकें। मुझे मेरा कहा जाता है, webलेकिन यह आप जो चाहें कर सकते हैं।

docker network create web

ऐप बनाएं

हम सिर्फ एक साधारण वेबसाइट ऐप करेंगे। वेबसाइट एक सरल इंडेक्स। Html पेज है जिसे नगीनक्स कंटेनर द्वारा परोसा जाता है। सामग्री एक फ़ोल्डर के तहत मेजबान के लिए एक घुड़सवार मात्रा हैcontent

DockerFile:

FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf

default.conf

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

डोकर-compose.yml

version: "2"

networks:
  mynetwork:
    external:
      name: web

services:
  nginx:
    container_name: sample-site
    build: .
    expose:
      - "80"
    volumes:
      - "./content/:/var/www/html/"
    networks:
      default: {}
      mynetwork:
        aliases:
          - sample-site

ध्यान दें कि हमें अब पोर्ट मैपिंग की आवश्यकता नहीं है। हम पोर्ट 80 को सरल बताते हैं। पोर्ट की टक्कर से बचने के लिए यह आसान है।

ऐप चलाएं

इस वेबसाइट को आग लगाओ

docker-compose up -d

आपके कंटेनर के लिए डीएनएस मैपिंग के बारे में कुछ मजेदार जांचें:

docker exec -it sample-site bash
ping sample-site

यह पिंग आपके कंटेनर के अंदर काम करना चाहिए।

प्रॉक्सी बनाएँ

नग्नेक्स रिवर्स प्रॉक्सी:

Dockerfile

FROM nginx

RUN rm /etc/nginx/conf.d/*

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

डोकर-compose.yml

version: "2"

networks:
  mynetwork:
    external:
      name: web


services:
  nginx:
    container_name: nginx-proxy
    build: .
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./conf.d/:/etc/nginx/conf.d/:ro
      - ./sites/:/var/www/
    networks:
      default: {}
      mynetwork:
        aliases:
          - nginx-proxy

प्रॉक्सी चलाएं

हमारे भरोसे का उपयोग कर प्रॉक्सी को आग लगाओ

docker-compose up -d

कोई समस्या नहीं मानते हुए, आपके पास दो कंटेनर चल रहे हैं जो एक दूसरे से उनके नाम का उपयोग करके बात कर सकते हैं। आइए इसका परीक्षण करते हैं।

docker exec -it nginx-proxy bash
ping sample-site
ping nginx-proxy

वर्चुअल होस्ट सेट करें

अंतिम विवरण वर्चुअल होस्टिंग फ़ाइल को सेट करना है ताकि प्रॉक्सी आपके मेल खाते को सेट करना चाहता है, उसके आधार पर यातायात को निर्देशित कर सकता है:

नमूना-site.conf हमारे वर्चुअल होस्टिंग कॉन्फिग के लिए:

  server {
    listen 80;
    listen [::]:80;

    server_name my.domain.com;

    location / {
      proxy_pass http://sample-site;
    }

  }

प्रॉक्सी को कैसे सेट किया गया था, इसके आधार पर, आपको इस फ़ाइल को आपके स्थानीय conf.dफ़ोल्डर में संग्रहीत करना होगा, जिसे हमने फ़ाइल volumesमें घोषणा के माध्यम से रखा था docker-compose

अंतिम लेकिन कम से कम नहीं, बता दें कि नगनेक्स इसे फिर से लोड करने के लिए है।

docker exec nginx-proxy service nginx reload

कदमों का ये क्रम सिर पर दर्द के घंटों की परिणति है क्योंकि मैंने पहली बार 502 बैड गेटवे त्रुटि के साथ संघर्ष किया था, और पहली बार nginx सीखना, क्योंकि मेरा अधिकांश अनुभव अपाचे के साथ था।

यह उत्तर प्रदर्शित करना है कि 502 बैड गेटवे त्रुटि को कैसे मारें, जिसके परिणामस्वरूप कंटेनरों को एक दूसरे से बात करने में सक्षम नहीं किया जा सकता है।

मुझे उम्मीद है कि यह जवाब किसी को दर्द के घंटों से बचाता है, क्योंकि एक दूसरे से बात करने के लिए कंटेनर मिलना वास्तव में किसी कारण से पता लगाना मुश्किल था, इसके बावजूद कि मुझे एक स्पष्ट उपयोग-मामला होने की उम्मीद थी। लेकिन फिर, मैं गूंगा। और कृपया मुझे बताएं कि मैं इस दृष्टिकोण को कैसे सुधार सकता हूं।


आह! ओले502 Gateway Error , इन दिनों एक बदनाम क्लासिक। बातचीत को आगे बढ़ाने और इस तरह का एक विस्तृत समाधान प्रदान करने के लिए @gdbj को धन्यवाद देने के लिए धन्यवाद।
एजेबी

बस इसके लिए समय निकालने के लिए धन्यवाद कहना चाहता था, इसने मुझे काफी परेशानी से बचाया। धन्यवाद।
सिंगल एंटिटी

10

Docker लिंक का उपयोग करके , आप अपस्ट्रीम कंटेनर को nginx कंटेनर से लिंक कर सकते हैं। एक अतिरिक्त विशेषता यह है कि docker होस्ट फ़ाइल का प्रबंधन करती है, जिसका अर्थ है कि आप संभावित रैंडम आईपी के बजाय एक नाम का उपयोग करके लिंक किए गए कंटेनर को संदर्भित कर सकेंगे।


7

AJB के "विकल्प बी" को आधार उबंटू छवि का उपयोग करके और अपने दम पर नग्नेक्स स्थापित करके काम करने के लिए बनाया जा सकता है। (यह तब काम नहीं आया जब मैंने डॉकटर हब से नग्नेक्स छवि का उपयोग किया।)

यहाँ डॉकर फ़ाइल का उपयोग किया गया है:

FROM ubuntu
RUN apt-get update && apt-get install -y nginx
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
RUN rm -rf /etc/nginx/sites-enabled/default
EXPOSE 80 443
COPY conf/mysite.com /etc/nginx/sites-enabled/mysite.com
CMD ["nginx", "-g", "daemon off;"]

मेरा नगीन विन्यास (उर्फ: conf / mysite.com):

server {
    listen 80 default;
    server_name mysite.com;

    location / {
        proxy_pass http://website;
    }
}

upstream website {
    server website:3000;
}

और अंत में, मैं अपने कंटेनर कैसे शुरू करता हूं:

$ docker run -dP --name website website
$ docker run -dP --name nginx --link website:website nginx

यह मुझे मिला और चल रहा था इसलिए मेरे नगनेक्स ने दूसरे डॉकटर कंटेनर को अपस्ट्रीम इंगित किया जिसने पोर्ट 3000 को उजागर किया।


सहायता वेस के लिए धन्यवाद! जब मैं छुट्टी से वापस आऊंगा तो यह कोशिश करूंगा।
एजेबी

मुझे आधिकारिक छवियों के साथ इस तरह की कुछ समस्याएं हुई हैं। मैंने ubuntu बॉक्स को बंद करना और फिर सीधे docker फ़ाइलों से लाइनों में खींचना बेहतर पाया है। ऐसा नहीं है कि यह आवश्यक होना चाहिए, लेकिन अफसोस ....
वेस टॉड

1
यह बहुत अच्छा है, लेकिन मुझे जो नहीं मिलता है वह यह है कि नग्नेक्स कॉन्फिग को केवल 'वेबसाइट' का मूल्य कैसे पता है। नग्नेक्स जादू या डॉक जादू, या कुछ और?
काइल चड्ढा

1
लाइन upstream website {nginx के लिए वेबसाइट मान को परिभाषित करती है। वह तो आप अपने में उपयोग करते हैं proxy_pass। इस के docker हिस्सा सिर्फ स्थिरता के लिए एक ही नाम का उपयोग करता है, लेकिन nginx सेटअप के साथ कुछ नहीं करना है। इसे थोड़ा और स्पष्ट करने के लिए प्रॉक्सी पास को पढ़ना चाहिए:upstream website { server localhost:3000; }
वेस टॉड

2
FYI करें मैं नवीनतम आधिकारिक nginx छवि (1.9.2) का उपयोग कर रहा हूं, और यह मेरे लिए काम कर रहा है। इसलिए शायद उन्होंने इस मुद्दे को ठीक कर दिया।
Pejvan

6

@ gdbj का उत्तर एक महान व्याख्या है और सबसे पुराना उत्तर है। हालांकि यहाँ एक सरल तरीका है।

इसलिए यदि आप nginx से सभी ट्रैफ़िक को पुनर्निर्देशित करना चाहते हैं, तो 80दूसरे कंटेनर के सामने आने से 8080, न्यूनतम कॉन्फ़िगरेशन कम से कम हो सकता है:

nginx.conf:

server {
    listen 80;

    location / {
        proxy_pass http://client:8080; # this one here
        proxy_redirect off;
    }

}

डोकर-compose.yml

version: "2"
services:
  entrypoint:
    image: some-image-with-nginx
    ports:
      - "80:80"
    links:
      - client  # will use this one here

  client:
    image: some-image-with-api
    ports:
      - "8080:8080"

डॉकर डॉक्स


पहले मुझे लगा कि आपको पोर्ट की टक्कर की समस्या होगी।
gdbj

@gdbj मेरी समस्या कंटेनरों के बीच url / ip रिज़ॉल्यूशन थी। लगता है कि हम एक ही था। आपके मामले में आप नेटवर्क का उपयोग करते हैं, जो ठीक भी काम कर रहा है, मेरे मामले में मैं केवल कंटेनरों को लिंक करता हूं
डायोरल

महान, यह सब मुझे चाहिए! उस उत्तर के लिए धन्यवाद।
फ्लोरन गेम्हलिन

2

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

मूल रूप से किसी को डॉक-कम्पोज़ फ़ाइल में लिंकिंग और पोर्ट्स को कॉन्फ़िगर करना होगा और तदनुसार nginx.conf पर अपस्ट्रीम को अपडेट करना होगा।


1
लेख का उपयोग करता है linksजो पदावनत हैं। अभी नेटवर्क का उपयोग करें: docs.docker.com/engine/userguide/networking
gdbj

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