Saya baru-baru ini mulai bermigrasi ke fitur jaringan Docker 1.9 dan Docker-Compose 1.5 untuk mengganti menggunakan tautan.
Sejauh ini dengan tautan tidak ada masalah dengan nginx menghubungkan ke server fastcgi php5-fpm saya yang terletak di server berbeda dalam satu grup melalui docker-compose. Baru-baru ini ketika saya menjalankan docker-compose --x-networking up
wadah php-fpm, mongo dan nginx saya boot, namun nginx langsung berhenti dengan[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16
Namun, jika saya menjalankan perintah docker-compose lagi saat wadah php dan mongo berjalan (nginx keluar), nginx mulai dan berfungsi dengan baik sejak saat itu.
Ini docker-compose.yml
file saya :
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
Ini default.conf
untuk nginx saya :
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;
}
}
Bagaimana saya bisa membuat nginx bekerja hanya dengan satu panggilan docker-compose?
sumber
Jawaban:
Ada kemungkinan untuk menggunakan "volumes_from" sebagai solusi sampai fitur depend_on (dibahas di bawah) diperkenalkan. Yang harus Anda lakukan adalah mengubah file docker-compose Anda seperti di bawah ini:
Satu peringatan besar dalam pendekatan di atas adalah bahwa volume php terkena nginx, yang tidak diinginkan. Namun saat ini, ini adalah salah satu solusi khusus buruh pelabuhan yang dapat digunakan.
fitur dependent_on Ini mungkin jawaban yang futuristik. Karena fungsinya belum diimplementasikan di Docker (mulai 1.9)
Ada usulan untuk memperkenalkan "depend_on" di fitur jaringan baru yang diperkenalkan oleh Docker. Tetapi ada perdebatan panjang tentang hal yang sama @ https://github.com/docker/compose/issues/374 Oleh karena itu, setelah diimplementasikan, fitur depend_on dapat digunakan untuk memesan permulaan kontainer, tetapi di saat ini, Anda harus menggunakan salah satu dari yang berikut:
sumber
links:
saya sertakan dalam nginx menggunakan nama yang sama dengan layanan itu sendiri seperti- my-service:my-service
atau dalam contoh ini- mongo:mongo
.Ini dapat diselesaikan dengan
depends_on
arahan yang disebutkan sejak diterapkan sekarang (2016):Berhasil diuji dengan:
Temukan detail lebih lanjut di dokumentasi .
Ada juga artikel yang sangat menarik yang didedikasikan untuk topik ini: Mengontrol urutan startup di Compose
sumber
Anda dapat menyetel perintah max_fails dan fail_timeout dari nginx untuk menunjukkan bahwa nginx harus mencoba ulang x jumlah permintaan koneksi ke container sebelum gagal pada ketidaktersediaan server upstream.
Anda dapat menyetel kedua angka ini sesuai infrastruktur Anda dan kecepatan seluruh penyiapan akan datang. Anda dapat membaca lebih banyak detail tentang bagian health check di URL di bawah ini: http://nginx.org/en/docs/http/load_balancing.html
Berikut adalah kutipan dari http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
max_fails=number
fail_timeout=time
Tepatnya file konfigurasi nginx Anda yang dimodifikasi harus seperti berikut (skrip ini mengasumsikan bahwa semua kontainer naik setidaknya 25 detik, jika tidak, silakan ubah fail_timeout atau max_fails di bawah bagian hulu): Catatan: Saya tidak uji skripnya sendiri, jadi Anda bisa mencobanya!
Selain itu, sesuai Catatan berikut dari buruh pelabuhan ( https://github.com/docker/docker.github.io/blob/master/compose/networking.md#update-containers ), terbukti bahwa logika coba lagi untuk memeriksa Kesehatan dari container lain bukanlah tanggung jawab buruh B / M dan sebaliknya container tersebut harus melakukan health check sendiri.
sumber
Saya percaya Nginx tidak menggunakan akun Docker resolver (127.0.0.11), jadi tolong, bisakah Anda mencoba menambahkan:
di file konfigurasi nginx Anda?
sumber
resolver 127.0.0.11 8.8.8.8;
Jika Anda begitu tersesat untuk membaca komentar terakhir. Saya telah mencapai solusi lain.
Masalah utamanya adalah cara Anda menamai nama layanan.
Dalam kasus ini, jika dalam Anda
docker-compose.yml
, layanan untuk php disebut "api" atau semacamnya, Anda harus memastikan bahwa di dalam filenginx.conf
, baris yang diawali denganfastcgi_pass
memiliki nama yang sama dengan layanan php. yaitufastcgi_pass api:9000;
sumber
Saya memiliki masalah yang sama karena ada dua jaringan yang ditentukan di saya
docker-compose.yml
: satu backend dan satu frontend.Ketika saya mengubahnya untuk menjalankan kontainer di jaringan default yang sama semuanya mulai berfungsi dengan baik.
sumber
Memiliki masalah yang sama dan menyelesaikannya. Silakan tambahkan baris berikut ke bagian nginx docker-compose.yml:
Host di bagian fastcgi_pass config nginx harus ditautkan di dalam konfigurasi nginx docker-compose.yml.
sumber
Dua hal yang perlu disebutkan:
links
untuk menambahkan resolusi hostContoh saya:
Jika Anda tidak menentukan jembatan jaringan khusus, semuanya akan menggunakan jembatan default yang sama.
sumber
Pada pandangan pertama, saya melewatkan, bahwa layanan "web" saya tidak benar-benar dimulai, jadi itu sebabnya nginx tidak dapat menemukan host apa pun
sumber
Dengan tautan, ada urutan startup penampung yang diberlakukan. Tanpa tautan, kontainer dapat dimulai dalam urutan apa pun (atau benar-benar sekaligus).
Saya pikir penyiapan lama bisa saja mengalami masalah yang sama, jika
waapi_php_1
penampung lambat untuk memulai.Saya pikir untuk membuatnya berfungsi, Anda dapat membuat skrip entrypoint nginx yang melakukan polling dan menunggu wadah php dimulai dan siap.
Saya tidak yakin apakah nginx memiliki cara untuk mencoba kembali koneksi ke upstream secara otomatis, tetapi jika ya, itu akan menjadi opsi yang lebih baik.
sumber
Anda harus menggunakan sesuatu seperti docker-gen untuk memperbarui konfigurasi nginx secara dinamis saat backend Anda aktif.
Lihat:
Saya yakin Nginx + (versi premium) juga berisi parameter penyelesaian ( http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream )
sumber
Mungkin pilihan terbaik untuk menghindari masalah penautan kontainer adalah fitur jaringan buruh pelabuhan
Tetapi untuk membuat ini bekerja, buruh pelabuhan membuat entri di / etc / hosts untuk setiap kontainer dari nama yang diberikan ke setiap kontainer.
Agar tidak bergantung pada perubahan tak terduga dalam nama ini, Anda harus menggunakan parameter
di docker-compose.yml Anda sebagai berikut:
Pastikan bahwa itu adalah nama yang sama yang diberikan di file konfigurasi Anda untuk layanan ini. Saya cukup yakin ada cara yang lebih baik untuk melakukan ini, tetapi ini adalah pendekatan yang baik untuk memulai.
sumber
Solusi Saya (setelah banyak trial and error):
Untuk mengatasi masalah ini, saya harus mendapatkan nama lengkap dari kontainer Docker 'upstream', yang ditemukan dengan menjalankan
docker network inspect my-special-docker-network
dan mendapatkanname
properti lengkap dari kontainer upstream seperti:Kemudian gunakan ini di
my-network.local.conf
file NGINX dilocation
blokproxy_pass
properti: (Perhatikan penambahan GUID ke nama wadah):Berbeda dengan yang sebelumnya berfungsi, tetapi sekarang rusak:
Kemungkinan besar penyebabnya adalah perubahan terbaru pada Docker Compose, dalam skema penamaan default untuk container, seperti yang tercantum di sini .
Ini sepertinya terjadi pada saya dan tim saya di tempat kerja, dengan versi terbaru dari
nginx
image Docker :sumber
(baru mengenal nginx) Dalam kasus saya, itu adalah nama folder yang salah
Untuk config
pastikan folder aplikasi ada di folder ex2:
ex2 / app / ...
sumber
kesalahan ini muncul pada saya karena
php-fpm
gambar saya diaktifkancron
, dan saya tidak tahu mengapasumber
Masalah saya adalah saya lupa menentukan alias jaringan di docker-compose.yml di php-fpm
Ini bekerja dengan baik!
sumber
Tambahkan bagian tautan ke konfigurasi wadah nginx Anda.
Anda harus menampilkan
php
wadah kenginx
wadah.sumber
link
adanya penghentian. Apakah saya melewatkan sesuatu?docker-compose --x-networking up
dengan tautan yang ditentukan dalam sayadocker-compose.yml
, saya mendapatkan peringatan yang jelas ini: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.
docker-compose.yml
mengajukan dalam folder bernamawaapi
?waapi