@ 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 से आईपी पते हैं । अपनी फ़ाइल के भीतर आप देखेंगे कि ब्लॉक इस में बदल गया है:ENV
sed
/etc/nginx/sites-enabled
ENV
api.myapp.conf
upstream
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 से मेरे सोर्सिंग के साथ सहायक मुद्दों की एक जोड़ी थी, तो हो सकता है कि जब मैं इस मार्ग की कोशिश कर रहा हूं तो यह मुद्दा हो। इसके बजाय मुझे सीखना था कि लिनक्स में स्ट्रिंग्स की जगह को कैसे संभालना है, इसलिए यह मजेदार था। मैं थोड़ी देर में यह कोशिश करूँगा और देखूंगा कि यह कैसे जाता है।