111: कनेक्शन ने डॉकर कंटेनरों के लिए एनजीआईएनएक्स प्रॉक्सी से इनकार कर दिया

  • सेंटोस 7

मेरे पास पोर्ट 80 पर सुनने वाला एक साधारण एनजीएनएक्स प्रॉक्सी डॉकर कंटेनर है । यहाँ है Dockerfile:

FROM centos:7MAINTAINER Brian Ogden# Not currently being used but may come in handyARG ENVIRONMENTRUN yum -y update && \    yum clean all && \    yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \    yum -y makecache && \    yum -y install nginx-1.12.0 wget# Cleanup some default NGINX configuration files we don’t needRUN rm -f /etc/nginx/conf.d/default.confCOPY /conf/proxy.conf /etc/nginx/conf.d/proxy.confCOPY /conf/nginx.conf /etc/nginx/nginx.confCMD ["nginx"]

और इस एनजीएनएक्स प्रॉक्सी के लिए यहां मेरा एनजीएनएक्स है । conf:

daemon off;user  nginx;worker_processes  2;error_log  /var/log/nginx/error.log warn;pid        /var/run/nginx.pid;events {    worker_connections  1024;    use epoll;    accept_mutex off;}http {    include       /etc/nginx/mime.types;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    default_type  application/octet-stream;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';    access_log  /var/log/nginx/access.log  main;    sendfile        on;    #tcp_nopush     on;    keepalive_timeout  65;    client_max_body_size 300m;    client_body_buffer_size 300k;    large_client_header_buffers 8 64k;    gzip  on;    gzip_http_version 1.0;    gzip_comp_level 6;    gzip_min_length 0;    gzip_buffers 16 8k;    gzip_proxied any;    gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;    gzip_disable "MSIE [1-6]\.";    gzip_vary on;    include /etc/nginx/conf.d/*.conf;}

और यहाँ मेरा प्रॉक्सी कॉन्फ़िगरेशन है:

upstream accountstaging {    server 127.0.0.1:5023;}server {    listen 80;    server_name account.staging.mysite.com;    location / {        proxy_pass         http://accountstaging;        proxy_redirect     off;        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-Host $server_name;    }}

मेरा प्रॉक्सी कॉन्फ़िगरेशन पोर्ट 80 पर सुन रहा है और अनुरोधों का अनुरोध करने का प्रयास कर रहा है account.staging.mysite.com पोर्ट 5023 पर एनजीएनआईएक्स प्रॉक्सी सुनने के समान डॉकर होस्ट पर चलने वाले डॉकर कंटेनर के लिए ।

यहाँ मेरा डॉकर-रचना है । yml के लिए Nginx प्रॉक्सी:

version: '3'services:  reverseproxy:    build:       context: ./      dockerfile: docker/Dockerfile    image: tsl.devops.reverseproxy.image    container_name: tsl.devops.reverseproxy.container    ports:      - "80:80"

यहाँ डॉकर-रचना है । पोर्ट 5023 पर इस डॉकर कंटेनर सुनने के लिए वाईएमएल: संस्करण: '3'

services:  apistaging:    build:       context: ./      dockerfile: docker/staging/Dockerfile    image: tsl.api.example.image    container_name: tsl.api.example.container    ports:      - "127.0.0.1:5023:80"

डॉकरफाइल वास्तव में मेरे प्रश्न के लिए बहुत मायने नहीं रखता है लेकिन यहां यह वैसे भी है:

FROM tsl.devops.dotnetcore.base.image:2MAINTAINER Brian OgdenWORKDIR /appCOPY ./src/Tsl.Example/bin/Release/netcoreapp2.0/publish .ENTRYPOINT ["dotnet", "Tsl.Example.dll"]

मैंने पीछा किया यह उदाहरण मेरा प्रॉक्सी सेटअप करने के लिए ।

मैंने पहले स्टैकएक्सचेंज मंचों पर एक संबंधित प्रश्न पूछा है यहाँ और यहाँ. यह प्रश्न मैंने पोर्ट 5023 पर सुनने वाले एक डॉकर कंटेनर के अनुरोध को अग्रेषित करने के लिए परिदृश्य को परिष्कृत और सरल बना दिया है ।

चूंकि मेरी आधार छवि सेंटोस है जिसका मैंने अनुसरण किया है यह यहाँ यह सुनिश्चित करने के लिए कि सेलिनक्स पोर्ट 5023 को आगे बढ़ने की अनुमति दे रहा है

इसके लिए धन्यवाद प्रश्न और उत्तर यहाँ, मैं महसूस करने में सक्षम था कि मेरे पास दो मुद्दे चल रहे थे:

  1. कंटेनरों में अलग-अलग डिफ़ॉल्ट डॉकर नेटवर्क हैं क्योंकि मैं दो अलग-अलग डॉकर-कंपोज़ का उपयोग कर रहा हूं । वाईएमएल फाइलें, मैंने अपने एनजीएनआईएक्स प्रॉक्सी को अपने किसी भी एपीआई कंटेनर से स्वतंत्र रूप से काम करने की कल्पना की थी, जिसमें डॉकर-कंपोज़ भी शामिल है, जो नीचे दिए गए मुद्दे पर अधिक है
  2. दूसरा मुद्दा बस तब है जब मैंने 127.0.0.1:5023 को प्रॉक्सी करने की कोशिश की, जो कि एनजीएनएक्स कंटेनर के अंदर लोकलहोस्ट है, न कि एनजीएनएक्स प्रॉक्सी कंटेनर के बाहर नेटवर्क

इसलिए मेरे नगनेक्स प्रॉक्सी डॉकर कंटेनर और मेरे एपीआई डॉकर कंटेनर के लिए डॉकर-कंपोज़ द्वारा बनाए जा रहे अलग-अलग डिफ़ॉल्ट नेटवर्क हैं क्योंकि मैं दो अलग-अलग डॉकर-कंपोज़ को खुश कर रहा हूं । yml फ़ाइलें. ऐसा इसलिए है क्योंकि मेरे पास कई एपीआई माइक्रोसर्विसेज के लिए जेनकिंस बिल्ड हैं, इसलिए स्वतंत्र डॉकर-कंपोज़ फाइलें हैं और मुझे प्रत्येक माइक्रोसर्विस को पोर्ट 80 पर अनुरोधों को अग्रेषित करने के लिए एक एनजीएनएक्स प्रॉक्सी की आवश्यकता है ।

इसका परीक्षण करने के लिए, एक डॉकर-रचना बनाई । दोनों कंटेनरों के लिए वाईएमएल, एपीआई और एनजीआईएनएक्स प्रॉक्सी:

version: '3'services:  reverseproxy:    build:       context: ./      dockerfile: docker/nginxproxy/docker/Dockerfile    image: tsl.devops.reverseproxy.image    container_name: tsl.devops.reverseproxy.container    ports:      - "80:80"  apistaging:    build:       context: ./      dockerfile: docker/staging/Dockerfile    image: tsl.api.example.image    container_name: tsl.api.example.container    ports:      - "5023:5023"    environment:       ASPNETCORE_URLS: http://+:5023

हां अभी भी एक मुद्दा था, प्रॉक्सी एचटीटीपी//:127.0.0.1:5023 को पास करता है, जो आगे एनजीएनएक्स डॉकर कंटेनर में रहता है और कभी भी डॉकर होस्ट पर चलने वाले एपीआई को नहीं पाता है, मुझे बस डॉकर-कंपोज़ का उपयोग करने की आवश्यकता है । इसे पाने के लिए वाईएमएल सेवा का नाम:

upstream accountstaging {    server apistaging:5023;}server {    listen 80;    server_name account.staging.mysite.com;    location / {        proxy_pass         http://accountstaging;        proxy_redirect     off;        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-Host $server_name;    }}

मुझे यह समस्या थी लेकिन मेरा मुद्दा यह था कि मेरे पास दो फ़ोल्डर थे जो दोनों में डॉकर-कंपोज़ थे । वाईएमएल फाइलें जिनमें दोनों की एक सेवा थी जिसका नाम 'वेब' था । मैंने एक सेवा का नाम बदल दिया ।

डॉकर नेटवर्क के साथ संघर्ष कर रहे किसी व्यक्ति की मदद करने के लिए पूरी तस्वीर जितनी मैं थी (हूँ?):

डॉकर-कंपोज़ प्रोजेक्ट अक्सर अन्य डॉकर सेवाओं के लिए एचटीटीपी ट्रैफ़िक को रूट करने के लिए रिवर्स-प्रॉक्सी के रूप में एनजीआईएनएक्स का उपयोग करते हैं । nginx में एक सेवा थी मेरी projectfolder/docker-compose.yml जो दो डॉकर नेटवर्क से जुड़ा था ।

एक डिफ़ॉल्ट नेटवर्क बनाया गया था जब मैंने डॉकर-कंपोज़ का उपयोग किया था projectfolder/docker-compose.yml (इसका नाम है projectfolder_default और सेवाओं डिफ़ॉल्ट रूप से इसे करने के लिए कनेक्ट जब तक आप एक networks किसी अन्य नेटवर्क के साथ आपकी सेवा के लिए संपत्ति, फिर सुनिश्चित करें कि आप जोड़ते हैं - default सूची में) । जब मैं भागा docker network ls मैंने देखा projectfolder_default सूची में और जब मैं भाग गया docker network inspect projectfolder_default मैंने नग्नेक्स कंटेनर देखा, इसलिए सब कुछ अच्छा था ।

अन्य एक नेटवर्क कहा जाता था my_custom_network कि मैंने खुद को स्थापित किया । मेरे पास एक स्टार्टअप स्क्रिप्ट थी जिसने इसे बनाया था यदि यह अस्तित्व में नहीं था https://stackoverflow.com/a/53052379/13815107 मैं इसे करने के लिए बात की जरूरत web सेवा में otherproject/docker-compose.yml. मैंने सही ढंग से जोड़ा था my_custom_network को:

  • nginx सेवा के नेटवर्क की सूची projectfolder/docker-compose.yml
  • के नीचे projectfolder/docker-compose.yml
  • web सेवा के नेटवर्क में otherproject/docker-compose.yml
  • के नीचे otherproject/docker-compose.yml

नेटवर्क दिखाया और सही कंटेनर का उपयोग किया था docker network ls और docker network inspect my_custom_network

हालाँकि, मैंने मान लिया कि कॉलिंग http://web डॉकर सेवा के लिए नक्शा होगा web.projectfolder_default. मुझसे गलती हुई थी । मैंने नग्नेक्स कंटेनर पर खोल खोला (docker exec -it nginx sh). जब मैंने इस्तेमाल किया ping web (आवश्यकता हो सकती है apt-get update, apt-get install iputils-ping) यह सफल रहा, लेकिन इसने एक यूआरएल मुद्रित किया my_custom_network इस तरह मैंने गलती का पता लगाया।

projectfolder/डोकर रचना.yml

  services:    # http://web did NOT map to this service!! Use http://web.main_default or change the names    web:      ...     nginx:        ...      links:        - web      networks:        - default        - my_custom_network    ...  networks:    - my_custom_network      external: true

otherproject/डोकर रचना.yml

  services:    # http://web connected to this service instead. You could use http://web.my_custom_network to call it out instead    web:      ...       networks:        - default        - my_custom_network    ...  networks:    - my_custom_network      external: true

projectfolder/.../nginx/सर्वर.conf.टेम्पलेट (अगले करने के लिए Dockerfile)...

server {    ...    location /auth {        internal;        # This routed to wrong 'web'        proxy_pass              http://web:9001;        proxy_pass_request_body off;        proxy_set_header        Content-Length "";    }    location / {        alias /data/dist/;    }    location /robots.txt {        alias /robots.txt;    }    # Project Folder backend    location ~ ^/(api|login|logout)/ {        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_connect_timeout 300s;        proxy_read_timeout 300s;        # This routed to wrong 'web'        proxy_pass http://web:9001;    }    # Other project UI    location /other-project {        alias /data/other-project-client/dist/;    }    # Other project Django server    location ~ ^/other-project/(rest)/ {        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_connect_timeout 300s;        proxy_read_timeout 300s;        # This should work        proxy_pass http://web.my_custom_network:8000;    }}