Apa keuntungan dari dockerizing nginx dan php dalam wadah yang berbeda?

18

Saya baru saja mulai bekerja dengan Docker dan Kubernetes dan saya telah menonton banyak tumpukan, di mana beberapa orang membangun nginx + php dalam satu gambar dan beberapa membangun gambar dengan nginx dan satu lagi dengan php (memasang jalur yang sama dan melampirkan kedua kontainer dalam penyebaran yang sama di Kubernetes).

Apa keuntungan membangun dua gambar buruh pelabuhan daripada menginstal kedua nginx + php dalam satu yang sama?

CarlosAS
sumber

Jawaban:

19

PHP dengan nginx biasanya dilakukan menggunakan php-fpm yang merupakan prosesus terpisah.

Mempertahankan gagasan inti buruh pelabuhan dari satu proses (lihat akhir jawaban untuk detail lebih lanjut tentang hal ini) per wadah, masuk akal untuk memiliki proses nginx dan proses php-fpm dalam wadah terpisah.

Ketika komunikasi antara nginx dan php-fpm muncul melalui fastcgi, wadah php-fpm juga dapat berada di host yang terpisah dan ini memungkinkan penggunaan sekelompok kontainer php-fpm di belakang nginx.

Setelah dinding komentar di sini adalah latar belakang yang sedikit lebih, dokumentasi buruh pelabuhan memiliki paragraf tentang gagasan bahwa wadah harus hanya memiliki satu perhatian .

Gagasan utama dari wadah linux ( lxc ) adalah untuk menjalankan proses di ruang nama yang terisolasi di cpu dan tingkat memori, buruh pelabuhan menambahkan di atas ini isolasi di tingkat sistem file.
Keuntungannya adalah bahwa kompromi dari suatu proses dalam namespace ini tidak akan memungkinkan untuk membaca memori dari proses lain dan dengan demikian harus mencegah kompromi lain pada host.

Ketika berbicara tentang nginx dan php-fpm, mereka bekerja berpasangan tetapi masing-masing memiliki perhatian sendiri, nginx akan melakukan bagian HTTP, routing, validasi header, dll. Dan php-fpm akan melakukan interpretasi kode dan mengembalikan bagian html ke nginx . Sementara itu biasa memiliki keduanya bersama-sama melayani satu aplikasi yang tidak wajib.

Bergantung pada konteksnya, mungkin lebih mudah untuk memiliki wadah termasuk seluruh tumpukan untuk suatu aplikasi, pada workstation pengembang sebagai contoh. Tetapi idealnya untuk penggunaan produksi, cobalah untuk menjaga interaksi yang lebih sedikit di dalam wadah, setelah proses terpisah dalam wadah yang sama dengan pengawas membawa bagian masalahnya dalam hal proses zombie dan penanganan log (contoh cerita di sini hanya untuk tujuan ilustrasi).

Jadi akhirnya saya akan mengutip halaman buruh pelabuhan dengan beberapa penekanan:

Sementara "satu proses per wadah" sering merupakan aturan praktis yang baik, itu bukan aturan yang keras dan cepat. Gunakan penilaian terbaik Anda untuk menjaga wadah sebersih dan semodel mungkin .

Tidak ada "aturan peluru perak" yang berlaku untuk semuanya, selalu ada keseimbangan antara kompleksitas di dalam wadah dan kompleksitas yang mengatur sendiri wadah itu.

Tensibai
sumber
3
Gagasan inti sebenarnya adalah "Setiap wadah harus hanya memiliki satu masalah", dan "belum tentu benar bahwa seharusnya hanya ada satu proses sistem operasi per wadah". docs.docker.com/engine/userguide/eng-image/…
user2640621
Saya akui itu jalan pintas untuk menemukan ide, nginx bukanlah proses monolitik tunggal atau php-fpm, tetapi ganti proses dengan perhatian pada jawaban saya dan masih OK nginx melakukan routing, php-fpm melakukan interpretasi
Tensibai
3
Jawabannya biasanya satu layanan satu port per kontainer, tidak benar-benar satu proses. Di sisi lain, jika Anda memiliki beberapa proses yang berjalan dalam sebuah wadah, Anda perlu mempertimbangkan beberapa proses init, manajemen layanan, restart, pencatatan independen, dependensi paket independen, itu akan menjadi sedikit lebih rumit. Dan terkadang pemetaan 1: 1 berubah menjadi pemetaan 1: n saat penskalaan.
Jiri Klouda
@Jiri bermain advokat iblis: jadi apache di depan aplikasi rel menggunakan postgres DB harus masuk dalam wadah yang sama? Bagaimanapun, itu hanyalah satu layanan dari sudut pandang eksternal.
Tensibai
1
@JiriKlouda menjawab, saya harap ini cukup detail untuk menyampaikan semua poin yang diangkat dalam komentar.
Tensibai
4

Sebenarnya, satu titik yang hilang di sini adalah skalabilitas horizontal. Ada sebuah artikel dari Jamie Alquiza yang lama membahas ini:

http://archive.is/pDzz0

Singkatnya, Anda skala php-fpm Anda secara horizontal untuk mencapai kinerja yang lebih tinggi. Scaling Nginx + php-fpm bersama-sama tidak memberi Anda manfaat apa pun. Saya mendorong Anda melakukan beberapa pengujian stres (misalnya Tsung, Gatling, dll.; Jangan lakukan Apache ab, itu mainan yang sangat tua) untuk memverifikasi apa yang dinyatakan artikel tersebut. Saya pribadi punya beberapa pengalaman dunia nyata yang membuktikan artikel itu benar secara umum.

Tapi ada dua kelemahan (mungkin bukan untuk Kubernetes) untuk mesin / VM logam telanjang:

  1. Bagaimana cara mengkonfigurasi Nginx secara dinamis menemukan perubahan wadah php-fpm? Ini bagian yang mudah.
  2. Bagaimana cara kami berbagi volume / sistem file yang sama setelah penskalaan? Wadah Nginx dan php-fpm harus membaca konten yang sama persis untuk mencapai konsistensi. Ini membuat Anda bagian puzzle paling tidak (dan bagian paling menyenangkan) untuk dikerjakan.

Diedit: Sekarang hampir setengah tahun 2019. Model lama, php-fpm + nginx di pod yang sama, memiliki penggunaan yang berbeda. Jika Anda terbiasa dengan service mesh, maka nginx (atau yang biasa disebut Nginmesh) berfungsi sebagai sespan untuk menangani lalu lintas terikat timur-barat. Lalu lintas terikat timur-barat sebagian besar digunakan untuk mengotentikasi antara layanan, atau fungsi mewah lainnya, sedangkan php-fpm murni tidak bisa melakukan itu bersama.

Ming Hsieh
sumber
3

Tidak ada manfaat berarti yang melebihi harus mengelola dua kontainer. Selama Anda memiliki hubungan 1: 1 antara proses dan mereka melayani satu tujuan, letakkan mereka dalam wadah yang sama.

pengguna2640621
sumber
Apakah maksud Anda gambar berbeda pada wadah yang sama?
CarlosAS
Bagaimana Anda memulai nginx dan php-fpm dalam wadah yang sama? Silakan tambahkan contoh.
030
1
@ 030 di sini contoh
CarlosAS
2
@carlos Contoh yang sangat valid untuk keperluan dev, saya akan memblokir hal-hal semacam ini untuk penggunaan produksi (menjalankan supervisord dalam sebuah wadah dapat dengan mudah menggunakan footgun)
Tensibai
Saya tidak setuju dengan jawaban itu, dengan alasan ini server apache dengan keamanan mod berbicara dengan kucing jantan berbicara dengan server postgresql hosting hanya satu aplikasi yang harus sesuai dalam satu wadah.
Tensibai
-1

Keuntungannya adalah: Anda dapat menjalankan beberapa kontainer php-fpm di back-end, kami menyebutnya cluster PHP, melalui sejumlah port. Contoh port 9000, 9001, 9002 .. dan seterusnya

Dylan B
sumber