@ 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.