Perbarui II
Sekarang tanggal 16 Juli 2015 dan banyak hal telah berubah lagi. Saya telah menemukan wadah automagical ini dari Jason Wilder :
https://github.com/jwilder/nginx-proxy
dan ini memecahkan masalah ini selama yang dibutuhkan untukdocker run
wadah tersebut. Sekarang ini adalah solusi yang saya gunakan untuk mengatasi masalah ini.
Memperbarui
Sekarang Juli 2015 dan banyak hal telah berubah secara drastis sehubungan dengan wadah jaringan Docker. Sekarang ada banyak persembahan berbeda yang memecahkan masalah ini (dengan berbagai cara).
Anda harus menggunakan posting ini untuk mendapatkan pemahaman dasar tentang
docker --link
pendekatan penemuan layanan, yang sama mendasarnya dengan yang didapat, berfungsi dengan sangat baik, dan sebenarnya tidak membutuhkan tarian mewah daripada kebanyakan solusi lainnya. Terbatas karena cukup sulit untuk menempatkan wadah jaringan pada host terpisah dalam kluster mana pun, dan wadah tidak dapat dimulai ulang setelah terhubung ke jaringan, tetapi menawarkan cara yang cepat dan relatif mudah untuk wadah jaringan pada host yang sama. Ini adalah cara yang baik untuk mendapatkan gambaran tentang perangkat lunak apa yang kemungkinan akan Anda gunakan untuk mengatasi masalah ini sebenarnya dilakukan di bawah tenda.Selain itu, Anda mungkin juga ingin melihat Docker yang baru lahir
network
, Hashicorpconsul
, Weaveworksweave
, Jeff Lindsay'sprogrium/consul
&gliderlabs/registrator
, dan GoogleKubernetes
.Ada juga CoreOS korban yang memanfaatkan
etcd
,fleet
danflannel
.Dan jika Anda benar-benar ingin mengadakan pesta, Anda dapat menjalankan cluster untuk dijalankan
Mesosphere
, atauDeis
, atauFlynn
.Jika Anda baru mengenal jaringan (seperti saya) maka Anda harus mengeluarkan kacamata baca Anda, klik "Paint The Sky With Stars - The Best of Enya" di Wi-Hi-Fi, dan minum bir - itu akan menjadi beberapa saat sebelum Anda benar-benar memahami dengan tepat apa yang Anda coba lakukan. Petunjuk: Anda mencoba menerapkan a
Service Discovery Layer
diCluster Control Plane
. Ini cara yang sangat menyenangkan untuk menghabiskan Sabtu malam.Ini sangat menyenangkan, tapi saya berharap saya telah meluangkan waktu untuk mendidik diri saya lebih baik tentang jaringan secara umum sebelum menyelam langsung. Saya akhirnya menemukan beberapa posting dari dewa Tutorial Laut Digital yang baik hati:
Introduction to Networking Terminology
danUnderstanding ... Networking
. Saya sarankan untuk membacanya beberapa kali terlebih dahulu sebelum menyelam.Selamat bersenang-senang!
Posting Asli
Saya tidak dapat memahami pemetaan port untuk Docker
kontainer. Secara khusus cara meneruskan permintaan dari Nginx ke container lain, mendengarkan di port lain, di server yang sama.
Saya punya Dockerfile untuk container Nginx seperti ini:
FROM ubuntu:14.04
MAINTAINER Me <[email protected]>
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"]
Dan kemudian api.myapp.com
file konfigurasi terlihat seperti ini:
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;
}
}
Dan satu lagi untuk app.myapp.com
juga.
Dan kemudian saya menjalankan:
sudo docker run -p 80:80 -p 443:443 -d --name Nginx myusername/nginx
Dan semuanya berdiri dengan baik, tetapi permintaan tidak diteruskan ke kontainer / port lain. Dan ketika saya ssh ke wadah Nginx dan memeriksa log, saya tidak melihat kesalahan.
Ada bantuan?
Jawaban:
Jawaban @ T0xicCode benar, tetapi saya pikir saya akan memperluas detailnya karena sebenarnya saya membutuhkan waktu sekitar 20 jam untuk akhirnya mendapatkan solusi yang berfungsi.
Jika Anda ingin menjalankan Nginx dalam wadahnya sendiri dan menggunakannya sebagai reverse proxy untuk menyeimbangkan beberapa aplikasi di server yang sama, maka langkah-langkah yang perlu Anda ikuti adalah:
Tautkan Penampung Anda
Saat Anda
docker run
menggunakan container, biasanya dengan memasukkan skrip shell keUser Data
, Anda dapat mendeklarasikan link ke container lain yang sedang berjalan . Ini berarti Anda perlu memulai penampung Anda secara berurutan dan hanya penampung terakhir yang dapat ditautkan ke penampung sebelumnya. Seperti:Jadi dalam contoh ini,
API
penampung tidak ditautkan ke yang lain, tetapiApp
penampung ditautkan keAPI
danNginx
ditautkan keAPI
danApp
.Hasilnya adalah perubahan pada
env
vars dan/etc/hosts
file yang berada di dalam containerAPI
danApp
. Hasilnya terlihat seperti ini:/ etc / hosts
Menjalankan
cat /etc/hosts
dalamNginx
wadah Anda akan menghasilkan yang berikut:ENV Vars
Menjalankan
env
dalamNginx
wadah Anda akan menghasilkan yang berikut:Saya telah memotong banyak vars yang sebenarnya, tetapi di atas adalah nilai kunci yang Anda perlukan untuk membuat proxy lalu lintas ke penampung Anda.
Untuk mendapatkan shell untuk menjalankan perintah di atas dalam container yang sedang berjalan, gunakan yang berikut ini:
sudo docker exec -i -t Nginx bash
Anda dapat melihat bahwa Anda sekarang memiliki
/etc/hosts
entri file danenv
vars yang berisi alamat IP lokal untuk salah satu wadah yang ditautkan. Sejauh yang saya tahu, ini semua yang terjadi ketika Anda menjalankan container dengan opsi tautan yang dinyatakan. Namun sekarang Anda dapat menggunakan informasi ini untuk mengonfigurasinginx
dalamNginx
penampung Anda .Konfigurasi Nginx
Di sinilah menjadi sedikit rumit, dan ada beberapa opsi. Anda dapat memilih untuk mengkonfigurasi situs Anda agar mengarah ke entri dalam
/etc/hosts
file yangdocker
dibuat, atau Anda dapat menggunakanENV
vars dan menjalankan penggantian string (saya gunakansed
) padanginx.conf
file conf Anda dan file conf lainnya yang mungkin ada di/etc/nginx/sites-enabled
folder Anda untuk memasukkan IP nilai-nilai.OPSI A: Konfigurasi Nginx Menggunakan ENV Vars
Perbedaan utama antara opsi ini dan menggunakan
/etc/hosts
opsi file adalah bagaimana Anda menulisDockerfile
untuk menggunakan skrip shell sebagaiCMD
argumen, yang pada gilirannya menangani penggantian string untuk menyalin nilai IP dariENV
ke file conf Anda.Berikut kumpulan file konfigurasi yang saya dapatkan:
Dockerfile
nginx.conf
api.myapp.conf
Nginx-Startup.sh
Saya akan menyerahkan kepada Anda untuk mengerjakan pekerjaan rumah Anda tentang sebagian besar konten
nginx.conf
danapi.myapp.conf
.Keajaiban terjadi di
Nginx-Startup.sh
tempat kami menggunakansed
untuk melakukan penggantian string padaAPP_IP
placeholder yang telah kami tulis ke dalamupstream
blokapi.myapp.conf
danapp.myapp.conf
file kami.Pertanyaan ask.ubuntu.com ini menjelaskannya dengan sangat baik: Temukan dan ganti teks di dalam file menggunakan perintah
Jadi buruh pelabuhan telah meluncurkan penampung kami dan memicu
Nginx-Startup.sh
skrip untuk dijalankan, yang telah digunakansed
untuk mengubah nilaiAPP_IP
keENV
variabel terkait yang kami berikan dised
perintah. Kami sekarang memiliki file conf dalam/etc/nginx/sites-enabled
direktori kami yang memiliki alamat IP dariENV
vars yang ditetapkan oleh pekerja galangan saat memulai penampung. Di dalamapi.myapp.conf
file Anda, Anda akan melihatupstream
blok telah berubah menjadi ini:Alamat IP yang Anda lihat mungkin berbeda, tetapi saya memerhatikan biasanya
172.0.0.x
.Anda sekarang harus memiliki semua perutean dengan benar.
OPSI B: Gunakan
/etc/hosts
Entri FileIni seharusnya menjadi cara yang lebih cepat dan mudah untuk melakukan ini, tetapi saya tidak bisa membuatnya bekerja. Seolah-olah Anda hanya memasukkan nilai
/etc/hosts
entri ke dalam fileapi.myapp.conf
dan Andaapp.myapp.conf
, tetapi saya tidak dapat membuat metode ini berfungsi.Inilah upaya yang saya lakukan
api.myapp.conf
:Menimbang bahwa ada entri di
/etc/hosts
file saya seperti ini:172.0.0.2 API
Saya pikir itu hanya akan menarik nilainya, tetapi sepertinya tidak.Saya juga memiliki beberapa masalah tambahan dengan
Elastic Load Balancer
sumber saya dari semua AZ sehingga mungkin menjadi masalah ketika saya mencoba rute ini. Sebaliknya saya harus belajar bagaimana menangani penggantian string di Linux, jadi itu menyenangkan. Saya akan mencobanya sebentar dan melihat bagaimana kelanjutannya.sumber
Saya mencoba menggunakan proxy terbalik Jason Wilder yang populer yang secara ajaib kode bekerja untuk semua orang, dan mengetahui bahwa itu tidak bekerja untuk semua orang (yaitu: saya). Dan saya baru mengenal NGINX, dan tidak suka karena saya tidak mengerti teknologi yang saya coba gunakan.
Ingin menambahkan 2 sen saya, karena diskusi di atas seputar
linking
kontainer bersama sekarang sudah bertanggal karena ini adalah fitur yang tidak digunakan lagi. Berikut penjelasan cara melakukannya dengan menggunakannetworks
. Jawaban ini adalah contoh lengkap dari pengaturan nginx sebagai reverse proxy ke situs web yang dihalaman secara statis menggunakanDocker Compose
dan konfigurasi nginx.TL; DR;
Tambahkan layanan yang perlu berbicara satu sama lain ke jaringan yang telah ditentukan. Untuk diskusi langkah demi langkah tentang jaringan Docker, saya mempelajari beberapa hal di sini: https://technologyconversations.com/2016/04/25/docker-networking-and-dns-the-good-the-bad-and- Jelek/
Tentukan Jaringan
Pertama-tama, kami membutuhkan jaringan tempat semua layanan backend Anda dapat berkomunikasi. Saya menelepon milik saya
web
tetapi itu bisa menjadi apa pun yang Anda inginkan.Bangun Aplikasinya
Kami hanya akan membuat aplikasi situs web sederhana. Situs webnya adalah halaman index.html sederhana yang disajikan oleh wadah nginx. Konten adalah volume yang dipasang ke host di bawah folder
content
DockerFile:
default.conf
docker-compose.yml
Perhatikan bahwa kami tidak lagi memerlukan pemetaan port di sini. Kami hanya mengekspos port 80. Ini berguna untuk menghindari tabrakan port.
Jalankan Aplikasi
Aktifkan situs web ini dengan
Beberapa pemeriksaan menyenangkan terkait pemetaan dns untuk penampung Anda:
Ping ini seharusnya berfungsi, di dalam wadah Anda.
Bangun Proksi
Proksi Terbalik Nginx:
Dockerfile
Kami mengatur ulang semua konfigurasi host virtual, karena kami akan menyesuaikannya.
docker-compose.yml
Jalankan Proxy
Jalankan proxy menggunakan tepercaya kami
Dengan asumsi tidak ada masalah, maka Anda memiliki dua kontainer yang berjalan yang dapat saling berhubungan menggunakan namanya. Mari kita uji.
Siapkan Virtual Host
Detail terakhir adalah menyiapkan file hosting virtual sehingga proxy dapat mengarahkan lalu lintas berdasarkan cara apa pun Anda ingin menyiapkan pencocokan Anda:
sample-site.conf untuk konfigurasi hosting virtual kami:
Berdasarkan bagaimana proxy disiapkan, Anda memerlukan file ini disimpan di bawah
conf.d
folder lokal Anda yang kami pasang melaluivolumes
deklarasi didocker-compose
file.Last but not least, beri tahu nginx untuk memuat ulang konfigurasinya.
Urutan langkah-langkah ini adalah puncak dari jam-jam sakit kepala yang berdebar-debar saat saya berjuang dengan kesalahan Gateway Buruk 502 yang selalu menyakitkan, dan mempelajari nginx untuk pertama kalinya, karena sebagian besar pengalaman saya adalah dengan Apache.
Jawaban ini untuk mendemonstrasikan cara mematikan error 502 Bad Gateway yang diakibatkan oleh kontainer yang tidak dapat berkomunikasi satu sama lain.
Saya berharap jawaban ini menyelamatkan seseorang di luar sana berjam-jam kesakitan, karena mendapatkan wadah untuk berbicara satu sama lain sangat sulit untuk diketahui karena suatu alasan, meskipun itu yang saya harapkan menjadi kasus penggunaan yang jelas. Tapi sekali lagi, saya bodoh. Dan beri tahu saya bagaimana saya dapat meningkatkan pendekatan ini.
sumber
502 Gateway Error
, klasik terkenal hari ini. Terima kasih @gdbj telah meluangkan waktu untuk memajukan percakapan dan memberikan solusi yang begitu mendetail.Dengan menggunakan tautan buruh pelabuhan , Anda dapat menautkan penampung upstream ke penampung nginx. Fitur tambahan adalah buruh pelabuhan mengelola file host, yang berarti Anda akan dapat merujuk ke penampung tertaut menggunakan nama daripada ip yang berpotensi acak.
sumber
"Opsi B" AJB dapat dibuat untuk bekerja dengan menggunakan image dasar Ubuntu dan mengatur nginx sendiri. (Itu tidak berfungsi ketika saya menggunakan image Nginx dari Docker Hub.)
Berikut adalah file Docker yang saya gunakan:
Konfigurasi nginx saya (alias: conf / mysite.com):
Dan akhirnya, bagaimana saya memulai container saya:
Ini membuat saya aktif dan berjalan sehingga nginx saya mengarahkan ke upstream ke container buruh pelabuhan kedua yang mengekspos port 3000.
sumber
upstream website {
mendefinisikan nilai situs web untuk nginx. Itulah yang kemudian Anda gunakan dalam fileproxy_pass
. Bagian buruh pelabuhan ini hanya menggunakan nama yang sama untuk konsistensi, tetapi tidak ada hubungannya dengan pengaturan nginx. Untuk membuatnya lebih jelas, proxy pass harus membaca:upstream website { server localhost:3000; }
Jawaban @ gdbj adalah penjelasan yang bagus dan jawaban yang paling mutakhir. Namun inilah pendekatan yang lebih sederhana.
Jadi, jika Anda ingin mengalihkan semua lalu lintas dari nginx yang mendengarkan ke
80
penampung lain yang mengekspos8080
, konfigurasi minimum dapat sesedikit:nginx.conf:
docker-compose.yml
Dokumentasi Docker
sumber
Baru saja menemukan artikel dari Anand Mani Sankar yang menunjukkan cara sederhana menggunakan proxy upstream nginx dengan komposer buruh pelabuhan.
Pada dasarnya seseorang harus mengonfigurasi instance yang menghubungkan dan port di file docker-compose dan memperbarui upstream di nginx.conf yang sesuai.
sumber
links
yang sudah usang. Gunakan jaringan sekarang: docs.docker.com/engine/userguide/networking