Docker Networking - nginx: [acil] ana bilgisayar yukarı akışta bulunamadı


99

Bağlantıları kullanmak için yakın zamanda Docker 1.9 ve Docker-Compose 1.5'in ağ özelliklerine geçiş yapmaya başladım.

Şimdiye kadar bağlantılarla ilgili olarak, docker-compose aracılığıyla bir grupta farklı bir sunucuda bulunan php5-fpm fastcgi sunucuma bağlanan nginx ile ilgili herhangi bir sorun yoktu. Yeni olsa da docker-compose --x-networking upphp-fpm, mongo ve nginx kapsayıcılarımı çalıştırdığımda yeniden başlatılıyor, ancak nginx[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16

Bununla birlikte, php ve mongo kapsayıcıları çalışırken (nginx'ten çıkarken) docker-compose komutunu tekrar çalıştırırsam, nginx başlar ve bundan sonra iyi çalışır.

Bu benim docker-compose.ymldosyam:

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

Bu benim default.confiçin 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;
    }
}

Nginx'in yalnızca tek bir docker-compose çağrısıyla çalışmasını nasıl sağlayabilirim?


3
Ben de bununla karşılaşıyorum. Oluşturma dosyasında bir hata mı yoksa docker ağının kendisiyle ilgili bir hata mı emin değilim.
jrdn

Yanıtlar:


26

Bağımlılık özelliği (aşağıda tartışılmıştır) tanıtılıncaya kadar "volumes_from" öğesini geçici çözüm olarak kullanma olasılığı vardır. Tek yapmanız gereken docker-compose dosyanızı aşağıdaki gibi değiştirmek:

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

Yukarıdaki yaklaşımdaki büyük bir uyarı, php hacimlerinin istenilmeyen nginx'e maruz kalmasıdır. Ancak şu anda bu, kullanılabilecek liman işçisine özgü bir çözümdür.

Bağımlılık özelliği Bu muhtemelen fütüristik bir cevap olabilir. İşlevsellik henüz Docker'da uygulanmadığından (1.9'dan itibaren)

Docker tarafından sunulan yeni ağ oluşturma özelliğinde "bağımlı_on" u tanıtmak için bir öneri var. Ancak aynı @ https://github.com/docker/compose/issues/374 hakkında uzun süredir devam eden bir tartışma var. Bu nedenle, bir kez uygulandığında, bağımlı_on özelliği konteyner başlatma siparişi için kullanılabilir, ancak şu anda aşağıdakilerden birine başvurmanız gerekir:

  1. php sunucusu çalışana kadar nginx'i yeniden deneyin - bunu tercih ederim
  2. volums_from geçici çözümünü yukarıda açıklandığı gibi kullanın - Gereksiz kaplara hacim sızıntısı nedeniyle bunu kullanmaktan kaçınırım.

3
Bu benim için düzeltmedi.
Gijs

@Gijs, davanızın tam olarak ne olduğunu ve neyin işe yaramadığını yayınlayabilirseniz, birisi foruma yardımcı olabilir.
Phani

4
volumes_from kullanımdan kaldırıldı
Roma Rush

Bununla birlikte Azure App Service Docker Compose'da (önizleme) bir sorunla karşılaştım. Ayrıca links:nginx'e dahil ettiğim herhangi birinin - my-service:my-servicebu örnekte olduğu gibi hizmetin kendisiyle aynı adı kullandığından emin olmalıydım - mongo:mongo.
greg

29

Bu, şu depends_onanda uygulandığından (2016) söz konusu direktif ile çözülebilir :

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

Başarıyla test edildi:

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

Belgelerde daha fazla ayrıntı bulun .

Ayrıca bu konuya adanmış çok ilginç bir makale var: Oluşturma'da başlangıç ​​sırasını kontrol etme


12

Nginx'in max_fails ve fail_timeout yönergelerini, nginx'in, yukarı akış sunucusunun kullanılamaması durumunda başarısız olmadan önce kapsayıcıya x sayıda bağlantı isteğini yeniden denemesi gerektiğini belirtecek şekilde ayarlayabilirsiniz.

Bu iki sayıyı altyapınıza ve tüm kurulumun gerçekleştiği hıza göre ayarlayabilirsiniz. Aşağıdaki URL'nin sağlık kontrolleri bölümü hakkında daha fazla ayrıntı okuyabilirsiniz: http://nginx.org/en/docs/http/load_balancing.html

Http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server'dan alıntı aşağıda verilmiştir. max_fails=number

fail_timeout parametresi tarafından belirlenen süre içinde gerçekleşmesi gereken başarısız iletişim girişimlerinin sayısını, fail_timeout parametresi tarafından da belirlenen bir süre boyunca sunucunun kullanılamaz olduğunu düşünmek için ayarlar. Varsayılan olarak, başarısız denemelerin sayısı 1 olarak ayarlanmıştır. Sıfır değeri, denemelerin muhasebeleştirilmesini devre dışı bırakır. Başarısız bir girişim olarak kabul edilen şey, proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream ve memcached_next_upstream yönergeleri tarafından tanımlanır.

fail_timeout=time

sunucunun kullanılamaz olarak kabul edilmesi için sunucuyla belirtilen sayıda başarısız iletişim girişiminin gerçekleşmesi gereken süreyi ayarlar; ve sunucunun kullanılamaz olarak değerlendirileceği süre. Varsayılan olarak, parametre 10 saniyeye ayarlanmıştır.

Kesin olarak değiştirilmiş nginx yapılandırma dosyanız aşağıdaki gibi olmalıdır (bu komut dosyası tüm kapsayıcıların en az 25 saniye açık olduğunu varsayar, değilse, lütfen fail_timeout veya max_fails değerlerini aşağıdaki yukarı akış bölümünde değiştirin): Not: Yapmadım Senaryoyu kendim test edin, böylece deneyebilirsiniz!

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;
    }
}

Ayrıca, docker'dan gelen aşağıdaki Nota göre ( https://github.com/docker/docker.github.io/blob/master/compose/networking.md#update-containers ), kontrol için yeniden deneme mantığının olduğu açıktır. diğer konteynerlerin sağlığı liman işletmecisinin sorumluluğu değildir ve konteynırlar sağlık kontrolünü kendileri yapmalıdır.

Kapsayıcıları güncelleme

Bir hizmette bir yapılandırma değişikliği yaparsanız ve onu güncellemek için docker-compose'u çalıştırırsanız, eski kapsayıcı kaldırılır ve yenisi ağa farklı bir IP adresi altında ancak aynı adla katılır. Çalışan kapsayıcılar bu adı arayabilir ve yeni adrese bağlanabilir, ancak eski adres çalışmayı durdurur.

Herhangi bir konteynerin eski konteynere açık bağlantıları varsa, bunlar kapatılacaktır. Bu durumu tespit etmek, adı tekrar aramak ve yeniden bağlanmak konteynerin sorumluluğundadır.


3
Bu işe yaramayacak. nginx belgelerinde bu bölümün sonundaki uyarıyı okuyun: "Bir grupta sadece tek bir sunucu varsa, max_fails, fail_timeout ve slow_start parametreleri göz ardı edilir ve böyle bir sunucu asla kullanılamaz olarak değerlendirilmez."
Ferguzz

1
@Ferguzz bu güzel bir yakalaydı. Geçici bir çözüm olarak, aynı kapsayıcıdan bir grup oluşturmak için aynı kapsayıcıya iki takma ad girişi ekleyebilirsiniz.
Phani

Alternatif bir çözüm olarak, aynı soruda kapları bağlamak ve diğer kaplar yüklenene kadar bekletmek için "volumes_from" kullanın. Bu benim için çalışıyor.
Phani

7

Nginx'in Docker resolver'ı (127.0.0.11) hesaba katmadığına inanıyorum, bu yüzden lütfen eklemeyi deneyebilir misiniz:

resolver 127.0.0.11

nginx yapılandırma dosyanızda?


Gibi birden çok çözümleyici ekleresolver 127.0.0.11 8.8.8.8;
Leonardo Chaia

1
Hayır, belgelerde belirtildiği gibi sıralı olarak sorgulayacağı için: Ad sunucuları, sıralı bir şekilde sorgulanır.
dalore

6

Eğer bu kadar kaybettiyseniz, son yorumu okuyun. Başka bir çözüme ulaştım.

Ana sorun, servis isimlerini isimlendirme şeklinizdir.

Bu durumda, eğer sizin içinde docker-compose.ymlphp hizmeti "api" veya buna benzer bir şey olarak adlandırılıyorsa, dosyada nginx.confile başlayan satırın fastcgi_passphp hizmeti ile aynı ada sahip olduğundan emin olmalısınız . yanifastcgi_pass api:9000;


3

Aynı sorunu yaşadım çünkü benimde tanımlanmış iki ağ vardı docker-compose.yml: bir arka uç ve bir ön uç.
Bunu aynı varsayılan ağda kapsayıcıları çalıştıracak şekilde değiştirdiğimde her şey düzgün çalışmaya başladı.


Bu bir cevap olmaktan çok uzak.
dargmuesli

2

Aynı sorunu yaşadım ve çözdüm. Lütfen docker-compose.yml nginx bölümüne aşağıdaki satırı ekleyin:

links:
  - php:waapi_php_1

Nginx config fastcgi_pass bölümündeki host docker-compose.yml nginx konfigürasyonuna bağlanmalıdır.


1

Söylemeye değer iki şey:

  • Aynı ağ köprüsünü kullanma
  • linksAna bilgisayar çözümü eklemek için kullanma

Örneğim:

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

Özel bir ağ köprüsü belirtmezseniz, tümü aynı varsayılan köprüyü kullanacaktır.


1

İlk bakışta, "web" hizmetimin aslında başlamadığını kaçırdım, bu yüzden nginx herhangi bir ana bilgisayar bulamadı

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

hey ben de aynı sorunu yaşıyorum Uygulamam çalışmıyor, bu yüzden aynı hatayı alıyorum. uwsgi-file'ı app.ini'ye run.py olarak koydum, bu uygulamayı çalıştırmalı ama olmuyor
isrj5

0

Bağlantılarda, zorunlu hale getirilen bir kapsayıcı başlatma sırası vardır. Bağlantılar olmadan kaplar herhangi bir sırayla (veya gerçekten hepsi aynı anda) başlayabilir.

waapi_php_1Konteynır yavaş başlamışsa , eski kurulumun aynı sorunu çözebileceğini düşünüyorum.

Bence onu çalıştırmak için, php konteynerinin başlatılıp hazır olmasını sorgulayan ve bekleyen bir nginx giriş noktası betiği oluşturabilirsiniz.

Nginx'in yukarı akışla bağlantıyı otomatik olarak yeniden denemek için herhangi bir yolu olup olmadığından emin değilim, ancak varsa, bu daha iyi bir seçenek olacaktır.


Nasıl yoklama yaparım?
Attila Szeremi


0

Kapsayıcılarla ilgili sorunları önlemek için belki de en iyi seçenek docker ağları özellikleridir

Ancak bunun çalışması için docker, her bir kapsayıcıya atanan adlardan her kapsayıcı için / etc / hosts içinde girdiler oluşturur .

docker-compose ile --x-networking -up, [docker_compose_folder] - [hizmet] - [artan_sayı] gibi bir şeydir

Bu isimlerdeki beklenmedik değişikliklere bağlı olmamak için parametreyi kullanmalısınız

kapsayıcı_adı

docker-compose.yml dosyanızda aşağıdaki gibi:

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

Bu hizmet için yapılandırma dosyanızda atanan adın aynı olduğundan emin olun. Bunu yapmanın daha iyi yolları olduğundan oldukça eminim, ancak başlamak için iyi bir yaklaşım.


0

Çözümüm (çok sayıda deneme yanılmadan sonra):

  • Bu sorunu aşmak için , yukarı akış kapsayıcısının tam özelliğini çalıştırarak ve alarak bulunan 'yukarı akış' Docker kapsayıcısının tam adını almam gerekiyordu :docker network inspect my-special-docker-networkname

    "Containers": {
         "39ad8199184f34585b556d7480dd47de965bc7b38ac03fc0746992f39afac338": {
              "Name": "my_upstream_container_name_1_2478f2b3aca0",
    
  • Daha sonra bunu , özellik bloğundaki NGINX my-network.local.confdosyasında kullandık : ( GUID'in konteyner adına eklendiğine dikkat edin):locationproxy_pass

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

Daha önce çalışan, ancak şimdi bozuk olanın aksine:

    location / {
        proxy_pass http://my_upstream_container_name_1:3000

Bunun en olası nedeni, burada listelendiği gibi kapsayıcılar için varsayılan adlandırma şemasında Docker Compose'da yapılan son değişikliktir .

Docker nginxgörüntüsünün en son sürümleriyle birlikte, işte bu benim ve ekibim için gerçekleşiyor gibi görünüyor :


0

(nginx'e yeni) Benim durumumda klasör adı yanlıştı

Yapılandırma için

upstream serv {
    server ex2_app_1:3000;
}

uygulama klasörünün ex2 klasöründe olduğundan emin olun:

ex2 / uygulama / ...


0

bu hata bana göründü çünkü php-fpmresmim etkinleştirildi cronve neden olduğuna dair hiçbir fikrim yok


0

Benim sorunum php- fpm'de docker-compose.yml'de ağ takma adını belirtmeyi unutmamdı.

    networks:
      - u-online

İyi çalışıyor!

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

Ekle bağlantılar senin nginx konteyner yapılandırmasına bölümü.

phpKonteyneri konteynere görünür hale getirmelisiniz 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
Bağlantıları biliyorum, ancak Docker, Docker ağını kullanmak için bir hafta önce çıkan 1.9 sürümünde kullanımdan kaldırıldı. Bunu kullanan bir çözüm istiyorum, çünkü kısmen bağlantıların, ağda olmaması gereken dairesel bağlantıyla ilgili bir sorunu var.
Attila Szeremi

1
In CHANGELOG.md görmüyorum linkkaldırılmasına karar verildi. Bir şey mi kaçırıyorum?
nessuno

Ben de orada görmedim; ancak bende docker-compose --x-networking uptanımlanan bağlantılarla çalıştırdığımda docker-compose.ymlşu açık uyarıyı 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.
alıyorum

Tamam , kullanımdan kaldırmanın nerede olduğunu buldum . Sahip olduğum tek fikir şu: docker-compose.ymladlı bir klasörde dosya waapimısınız?
nessuno

Evet, adında bir klasördewaapi
Attila Szeremi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.