Docker bağlantı noktası eşlemesi, Nginx'i yukarı akış proxy'si olarak kullanmak için nasıl yapılandırılır?


87

Güncelleme II

Şimdi 16 Temmuz 2015 ve işler tekrar değişti. Bu otomatik konteyneri Jason Wilder'dan keşfettim : https://github.com/jwilder/nginx-proxyve konteynere ulaştığı sürece bu sorunu çözüyor docker run. Şimdi bu sorunu çözmek için kullandığım çözüm bu.

Güncelleme

Şimdi Temmuz 2015 ve Docker kapsayıcılarının ağa bağlanması açısından işler büyük ölçüde değişti. Artık bu sorunu çözen birçok farklı teklif var (çeşitli şekillerde).

Bu docker --linkyazıyı, aldığı kadar temel olan, çok iyi çalışan ve aslında diğer çözümlerin çoğundan daha az fantezi dans gerektiren hizmet keşfi yaklaşımına ilişkin temel bir anlayış kazanmak için kullanmalısınız . Herhangi bir kümedeki ayrı ana bilgisayarlarda kapsayıcılar arasında ağ oluşturmanın oldukça zor olması ve kapsayıcıların ağ oluşturulduktan sonra yeniden başlatılamamasıyla sınırlıdır, ancak aynı ana bilgisayardaki kapsayıcılar için hızlı ve nispeten kolay bir yol sunar. Bu sorunu çözmek için kullanacağınız yazılımın aslında kaputun altında ne yaptığına dair bir fikir edinmenin iyi bir yolu.

Ek olarak, muhtemelen networkDocker'ın yeni doğmakta olan Hashicorp's consul, Weaveworks weave, Jeff Lindsay's progrium/consul&gliderlabs/registrator ve Google'lara da göz atmak isteyeceksiniz Kubernetes.

Orada da var CoreOS kullanan teklifleri etcd, fleetve flannel.

Ve gerçekten bir parti yapmak istiyorsanız, bir kümeyi çalıştırmak için döndürebilir Mesosphereveya Deisveya Flynn.

Ağ kurma konusunda yeniyseniz (benim gibi), okuma gözlüğünüzü çıkarmanız , Wi- Fi'da "Yıldızlarla Gökyüzünü Boyayın - Enya'nın En İyisi" ni açmanız ve bir bira içmeniz gerekir. tam olarak ne yapmaya çalıştığını tam olarak anlamadan bir süre önce. İpucu: Bir uygulamaya çalışıyoruz Service Discovery LayerGözlerinde farklı Cluster Control Plane. Cumartesi gecesini geçirmek için çok güzel bir yol.

Bu çok eğlenceli, ama keşke doğrudan dalmadan önce ağ kurma konusunda kendimi daha iyi eğitmek için zaman ayırsaydım. Sonunda hayırsever Dijital Okyanus Eğitimi tanrılarından birkaç gönderi buldum: Introduction to Networking Terminologyve Understanding ... Networking. Dalmadan önce bunları birkaç kez okumanızı öneririm.

İyi eğlenceler!



Orijinal Gönderi

DockerKapsayıcılar için bağlantı noktası eşleştirmesini anlayamıyorum. Özellikle, isteklerin Nginx'ten başka bir kapsayıcıya nasıl aktarılacağı, aynı sunucu üzerindeki başka bir bağlantı noktasında dinleme.

Bunun gibi bir Nginx kapsayıcısı için bir Dockerfile'ım var:

FROM ubuntu:14.04
MAINTAINER Me <me@myapp.com>

RUN apt-get update && apt-get install -y htop git nginx

ADD sites-enabled/api.myapp.com /etc/nginx/sites-enabled/api.myapp.com
ADD sites-enabled/app.myapp.com /etc/nginx/sites-enabled/app.myapp.com
ADD nginx.conf /etc/nginx/nginx.conf

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80 443

CMD ["service", "nginx", "start"]



Ve sonra api.myapp.comyapılandırma dosyası şöyle görünür:

upstream api_upstream{

    server 0.0.0.0:3333;

}


server {

    listen 80;
    server_name api.myapp.com;
    return 301 https://api.myapp.com/$request_uri;

}


server {

    listen 443;
    server_name api.mypp.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;

    }

}

Ve sonra da bir tane daha app.myapp.com.

Ve sonra koşuyorum:

sudo docker run -p 80:80 -p 443:443 -d --name Nginx myusername/nginx


Ve her şey gayet iyi, ancak istekler diğer konteynerlere / limanlara aktarılmıyor. Ve Nginx konteynerine ssh girdiğimde ve günlükleri incelediğimde hiçbir hata görmüyorum.

Herhangi bir yardım?


1
Lütfen cevap malzemesini sorunun gövdesine değil cevabınıza ekleyin.
jscs

Yanıtlar:


57

@ T0xicCode'un cevabı doğru, ancak nihayetinde bir çalışma çözümü uygulamaya koymam yaklaşık 20 saat sürdüğü için ayrıntıları genişleteceğimi düşündüm.

Nginx'i kendi kapsayıcısında çalıştırmak ve aynı sunucu örneğinde birden çok uygulamayı yüklemek için ters proxy olarak kullanmak istiyorsanız, izlemeniz gereken adımlar şu şekildedir:

Kapsayıcılarınızı Bağlayın

Ne zaman docker rungenellikle içine bir kabuk girerek Kaysayıcılar,User Data , başka bağlantılar ilan edebilir koşu kapları. Bu, konteynerlerinizi sırayla başlatmanız gerektiği ve yalnızca sonraki konteynerlerin birincilerine bağlanabileceği anlamına gelir. Şöyle:

#!/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

Dolayısıyla bu örnekte, APIkapsayıcı başka hiçbir şeye bağlı değil, ancak AppkapsayıcıAPINginx hem APIve hem de bağlantılı ve bağlantılı App.

Bunun sonucu, envdeğişkenlerde ve içinde bulunan /etc/hostsdosyalarda yapılan değişikliklerdir .API ve Appkapsayıcılarında . Sonuçlar şöyle görünüyor:

/ etc / hosts

Konteynırınızın cat /etc/hostsiçinde çalıştırmak Nginxaşağıdakileri üretir:

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 Vars

Konteynırınızın enviçinde çalıştırmak Nginxaşağıdakileri üretir:

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

Gerçek değişkenlerin çoğunu kısalttım, ancak yukarıdakiler, kapsayıcılarınıza trafik için proxy yapmanız gereken anahtar değerler.

Yukarıdaki komutları çalışan bir kap içinde çalıştıracak bir kabuk elde etmek için aşağıdakileri kullanın:

sudo docker exec -i -t Nginx bash

Artık bağlanan kapsayıcılardan herhangi biri için yerel IP adresini içeren hem /etc/hostsdosya girişlerine hem de envdeğişkenlere sahip olduğunuzu görebilirsiniz . Anladığım kadarıyla, bağlantı seçeneklerinin bildirildiği kapsayıcıları çalıştırdığınızda olanların hepsi bu. Ama şimdi yapılandırmak için bu bilgileri kullanabilirsiniz nginxsenin içinde Nginxkonteyner.



Nginx'i Yapılandırma

Burası biraz zorlaştığı yer ve birkaç seçenek var. Sitelerinizi /etc/hosts, dockeroluşturulan dosyadaki bir girişe işaret edecek şekilde yapılandırmayı seçebilir veya ENVdeğişkenleri kullanabilir ve sedsizin nginx.confve /etc/nginx/sites-enabledklasörünüzde bulunan diğer conf dosyalarında IP eklemek için değişkenleri kullanabilir ve bir dize değiştirme (kullandım ) çalıştırabilirsiniz. değerler.



SEÇENEK A: ENV Vars Kullanarak Nginx'i Yapılandırma

/etc/hostsÇalışmak için dosya seçeneğini alamadığım için kullandığım seçenek bu. Yakında Seçenek B'yi deneyeceğim ve bu yazıyı herhangi bir bulgu ile güncelleyeceğim.

Bu seçenek ile /etc/hostsdosya seçeneğini kullanmak arasındaki temel fark , Dockerfilebir kabuk komut dosyasını kullanmak için nasıl yazdığınızdır.CMD bağımsız değişken ;ENV conf dosyalarınıza .

İşte sonlandırdığım yapılandırma dosyaları kümesi:

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;


}

NOT: Kapsayıcınızın başlatıldıktan hemen sonra çıkmamasını sağlamak daemon off;için nginx.confdosyanıza eklemeniz önemlidir .

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

Ben içeriğinin en çok ödevini yapmak için bunu telafi bırakacağım nginx.confveapi.myapp.conf .

Sihirli olur Nginx-Startup.shkullandığımız nerede sedüzerindeki dize değiştirme yapmak APP_IPbiz içine yazdım o yer tutucu upstreamkızımız biraz bloğu api.myapp.confveapp.myapp.conf dosyalarımızın .

Bu ask.ubuntu.com sorusu bunu çok güzel açıklıyor: Komutları kullanarak bir dosya içindeki metni bulun ve değiştirin

GOTCHA OSX'te, sedseçenekleri farklı, -iözellikle bayrakla yönetir . Ubuntu'da -ibayrak, 'yerinde' değiştirme işlemini gerçekleştirecektir; dosyayı açacak, metni değiştirecek ve ardından aynı dosya üzerine 'kaydedecektir'. OSX'te -ibayrak , elde edilen dosyanın sahip olmasını istediğiniz dosya uzantısını gerektirir . Uzantısı olmayan bir dosyayla çalışıyorsanız, değer olarak '' girmelisiniz.-i bayrak .

GOTCHAsed Değiştirmek istediğiniz dizeyi bulmak için kullanan normal ifadede ENV değişkenlerini kullanmak için, varili çift ​​tırnak içine almanız gerekir. Yani doğru, kötü görünse de, sözdizimi yukarıdaki gibidir.

Bu yüzden docker, konteynerimizi başlattı ve komutta verdiğimiz karşılık gelen değişkene değeri değiştirmek için Nginx-Startup.shkullanılan betiğin çalışmasını tetikledi . Artık dizinimizde , kapsayıcıyı başlatırken docker'ın belirlediği değişkenlerden IP adreslerine sahip conf dosyalarımız var . Dosyanızın içinde bloğun şu şekilde değiştiğini göreceksiniz :sedAPP_IPENVsed/etc/nginx/sites-enabledENVapi.myapp.confupstream

upstream api_upstream{
    server 172.0.0.2:3000;
}

Gördüğünüz IP adresi farklı olabilir, ancak bunun genellikle olduğunu fark ettim 172.0.0.x.

Artık her şeyi uygun şekilde yönlendirmelisiniz.

GOTCHA İlk örnek başlatmayı çalıştırdıktan sonra herhangi bir kapsayıcıyı yeniden başlatamaz / yeniden çalıştıramazsınız. Docker, her konteynere başlatma sırasında yeni bir IP sağlar ve daha önce kullanılanları yeniden kullanmıyor gibi görünüyor. Böylece api.myapp.comilk seferde 172.0.0.2, bir dahaki sefere 172.0.0.4 olacak. Ancak Nginxilk IP'yi conf dosyalarına veya dosyalarına zaten ayarlamış olacak /etc/hosts, bu nedenle yeni IP'yi belirleyemeyecek api.myapp.com. Bunun çözümü , benim sınırlı anlayışıma göre, aynı kümeye kayıtlı tüm makineler için paylaşılan bir hizmet gibi davranacak CoreOSve etcdhizmetini kullanması muhtemeldir . Bu, kurarken oynayacağım bir sonraki oyuncak.ENVCoreOS



SEÇENEK B: /etc/hostsDosya Girişlerini Kullanın

Bunu yapmanın daha hızlı ve kolay yolu bu olmalı , ama işe yarayamamıştım. Görünüşe göre girişin değerini /etc/hostskendi api.myapp.confve app.myapp.confdosyalarınıza giriyorsunuz, ancak bu yöntemin işe yaramasını sağlayamadım.

GÜNCELLEME: Bu yöntemin nasıl çalışacağına dair talimatlar için @Wes Tod'un cevabına bakın .

İşte yaptığım girişim api.myapp.conf:

upstream api_upstream{
    server API:3000;
}

Dosyamda böyle bir giriş olduğunu düşünürsek /etc/hosts: 172.0.0.2 APISadece değeri çekeceğini düşündüm, ama öyle görünmüyor.

Ayrıca Elastic Load Balancertüm AZ'lerden kaynak almamla ilgili birkaç yardımcı sorunum vardı, bu yüzden bu rotayı denediğimde sorun olabilirdi. Bunun yerine Linux'ta dizeleri değiştirmeyi öğrenmem gerekiyordu, bu yüzden eğlenceliydi. Bunu bir süre sonra deneyeceğim ve nasıl gittiğini göreceğim.


2
Bağlantıları kullanarak başka bir sorun da, API kapsayıcısını yeniden başlatırsanız büyük olasılıkla yeni bir ip alacağıdır. Bu, eski ip'i kullanmaya devam edecek olan nginx container / etc / hosts dosyasına yansıtılmaz ve bu nedenle yeniden başlatılması gerekir.
judoole

13

Kodun sihirli bir şekilde herkes için işe yaradığı popüler Jason Wilder ters proxy'yi kullanmayı denedim ve bunun herkes için işe yaramadığını öğrendim (yani: ben). NGINX'te yepyeni biriyim ve kullanmaya çalıştığım teknolojileri anlamamış olmamdan hoşlanmadım.

2 sentimi eklemek istedim, çünkü yukarıdaki linkingkonteynırlarla ilgili tartışma , artık kullanımdan kaldırılmış bir özellik olduğu için tarihleniyor. İşte bunu kullanarak nasıl yapılacağına dair bir açıklama networks. Bu yanıt, Docker Composenginx yapılandırmasını ve nginx yapılandırmasını kullanarak statik sayfalı bir web sitesine ters proxy olarak ayarlamanın tam bir örneğidir .

TL; DR;

Önceden tanımlanmış bir ağa birbiriyle konuşması gereken hizmetleri ekleyin. Docker ağları hakkında adım adım bir tartışma için burada bazı şeyler öğrendim: https://technologyconversations.com/2016/04/25/docker-networking-and-dns-the-good-the-bad-and- çirkin/

Ağı Tanımlayın

Her şeyden önce, tüm arka uç hizmetlerinizin üzerinde konuşabileceği bir ağa ihtiyacımız var. Benimkini aradım webama ne istersen o olabilir.

docker network create web

Uygulamayı Oluşturun

Basit bir web sitesi uygulaması yapacağız. Web sitesi, bir nginx kapsayıcısı tarafından sunulan basit bir index.html sayfasıdır. İçerik, bir klasör altındaki ana bilgisayara bağlı bir birimdircontent

DockerFile:

FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf

default.conf

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

docker-compose.yml

version: "2"

networks:
  mynetwork:
    external:
      name: web

services:
  nginx:
    container_name: sample-site
    build: .
    expose:
      - "80"
    volumes:
      - "./content/:/var/www/html/"
    networks:
      default: {}
      mynetwork:
        aliases:
          - sample-site

Artık burada bağlantı noktası eşleştirmesine ihtiyacımız olmadığını unutmayın. Bağlantı noktası 80'i basitçe açığa çıkarıyoruz. Bu, bağlantı noktası çarpışmalarını önlemek için kullanışlıdır.

Uygulamayı çalıştırın

Bu web sitesini ateşle

docker-compose up -d

Konteynırınız için dns eşleştirmelerine ilişkin bazı eğlenceli kontroller:

docker exec -it sample-site bash
ping sample-site

Bu ping, kapsayıcınızın içinde çalışmalıdır.

Proxy Oluşturun

Nginx Ters Proxy:

Dockerfile

FROM nginx

RUN rm /etc/nginx/conf.d/*

Özelleştireceğimiz için tüm sanal ana bilgisayar yapılandırmasını sıfırlıyoruz.

docker-compose.yml

version: "2"

networks:
  mynetwork:
    external:
      name: web


services:
  nginx:
    container_name: nginx-proxy
    build: .
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./conf.d/:/etc/nginx/conf.d/:ro
      - ./sites/:/var/www/
    networks:
      default: {}
      mynetwork:
        aliases:
          - nginx-proxy

Proxy'yi çalıştırın

Güvenilir aracımızı kullanarak proxy'yi çalıştırın

docker-compose up -d

Herhangi bir sorun olmadığı varsayılırsa, kendi adlarını kullanarak birbirleriyle konuşabilen iki konteyneriniz var demektir. Hadi test edelim.

docker exec -it nginx-proxy bash
ping sample-site
ping nginx-proxy

Sanal Konak Kurun

Son ayrıntı, sanal barındırma dosyasını ayarlamaktır, böylece proxy, eşleştirmenizi nasıl ayarlamak istediğinize bağlı olarak trafiği yönlendirebilir:

sanal barındırma yapılandırmamız için sample-site.conf:

  server {
    listen 80;
    listen [::]:80;

    server_name my.domain.com;

    location / {
      proxy_pass http://sample-site;
    }

  }

Proxy'nin nasıl kurulduğuna conf.dbağlı volumesolarak, docker-composedosyadaki bildirim yoluyla eklediğimiz yerel klasörünüz altında depolanan bu dosyaya ihtiyacınız olacak .

Son olarak, nginx'e yapılandırmasını yeniden yüklemesini söyleyin.

docker exec nginx-proxy service nginx reload

Bu adımlar dizisi, sürekli acı veren 502 Bad Gateway hatasıyla mücadele ederken saatlerce süren baş ağrılarının doruk noktası ve ilk kez nginx öğreniyorum, çünkü deneyimimin çoğu Apache ile oldu.

Bu cevap, konteynerlerin birbiriyle konuşamamasından kaynaklanan 502 Bad Gateway hatasının nasıl ortadan kaldırılacağını göstermektir.

Umarım bu cevap, dışarıdaki birisini saatlerce acıdan kurtarır, çünkü açık bir kullanım durumu olmasını beklediğim gibi, kapları birbirleriyle konuşturmak bazı nedenlerden dolayı gerçekten zordu. Ama sonra tekrar, ben aptalım. Ve lütfen bu yaklaşımı nasıl geliştirebileceğimi bana bildirin.


Ah! Ole 502 Gateway Error, bugünlerde rezil bir klasik. Sohbeti ilerletmek ve böylesine ayrıntılı bir çözüm sağlamak için zaman ayırdığınız için @gdbj'ye teşekkürler.
AJB

Sadece bunun için zaman ayırdığınız için teşekkür etmek istedim, beni oldukça zor durumda bıraktı. Teşekkür ederim.
Single Entity

10

Docker bağlantılarını kullanarak , yukarı akış kabını nginx kapsayıcısına bağlayabilirsiniz. Ek bir özellik, docker'ın ana bilgisayar dosyasını yönetmesidir; bu, potansiyel olarak rastgele ip yerine bir ad kullanarak bağlantılı konteynere başvurabileceğiniz anlamına gelir.


7

AJB'nin "B Seçeneği" , temel Ubuntu görüntüsünü kullanarak ve nginx'i kendi başınıza kurarak çalışabilir hale getirilebilir. (Docker Hub'daki Nginx görüntüsünü kullandığımda işe yaramadı.)

İşte kullandığım Docker dosyası:

FROM ubuntu
RUN apt-get update && apt-get install -y nginx
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
RUN rm -rf /etc/nginx/sites-enabled/default
EXPOSE 80 443
COPY conf/mysite.com /etc/nginx/sites-enabled/mysite.com
CMD ["nginx", "-g", "daemon off;"]

Nginx yapılandırmam (aka: conf / mysite.com):

server {
    listen 80 default;
    server_name mysite.com;

    location / {
        proxy_pass http://website;
    }
}

upstream website {
    server website:3000;
}

Ve son olarak, kaplarıma nasıl başlarım:

$ docker run -dP --name website website
$ docker run -dP --name nginx --link website:website nginx

Bu beni kurup çalıştırdı, böylece nginx'im yukarı akışı 3000 numaralı bağlantı noktasını açığa çıkaran ikinci docker konteynerine yönlendirdi.


Yardımın için teşekkürler Wes! Tatilden döndüğümde bunu deneyeceğim.
AJB

Resmi görüntülerde bunun gibi birkaç sorun yaşadım. Ubuntu kutusunu temel alarak ve ardından docker dosyalarından satırları doğrudan çekmeyi çok daha iyi buldum. Bu gerekli olmamalı ama ne yazık ki ....
Wes Todd

1
Bu harika, ama anlamadığım şey nginx yapılandırmasının 'web sitesinin' değerini nasıl bildiği. Nginx büyüsü veya docker büyüsü veya başka bir şey?
Kyle Chadha

1
Satır upstream website {, nginx için web sitesi değerini tanımlar. Bu, daha sonra kendiproxy_pass . Bunun docker kısmı tutarlılık için aynı adı kullanıyor, ancak nginx kurulumuyla ilgisi yok. Biraz daha net hale getirmek için proxy geçişinde upstream website { server localhost:3000; }
Wes Todd

2
Bilginize En son resmi nginx görüntüsünü (1.9.2) kullanıyorum ve benim için çalışıyor gibi görünüyor. Yani belki sorunu çözdüler.
Pejvan

6

@ gdbj'nin cevabı harika bir açıklama ve en güncel cevaptır. Ancak burada daha basit bir yaklaşım var.

Dolayısıyla, nginx dinlemeden tüm trafiği 80açığa çıkan başka bir konteynere yönlendirmek istiyorsanız 8080, minimum yapılandırma şu kadar küçük olabilir:

nginx.conf:

server {
    listen 80;

    location / {
        proxy_pass http://client:8080; # this one here
        proxy_redirect off;
    }

}

docker-compose.yml

version: "2"
services:
  entrypoint:
    image: some-image-with-nginx
    ports:
      - "80:80"
    links:
      - client  # will use this one here

  client:
    image: some-image-with-api
    ports:
      - "8080:8080"

Docker belgeleri


İlk başta liman çarpışmasıyla ilgili sorunların olacağını düşündüm.
gdbj

@gdbj Sorunum konteynerler arasında url / ip çözümlemesiydi. Sanırım bizde de aynısı vardı. Senin durumunda da iyi çalışıyor ağları kullanırlar, benim durumumda ben sadece konteyner bağlantı
Diolor

Harika, tüm ihtiyacım olan bu! Cevabınız için teşekkürler.
Floran Gmehlin

2

Bir makale buldumDocker composer ile nginx upstream proxy kullanmanın basit bir yolunu gösteren Anand Mani Sankar'dan .

Temel olarak, docker-compose dosyasındaki örnek bağlantısını ve bağlantı noktalarını yapılandırmalı ve buna göre nginx.conf'da yukarı akışı güncellemelidir.


1
Makale links, kullanımdan kaldırılanları kullanır . Ağları şimdi kullanın: docs.docker.com/engine/userguide/networking
gdbj

Büyülü nginx conf substitution bu durumda da işe yarayacak mı?
Dormouse
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.