मैं एक डॉक कंटेनर में nginx है, और एक अन्य डॉक कंटेनर में एक नोडज वेबैप। नोडज सर्वर 8080 पोर्ट पर होस्ट सर्वर से उपलब्ध है।
नगनेक्स डॉकटर कंटेनर 80 पोर्ट को सुन रहा है (बाद में प्रमाण पत्र देगा, पहले यह आधार काम करना होगा)।
और अब मैं चाहता हूं कि इस 8080 नोडज एप्लिकेशन को एक उपडोमेन भेजा जाए। app1.example.com कहते हैं
बाहर से मैं ते सर्वर आईपी (या होस्टनाम) और पोर्ट 8080 द्वारा ऐप तक पहुंच सकता हूं लेकिन app1.example.com पर नहीं। और यह app1.example.com:8080 पर काम करता है (मैंने होस्ट सर्वर पर पोर्ट 8080 खोला है)।
मुझे एक बुरा गेटवे nginx संदेश मिलता हैapp1.example.com के पास पहुंचना तो मुझे पहले nginx कंटेनर में मिलता है, लेकिन मैं होस्ट सर्वर पर वापस कैसे जाऊं प्रॉक्सी सर्वर से इसे होस्ट सर्वर के पोर्ट 8080 (और nginx कंटेनर के 8080 पोर्ट नहीं) में पास करता हूं। रिवर्स एक्सपोजर सिंटैक्स की तलाश में।
मुख्य समस्या है, निश्चित रूप से अगर मैं आईपी और पोर्ट 127.0.0.1:8080 का उपयोग करता हूं तो यह नगीनक्स कंटेनर पर कोशिश करेगा ...। तो मैं कैसे nginx कंटेनर मार्ग को होस्ट 127.0.0.1:8080 पर वापस जाने दूं?
मैंने 0.0.0.0 की कोशिश की है और एक अपस्ट्रीम को परिभाषित करते हुए, वास्तव में बहुत कुछ कर रहा है, और बहुत सारे विन्यास की कोशिश की है ... लेकिन अभी तक एक काम नहीं मिला है ...।
संपादित करें बस पता चला, docker की यह कमांड मदद कर सकती है:
sudo docker network inspect bridge
यह कॉटीनरों के अंदर उपयोग किए जाने वाले आईपी पते को दिखाता है (मेरे मामले में 172.17..0.2), लेकिन यह निश्चित नहीं है कि यह पता हर बार वही रहेगा जब डॉकटर पुनः आरंभ करेगा ... (उदाहरण के लिए सर्वर रिबूट)
संपादित करें Followning क्षारीय उत्तर अब मेरे पास है (लेकिन अभी भी काम नहीं कर रहा है):
मेरी docker-compose.yml फ़ाइल:
version: "2"
services:
nginx:
container_name: nginx
image: nginx_img
build: ../docker-nginx-1/
ports:
- "80:80"
networks:
- backbone
nodejs:
container_name: nodejs
image: merites/docker-simple-node-server
build: ../docker-simple-node-server/
networks:
- backbone
expose:
- 8080
networks:
backbone:
driver: bridge
और मेरा नगनेक्स (सरलता के लिए conf.d फ़ोल्डर में झुकाव को छोड़ दिया):
कार्यकर्ता_प्रणाली 1;
घटनाएँ {worker_connections 1024; }
http {
sendfile on;
upstream upsrv {
server nodejs:8080;
}
server {
listen 80;
server_name app1.example.com;
location / {
proxy_pass http://upsrv;
}
}
}
31-08-2016 को संपादित करें
यह समस्या है, नाम की रीढ़ की हड्डी नहीं है, लेकिन फ़ोल्डर से शुरू होने के बाद बुलाया:
sudo docker network ls
बाहर डालता है:
NETWORK ID NAME DRIVER SCOPE
1167c2b0ec31 bridge bridge local
d06ffaf26fe2 dockerservices1_backbone bridge local
5e4ec13d790a host host local
7d1f8c32f259 none null local
01-09-2016 को संपादित करें
यह मेरे नगीनेक्स डॉक कंटेनर सेटअप के तरीके के कारण हो सकता है?
यह मेरे द्वारा उपयोग की गई डॉकटर फ़ाइल है:
############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################
# Set the base image to Ubuntu
FROM ubuntu
# File Author / Maintainer
MAINTAINER Maintaner Name
# Install Nginx
# Add application repository URL to the default sources
# RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
# Update the repository
RUN apt-get update
# Install necessary tools
RUN apt-get install -y nano wget dialog net-tools
# Download and Install Nginx
RUN apt-get install -y nginx
# Remove the default Nginx configuration file
RUN rm -v /etc/nginx/nginx.conf
# Copy a configuration file from the current directory
ADD nginx.conf /etc/nginx/
# Append "daemon off;" to the beginning of the configuration
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
# Expose ports
EXPOSE 80
# Set the default command to execute
# when creating a new container
CMD service nginx start
मेरा अंतिम समाधान 1 सीप्ट। 2016
मैंने इस कंपोज़ फ़ाइल का अब उपयोग किया है:
version: "2"
services:
nginx:
image: nginx
container_name: nginx
volumes:
- ./nginx-configs:/etc/nginx/conf.d
ports:
- "80:80"
networks:
- backbone
nodejs:
container_name: nodejs
image: merites/docker-simple-node-server
build: ../docker-simple-node-server/
networks:
- backbone
expose:
- 8080
networks:
backbone:
driver: bridge
प्रोजेक्ट फ़ोल्डर में, जो आप डॉक-कंपोज़ अप -d चलाते हैं, मैंने nginx-configs नाम का एक फ़ोल्डर जोड़ा है। यह फ़ोल्डर /etc/nginx/conf.d नाम के nginx कंटेनर में सभी फ़ाइलों को "ओवरराइड" करेगा
इससे पहले कि मैंने यह वॉल्यूम माउंट जोड़ा, मैंने nginx कंटेनर से default.cfg की प्रतिलिपि बनाई। कमांड का उपयोग करना:
docker निष्पादित -t -i container_name / bin / bash
और बिल्ली की तुलना में /etc/nginx/conf.d/default.conf
और nginx configs के साथ प्रोजेक्ट फ़ोल्डर में एक ही default.conf जोड़ा।
डिफ़ॉल्ट के अलावा मैंने इस सामग्री के साथ app1.conf जोड़ा:
upstream upsrv1 {
server nodejs:8080;
}
server {
listen 80;
server_name app1.example.com;
location / {
proxy_pass http://upsrv1;
}
}
इस तरह, मैं आसानी से एक दूसरा ऐप जोड़ सकता हूं ... तीसरा और इसी तरह।
इसलिए मूल बातें अब काम कर रही हैं ...
उत्तर:
उत्तर № 1 के लिए 4यहाँ एक सर्वोत्तम अभ्यास है। केवल मेजबान के बाहर पोर्ट 80 को बेनकाब करें। नोडज ऐप केवल एक निजी नेटवर्क में हो सकता है जो केवल नगनेक्स के माध्यम से सुलभ हो।
version: "2"
services:
nginx:
...
ports:
- "80:80"
networks:
- backbone
nodejs:
...
networks:
- backbone
expose:
- 8080
networks:
backbone:
driver: bridge
आपकी nginx.conf फ़ाइल में, अपस्ट्रीम सर्वर को सूचीबद्ध किया जा सकता है nodejs:8080
। डॉकटर डेमॉन इसे सही आंतरिक आईपी में हल करेगा।