@ 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 से मेरे सोर्सिंग के साथ सहायक मुद्दों की एक जोड़ी थी, तो हो सकता है कि जब मैं इस मार्ग की कोशिश कर रहा हूं तो यह मुद्दा हो। इसके बजाय मुझे सीखना था कि लिनक्स में स्ट्रिंग्स की जगह को कैसे संभालना है, इसलिए यह मजेदार था। मैं थोड़ी देर में यह कोशिश करूँगा और देखूंगा कि यह कैसे जाता है।