@ 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 run
genellikle 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, API
kapsayıcı başka hiçbir şeye bağlı değil, ancak
App
kapsayıcıAPI
Nginx
hem API
ve hem de bağlantılı ve bağlantılı App
.
Bunun sonucu, env
değişkenlerde ve içinde bulunan /etc/hosts
dosyalarda yapılan değişikliklerdir .API
ve App
kapsayıcılarında . Sonuçlar şöyle görünüyor:
/ etc / hosts
Konteynırınızın cat /etc/hosts
içinde çalıştırmak Nginx
aş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 env
içinde çalıştırmak Nginx
aş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/hosts
dosya girişlerine hem de env
değ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 nginx
senin içinde Nginx
konteyner.
Nginx'i Yapılandırma
Burası biraz zorlaştığı yer ve birkaç seçenek var. Sitelerinizi /etc/hosts
, docker
oluşturulan dosyadaki bir girişe işaret edecek şekilde yapılandırmayı seçebilir veya ENV
değişkenleri kullanabilir ve sed
sizin nginx.conf
ve /etc/nginx/sites-enabled
klasö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/hosts
dosya seçeneğini kullanmak arasındaki temel fark , Dockerfile
bir 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.conf
dosyanı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.conf
veapi.myapp.conf
.
Sihirli olur Nginx-Startup.sh
kullandığımız nerede sed
üzerindeki dize değiştirme yapmak APP_IP
biz içine yazdım o yer tutucu upstream
kızımız biraz bloğu api.myapp.conf
veapp.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, sed
seçenekleri farklı, -i
özellikle bayrakla yönetir . Ubuntu'da -i
bayrak, '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 -i
bayrak , 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.sh
kullanı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 :sed
APP_IP
ENV
sed
/etc/nginx/sites-enabled
ENV
api.myapp.conf
upstream
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.com
ilk seferde 172.0.0.2, bir dahaki sefere 172.0.0.4 olacak. Ancak Nginx
ilk 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 CoreOS
ve etcd
hizmetini kullanması muhtemeldir . Bu, kurarken oynayacağım bir sonraki oyuncak.ENV
CoreOS
SEÇENEK B: /etc/hosts
Dosya 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/hosts
kendi api.myapp.conf
ve app.myapp.conf
dosyaları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 API
Sadece değeri çekeceğini düşündüm, ama öyle görünmüyor.
Ayrıca Elastic Load Balancer
tü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.