Docker Networking - nginx: [emerg] होस्ट अपस्ट्रीम में नहीं मिला


98

मैंने हाल ही में लिंक का उपयोग करने के लिए डॉकर 1.9 और डॉकर-कंपोज 1.5 के नेटवर्किंग फीचर की ओर पलायन करना शुरू कर दिया है।

अब तक लिंक्स के साथ कोई समस्या नहीं थी nginx के साथ एक समूह में एक अलग सर्वर में स्थित मेरे php5-fpm fastcgi सर्वर से कनेक्ट करने के लिए docker-compose। हालाँकि, जब मैं docker-compose --x-networking upअपने php-fpm, mongo और nginx कंटेनरों को बूट करता हूं, तो nginx quinx सीधे[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16

हालाँकि, अगर मैं docker-compose कमांड को फिर से चलाता हूं, जबकि php और mongo कंटेनर चल रहे हैं (nginx से बाहर), nginx शुरू होता है और तब से ठीक काम करता है।

यह मेरी docker-compose.ymlफाइल है:

nginx:
  image: nginx
  ports:
    - "42080:80"
  volumes:
    - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro

php:
  build: config/docker/php
  ports:
    - "42022:22"
  volumes:
    - .:/var/www/html
  env_file: config/docker/php/.env.development

mongo:
  image: mongo
  ports:
    - "42017:27017"
  volumes:
    - /var/mongodata/wa-api:/data/db
  command: --smallfiles

यह मेरे default.confलिए है nginx:

server {
    listen  80;

    root /var/www/test;

    error_log /dev/stdout debug;
    access_log /dev/stdout;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        # Referencing the php service host (Docker)
        fastcgi_pass waapi_php_1:9000;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        # We must reference the document_root of the external server ourselves here.
        fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;

        fastcgi_param HTTPS off;
    }
}

मैं केवल एक डॉकटर-कंपोज़ कॉल के साथ काम करने के लिए कैसे नंगे हो सकता हूं?


3
मैं यह भी मुठभेड़ कर रहा हूँ। मुझे यकीन नहीं है कि यह कंपोज़ फ़ाइल के साथ कोई त्रुटि है, या स्वयं docker नेटवर्किंग के साथ बग है।
jrdn

जवाबों:


26

"वॉल्यूम_फ्रॉम" को वर्कअराउंड के रूप में तब तक उपयोग करने की संभावना है, जब तक depend_on सुविधा (नीचे चर्चा की गई) शुरू नहीं हो जाती। आपको बस अपने डॉकटर-कंपोज़ फ़ाइल को नीचे के रूप में बदलना है:

nginx:
  image: nginx
  ports:
    - "42080:80"
  volumes:
    - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
  volumes_from:
    - php

php:
  build: config/docker/php
  ports:
    - "42022:22"
  volumes:
    - .:/var/www/html
  env_file: config/docker/php/.env.development

mongo:
  image: mongo
  ports:
    - "42017:27017"
  volumes:
    - /var/mongodata/wa-api:/data/db
  command: --smallfiles

उपरोक्त दृष्टिकोण में एक बड़ा चेतावनी यह है कि php की मात्राएँ nginx के संपर्क में हैं, जो वांछित नहीं है। लेकिन फिलहाल यह एक विशिष्ट विशिष्ट समाधान है जिसका उपयोग किया जा सकता है।

depend_on सुविधा यह शायद एक भविष्य का जवाब होगा। क्योंकि डॉकर में कार्यक्षमता अभी तक लागू नहीं है (1.9 के रूप में)

डॉकर द्वारा शुरू की गई नई नेटवर्किंग सुविधा में "depend_on" को पेश करने का प्रस्ताव है। लेकिन उसी @ https://github.com/docker/compose/issues/374 के बारे में लंबे समय से बहस चल रही है , इसलिए इसे लागू करने के बाद, कंटेनर के स्टार्ट-अप को ऑर्डर करने के लिए सुविधा depend_on का उपयोग किया जा सकता है, लेकिन पल, आपको निम्न में से एक का सहारा लेना होगा:

  1. जब तक php सर्वर न हो, तब तक nginx को पुनः प्रयास करें - मैं इसे पसंद करूंगा
  2. ऊपर वर्णित के अनुसार volums_from वर्कअराउंड का उपयोग करें - अनावश्यक कंटेनर में वॉल्यूम रिसाव के कारण मैं इसका उपयोग करने से बचूंगा।

3
यह मेरे लिए ठीक नहीं किया।
गिज्स

@Gijs यदि आप पोस्ट कर सकते हैं कि आपका सटीक मामला क्या है और क्या काम नहीं किया है, तो कोई मंच पर मदद कर सकता है।
फणी

4
वॉल्यूम_फ्रॉम को पदावनत किया जाता है
रोमा रश

मैं इस के साथ Azure App Service Docker Compose (पूर्वावलोकन) में एक समस्या में भाग गया। यह भी सुनिश्चित करना था कि links:नगनेक्स में शामिल किसी भी नाम का उपयोग मैंने उसी सेवा के रूप में किया था जैसे - my-service:my-serviceया इस उदाहरण में - mongo:mongo
ग्रग

28

depends_onइसे अब (2016) लागू होने के बाद से उल्लिखित निर्देश के साथ हल किया जा सकता है :

version: '2'
  services:
    nginx:
      image: nginx
      ports:
        - "42080:80"
      volumes:
        - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      depends_on:
        - php

    php:
      build: config/docker/php
      ports:
        - "42022:22"
      volumes:
        - .:/var/www/html
      env_file: config/docker/php/.env.development
      depends_on:
        - mongo

    mongo:
      image: mongo
      ports:
        - "42017:27017"
      volumes:
        - /var/mongodata/wa-api:/data/db
      command: --smallfiles

इसके साथ सफलतापूर्वक परीक्षण किया गया:

$ docker-compose version
docker-compose version 1.8.0, build f3628c7

प्रलेखन में अधिक जानकारी प्राप्त करें ।

इस विषय को समर्पित एक बहुत ही दिलचस्प लेख भी है: कम्पोज़ में स्टार्टअप ऑर्डर को नियंत्रित करना


12

आप यह इंगित करने के लिए कि nginx को अपस्ट्रीम सर्वर अनुपलब्धता पर विफल होने से पहले कंटेनर में कनेक्शन अनुरोधों की x संख्या को पुन: प्रयास करना चाहिए, nginx के max_fails और fail_timeout निर्देशों को सेट कर सकते हैं।

आप अपने बुनियादी ढांचे और गति के अनुसार इन दो नंबरों को ट्यून कर सकते हैं जिस पर पूरा सेटअप आ रहा है। आप नीचे दिए गए URL के स्वास्थ्य जांच अनुभाग के बारे में अधिक जानकारी पढ़ सकते हैं: http://nginx.org/en/docs/http/load_balancing.html

Http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server के कुछ अंश निम्नलिखित हैं max_fails=number

सर्वर के साथ संवाद करने के लिए असफल प्रयासों की संख्या निर्धारित करता है जो कि सर्वर के लिए अनुपलब्ध_समय पैरामीटर द्वारा निर्धारित अवधि के लिए भी उपलब्ध है, जो कि सर्वर के लिए उपलब्ध नहीं है। डिफ़ॉल्ट रूप से, असफल प्रयासों की संख्या 1 पर सेट है। शून्य मान प्रयासों के लेखांकन को अक्षम करता है। माना जाता है कि असफल प्रयास को प्रॉक्सी_नेक्स्ट_अपस्ट्रीम, फास्टसी_नेक्स्ट_अपस्ट्रीम, uwsgi_next_upstream, scgi_next_upstream, और memcached_next_upstream निर्देशों द्वारा परिभाषित किया गया है।

fail_timeout=time

उस समय को सेट करता है जिसके दौरान सर्वर के साथ संवाद करने के असफल प्रयासों की संख्या सर्वर पर अनुपलब्ध पर विचार करने के लिए होनी चाहिए; और सर्वर की अवधि अनुपलब्ध मानी जाएगी। डिफ़ॉल्ट रूप से, पैरामीटर 10 सेकंड के लिए सेट है।

सटीक होने के लिए आपकी संशोधित नग्नेक्स कॉन्फिग्रेशन फ़ाइल निम्नानुसार होनी चाहिए (यह स्क्रिप्ट मान रही है कि सभी कंटेनर 25 सेकंड तक कम से कम हैं, यदि नहीं, तो कृपया नीचे दिए गए सेक्शन में fail_timeout या max_fails बदलें): नोट: मैंने नहीं किया स्वयं स्क्रिप्ट का परीक्षण करें, ताकि आप इसे आजमा सकें!

upstream phpupstream {
   server waapi_php_1:9000 fail_timeout=5s max_fails=5;
}
server {
    listen  80;

    root /var/www/test;

    error_log /dev/stdout debug;
    access_log /dev/stdout;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        # Referencing the php service host (Docker)
        fastcgi_pass phpupstream;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        # We must reference the document_root of the external server ourselves here.
        fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;

        fastcgi_param HTTPS off;
    }
}

साथ ही, docker ( https://github.com/docker/docker.github.io/blob/master/compose/networking.md#update-containers ) से निम्नलिखित नोट के अनुसार , यह स्पष्ट है कि जाँच के लिए पुन: प्रयास तर्क अन्य कंटेनरों का स्वास्थ्य कर्ता की जिम्मेदारी नहीं है और बल्कि कंटेनरों को स्वास्थ्य जांच स्वयं करनी चाहिए।

कंटेनरों को अद्यतन करना

यदि आप किसी सेवा में कॉन्फ़िगरेशन परिवर्तन करते हैं और इसे अपडेट करने के लिए docker-compose चलाते हैं, तो पुराने कंटेनर को हटा दिया जाएगा और नया एक अलग IP पते के तहत नेटवर्क में शामिल हो जाएगा लेकिन समान नाम। रनिंग कंटेनर उस नाम को देखने और नए पते से जुड़ने में सक्षम होंगे, लेकिन पुराना पता काम करना बंद कर देगा।

यदि किसी कंटेनर में पुराने कंटेनर के लिए कनेक्शन खुले हैं, तो उन्हें बंद कर दिया जाएगा। यह इस स्थिति का पता लगाने, फिर से नाम देखने और फिर से जोड़ने के लिए एक कंटेनर की जिम्मेदारी है।


3
यह काम नहीं करेगा। नगनेक्स डॉक्स में इस खंड के अंत में कैविटी पढ़ें: "यदि समूह में केवल एक ही सर्वर है, तो max_fails, fail_timeout और slow_start मापदंडों को अनदेखा किया जाता है, और ऐसे सर्वर को कभी भी अनुपलब्ध नहीं माना जाएगा।"
फर्ग्यूज

1
@ फर्ग्यूज जो एक अच्छा कैच था। एक वर्कअराउंड के रूप में आप एक ही कंटेनर के दो उर्फ ​​प्रविष्टियों को एक ही कंटेनर से एक समूह बनाने के लिए जोड़ सकते हैं।
फणी

वैकल्पिक समाधान के रूप में, मैंने कंटेनरों को जोड़ने और अन्य कंटेनरों के लोड होने तक उन्हें प्रतीक्षा करने के लिए एक ही प्रश्न का उपयोग "वॉल्यूम_फ्रॉम" में प्रदान किया है। यह मेरे लिए काम कर रहा है।
फणी

7

मेरा मानना ​​है कि नग्नेक्स डॉकर रिज़ॉल्वर (127.0.0.11) को ध्यान में नहीं रखते हैं, इसलिए कृपया, क्या आप इसे जोड़ने का प्रयास कर सकते हैं:

resolver 127.0.0.11

अपने nginx विन्यास फाइल में?


जैसे कई रिसोल्वर जोड़ेresolver 127.0.0.11 8.8.8.8;
लियोनार्डो Chaia

1
डॉक्स में बताए अनुसार राउंड रॉबिन में क्वेरी नहीं होगी: नाम सर्वर एक राउंड-रॉबिन फैशन में क्वियर होते हैं।

6

यदि आप अंतिम टिप्पणी को पढ़ने के लिए बहुत खो गए हैं। मैं एक और समाधान पर पहुंच गया हूं।

मुख्य समस्या यह है कि आपने सेवाओं के नाम किस तरह रखे हैं।

इस स्थिति में, यदि आपके में docker-compose.yml, php के लिए सेवा को "एपीआई" या ऐसा कुछ कहा जाता है, तो आपको यह सुनिश्चित करना होगा कि फाइल में nginx.confजो लाइन शुरू होती fastcgi_passहै, उसका नाम php सेवा के समान है। अर्थातfastcgi_pass api:9000;


3

मुझे एक ही समस्या थी क्योंकि मेरे में दो नेटवर्क परिभाषित थे docker-compose.yml: एक बैकेंड और एक फ्रंटेंड।
जब मैंने बदल दिया कि उसी डिफ़ॉल्ट नेटवर्क पर कंटेनरों को चलाने के लिए सब कुछ ठीक काम करना शुरू कर दिया।


यह एक उत्तर होने से बहुत दूर है।
dargmuesli

2

एक ही समस्या थी और इसे हल किया। कृपया निम्नलिखित लाइन को docker-compose.yml nginx सेक्शन में जोड़ें:

links:
  - php:waapi_php_1

Nginx config fastcgi_pass अनुभाग में होस्ट docker-compose.yml nginx कॉन्फ़िगरेशन से जुड़ा होना चाहिए।


1

उल्लेख के लायक दो बातें:

  • एक ही नेटवर्क ब्रिज का उपयोग करना
  • linksमेजबानों के रेजोल को जोड़ने के लिए उपयोग करना

मेरा उदाहरण:

version: '3'
services:
  mysql:
    image: mysql:5.7
    restart: always
    container_name: mysql
    volumes:
      - ./mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: tima@123
    network_mode: bridge
  ghost:
    image: ghost:2
    restart: always
    container_name: ghost
    depends_on:
      - mysql
    links:
      - mysql
    environment:
      database__client: mysql
      database__connection__host: mysql
      database__connection__user: root
      database__connection__password: xxxxxxxxx
      database__connection__database: ghost
      url: https://www.itsfun.tk
    volumes:
      - ./ghost-data:/var/lib/ghost/content
    network_mode: bridge
  nginx:
    image: nginx
    restart: always
    container_name: nginx
    depends_on:
      - ghost
    links:
      - ghost
    ports:
      - "80:80"
      - "443:443"
    volumes:
       - ./nginx/nginx.conf:/etc/nginx/nginx.conf
       - ./nginx/conf.d:/etc/nginx/conf.d
       - ./nginx/letsencrypt:/etc/letsencrypt
    network_mode: bridge

यदि आप एक विशेष नेटवर्क पुल निर्दिष्ट नहीं करते हैं, तो वे सभी एक ही डिफ़ॉल्ट का उपयोग करेंगे।


1

पहली नज़र में, मुझे याद आया, कि मेरी "वेब" सेवा वास्तव में शुरू नहीं हुई थी, इसीलिए नग्नेक्स को कोई होस्ट नहीं मिला

web_1    | python3: can't open file '/var/www/app/app/app.py': [Errno 2] No such file or directory
web_1 exited with code 2
nginx_1  | [emerg] 1#1: host not found in upstream "web:4044" in /etc/nginx/conf.d/nginx.conf:2

हे मैं एक ही समस्या हो रही है। मेरा आवेदन नहीं चल रहा है इसलिए मुझे वही त्रुटि मिल रही है। मैंने app.ini में uwsgi-file को run.py के रूप में रखा है, जिसे ऐप चलाना चाहिए था लेकिन ऐसा नहीं हो रहा है
isrj5

0

लिंक के साथ कंटेनर स्टार्टअप को लागू करने का आदेश है। लिंक के बिना कंटेनर किसी भी क्रम में शुरू हो सकते हैं (या वास्तव में सभी एक बार में)।

मुझे लगता है कि पुराने सेटअप एक ही मुद्दे को हिट कर सकते थे, अगर waapi_php_1कंटेनर स्टार्टअप के लिए धीमा था।

मुझे लगता है कि यह काम कर रहा है, आप एक नगीनेक्स एंट्रीपॉइंट स्क्रिप्ट बना सकते हैं जो पीएचपी कंटेनर को शुरू करने और तैयार करने के लिए चुनाव और प्रतीक्षा करता है।

मुझे यकीन नहीं है कि अगर नग्नेक्स के पास अपस्ट्रीम से कनेक्शन को स्वचालित रूप से पुनः प्राप्त करने का कोई तरीका है, लेकिन अगर ऐसा होता है, तो यह एक बेहतर विकल्प होगा।


और मैं मतदान कैसे करूं?
अत्तिला सेसेरेमी

0

अपने बैकएंड के उठने पर आपको गतिशील रूप से nginx कॉन्फ़िगरेशन को अपडेट करने के लिए docker-gen जैसे कुछ का उपयोग करना होगा।

देख:

मेरा मानना ​​है कि नग्नेक्स + (प्रीमियम संस्करण) में एक रिज़ॉल्यूशन पैरामीटर भी होता है ( http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream )


0

लिंक करने वाले कंटेनरों से बचने के लिए शायद सबसे अच्छा विकल्प डॉकटर नेटवर्किंग विशेषताएं हैं

लेकिन इस काम को करने के लिए, डॉकटर प्रत्येक कंटेनर के लिए / etc / मेजबानों में प्रत्येक कंटेनर के लिए नामित नामों से प्रविष्टियाँ बनाता है ।

docker-compose के साथ --x-नेटवर्किंग -अप कुछ ऐसा है जैसे [docker_compose_folder] - [सर्विस] - [incremental_number]

इन नामों में अप्रत्याशित परिवर्तन पर निर्भर नहीं करने के लिए आपको पैरामीटर का उपयोग करना चाहिए

container_name

आपके docker-compose.yml में निम्नानुसार है:

php:
      container_name: waapi_php_1
      build: config/docker/php
      ports:
        - "42022:22"
      volumes:
        - .:/var/www/html
      env_file: config/docker/php/.env.development

यह सुनिश्चित करना कि यह इस सेवा के लिए आपकी कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट नाम है। मुझे पूरा यकीन है कि ऐसा करने के लिए बेहतर तरीके हैं, लेकिन यह शुरू करने के लिए एक अच्छा तरीका है।


0

मेरा समाधान (बहुत परीक्षण और त्रुटि के बाद):

  • इस समस्या को हल करने के लिए, मुझे 'अपस्ट्रीम' डॉकटर कंटेनर का पूरा नाम प्राप्त करना था , जो कि अपस्ट्रीम कंटेनर docker network inspect my-special-docker-networkकी पूरी nameसंपत्ति को चलाने और प्राप्त करने से मिलता है :

    "Containers": {
         "39ad8199184f34585b556d7480dd47de965bc7b38ac03fc0746992f39afac338": {
              "Name": "my_upstream_container_name_1_2478f2b3aca0",
    
  • फिर संपत्ति my-network.local.confके locationब्लॉक में NGINX फ़ाइल में इसका इस्तेमाल किया proxy_pass: (कंटेनर नाम में GUID के अलावा पर ध्यान दें):

    location / {
        proxy_pass http://my_upsteam_container_name_1_2478f2b3aca0:3000;
    

पहले काम करने का विरोध किया, लेकिन अब टूट गया:

    location / {
        proxy_pass http://my_upstream_container_name_1:3000

अधिकांश संभावित कारण डॉकटर कम्पोज़ के लिए हाल ही में परिवर्तन है, कंटेनरों के लिए उनकी डिफ़ॉल्ट नामकरण योजना में, जैसा कि यहां सूचीबद्ध है

यह मेरे और मेरी टीम के लिए काम पर लगता है, डॉकर nginxछवि के नवीनतम संस्करणों के साथ :

  • मैंने उनके साथ डॉकटर पर मुद्दों को खोला है / यहाँ GitHub की रचना की है

0

(nginx में नया) मेरे मामले में यह गलत फ़ोल्डर नाम था

विन्यास के लिए

upstream serv {
    server ex2_app_1:3000;
}

सुनिश्चित करें कि ऐप फ़ोल्डर ex2 फ़ोल्डर में है:

ex2 / ऐप्स / ...


0

यह त्रुटि मुझे दिखाई दी क्योंकि मेरी php-fpmछवि सक्षम है cron, और मुझे पता नहीं क्यों


0

मेरी समस्या यह थी कि मैं php-fpm में docker-compose.yml में नेटवर्क उपनाम निर्दिष्ट करना भूल गया था

    networks:
      - u-online

यह अच्छी तरह से काम करता है!

version: "3"
services:

  php-fpm:
    image: php:7.2-fpm
    container_name: php-fpm
    volumes:           
      - ./src:/var/www/basic/public_html
    ports:
      - 9000:9000
    networks:
      - u-online
      
  nginx: 
    image: nginx:1.19.2
    container_name: nginx   
    depends_on:
      - php-fpm       
    ports:
      - "80:8080"
      - "443:443"
    volumes:
      - ./docker/data/etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ./docker/data/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./src:/var/www/basic/public_html
    networks:
      - u-online

#Docker Networks
networks:
  u-online:
    driver: bridge

-1

जोड़े लिंक आपके nginx कंटेनर विन्यास के खंड।

आपको phpकंटेनर को कंटेनर को दिखाई देना होगा nginx

nginx:
  image: nginx
  ports:
    - "42080:80"
  volumes:
    - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
  links:
    - php:waapi_php_1

1
मुझे लिंक के बारे में पता है, हालांकि डॉकर ने उन्हें संस्करण 1.9 में पदावनत कर दिया, जो डोकर के नेटवर्किंग का उपयोग करने के पक्ष में एक सप्ताह पहले आया था। मैं एक ऐसा समाधान चाहूंगा जो इसका उपयोग करता हो, आंशिक रूप से क्योंकि लिंक में एक मुद्दा है जो कि नेटवर्किंग को जोड़ने वाला परिपत्र नहीं होना चाहिए।
अत्तिला सेसेरेमी

1
में CHANGELOG.md मैं नहीं दिख रहा है linkबहिष्कृत किया जा रहा। क्या मैं कुछ भूल रहा हूँ?
नेसूनो

मैंने यह नहीं देखा कि वहाँ भी; हालाँकि जब मैं docker-compose --x-networking upअपने में परिभाषित लिंक्स के साथ दौड़ता हूँ docker-compose.yml, मुझे यह स्पष्ट चेतावनी मिलती है:WARNING: "nginx" defines links, which are not compatible with Docker networking and will be ignored. Future versions of Docker will not support links - you should remove them for forwards-compatibility.
अत्तिला सेसेरेमी

ठीक है, मैंने पाया कि वंचन कहाँ है। एकमात्र विचार मेरे पास है: क्या आप docker-compose.ymlएक फ़ोल्डर में फ़ाइल है जिसका नाम है waapi?
नेसूनो

हां, यह एक फ़ोल्डर में है जिसका नाम हैwaapi
अत्तिला सेसेरेमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.