Wadah terpisah docker nginx php-fpm

Saya sangat menyelidiki hal ini, dan seperti banyak orang, saya menemukan bahwa pada tahun 2020 tampaknya tidak ada begitu banyak logika dalam memisahkan server web + PHP + proses/kode aplikasi yang digabungkan erat satu sama lain

Dua argumen utama untuk pemisahan adalah skalabilitas dan pemisahan masalah (satu proses per wadah)

Logikanya, server web seharusnya hanya bertindak sebagai server web dan mendistribusikan lalu lintas ke node PHP di belakang layanan yang menggunakan LB

Dengan cara ini satu wadah/layanan melayani tujuan server web dan melayani file statis, sambil mem-proxy permintaan php ke pod php yang hanya berkaitan dengan PHP

Dan server web dan pod php dapat diskalakan secara berbeda - yaitu Anda mungkin memerlukan 50-100 pod PHP untuk beban kerja, tetapi hanya 3-4 node server web. Jadi, Anda menghemat sumber daya. Besar

Kecuali sehubungan dengan pemisahan keprihatinan

Jika server web tidak akan melayani permintaan ke aplikasi yang berbeda, ada sedikit logika untuk pemisahan masalah ke wadah yang berbeda - kesampingkan layanan. Jika aplikasi digabungkan dengan server web, Anda hanya akan menghasilkan pod server web tambahan, dengan layanan yang menyertainya dan penyeimbang muatan untuk menyertainya

Selain itu, Anda harus mendistribusikan kode aplikasi ke kedua wadah atau memasangnya dari ikatan NFS, atau pemasangan non NFS. Anda harus berurusan dengan semua hal akses dan izin yang relevan, jika Anda meletakkan kode aplikasi di kedua pod, Anda harus berurusan dengan pemisahan file statis + dinamis, atau bahkan harus mendistribusikan kedua jenis file ke kedua pod. Anda dapat meletakkan dua kontainer dan membuat salah satunya me-mount direktori di sisi lain dan itu akan berhasil, tetapi itu sebenarnya menempatkan dua kontainer di host logis yang sama terkait dengan jaringan, host dll sehingga Anda masih menggabungkannya. Ini masih memberikan beberapa pemisahan kekhawatiran. Tetapi komunikasi di antara dua wadah dalam pod yang sama menjadi perhatian - itu harus terjadi melalui jaringan intra-host melalui loopback, yang menggunakan tumpukan jaringan dan kurang berkinerja. Mungkin soket bisa berfungsi

Lebih buruk lagi jika aplikasi Anda mungkin memerlukan server web yang ada dalam wadah yang sama - misalnya jika Anda melakukan penghentian ssl dan harus membawa ip pengunjung yang sebenarnya ke pod php, Anda mungkin harus melewati beberapa rintangan. Meskipun server web dan php tersedia dalam wadah yang sama, hal ini dapat dilakukan melalui berbagai cara

Ketika semuanya ada dalam satu wadah, tidak ada yang diperlukan. Semuanya dikemas dengan rapi di tempat yang sama, tidak perlu melacak penerapan, layanan, kode aplikasi, pengontrol replikasi yang berbeda

Kontainer/penyebaran tunggal semacam ini sangat menguntungkan saat ini terutama jika Anda menggunakan ingress-nginx atau nginx-ingress dan menghosting banyak aplikasi/situs berbeda di cluster yang sama. Setiap aplikasi/situs terkandung dalam wadahnya sendiri (bayangkan situs WordPress yang berbeda), setiap situs sepenuhnya terkandung dalam izin, akses, penerapan, versi, persyaratan, dll.

Sedemikian rupa sehingga Anda bahkan dapat mengizinkan aplikasi/situs untuk menyesuaikan lingkungan runtime mereka dengan menyediakan file konfigurasi untuk server web atau php dari NFS share atau mount lainnya - yaitu. htaccess, php. ini dll. Yang merupakan keharusan untuk menghosting aplikasi yang berbeda karena orang cenderung memiliki persyaratan yang berbeda

Sehubungan dengan kinerja

Hari ini NGINX atau Apache membutuhkan sumber daya yang sangat sedikit dengan penanganan permintaan berbasis acara. Misalnya di tolok ukur saya, saya melihat Apache 2 dengan acara mpm hanya membutuhkan memori 3-4 MB, dan total ~ 2-3% cpu (dari 1000 juta cpu yang diminta, yaitu 1 vcpu) sambil menangani 50-100 permintaan bersamaan

Bobot pod server web vs PHP akan berbeda tergantung pada aplikasi atau situs web tentunya, dan pasti ada aplikasi yang memerlukan pemisahan seperti itu, tetapi untuk sebagian besar beban kerja web umum hal ini tampaknya tidak perlu

Jadi menelurkan beberapa pod Apache dan kemudian menelurkan ratusan atau lebih pod PHP tampaknya tidak membawa banyak keuntungan. Selain membuat lalu lintas jaringan klaster internal karena pod perlu berkomunikasi satu sama lain dan Anda juga membuat lebih banyak kerumitan dalam konfigurasi aplikasi (penyebaran, layanan, penyeimbang muatan, dll.)

Kerugian lain dari memisahkan wadah adalah Anda membuat dua kali layanan per aplikasi. Ini akan mencerminkan batas cluster yang Anda buat karena layanan, pod memerlukan alamat ip

Ketika server web + aplikasi PHP + berada dalam wadah yang sama, server web hanya dapat berkomunikasi dengan php-fpm melalui soket file. Mana yang lebih cepat, dan menghasilkan lebih sedikit overhead jaringan bahkan pada antarmuka loopback di dalam wadah, kesampingkan pembuatan lalu lintas jaringan di dalam kluster. Jaringan internal dan beban cpu disimpan

Kesimpulannya

Untuk tujuan tertentu, dengan satu server Apache 2 atau NGINX mendistribusikan permintaan ke aplikasi yang berbeda di cluster PHP-FPM yang berbeda, memisahkan masalah kemungkinan akan menjadi kebutuhan

Namun di era ingress-nginx, ini sepertinya tidak perlu

Terutama mengurangi kompleksitas, portabilitas, kinerja yang disimpan dan kebisingan cluster internal, kustomisasi yang lebih baik dan manfaat lain yang diperoleh dari pengemasan yang digabungkan dengan erat server + penerapan aplikasi PHP + dalam satu wadah tunggal tampaknya terlalu bagus untuk dilewatkan

Selain itu, ini bahkan memungkinkan format seperti shared-hosting di kluster Kubernetes, yang tampaknya membuka banyak kemungkinan

Saya akan sangat menghargai masukan apa pun dari siapa pun yang memiliki pengalaman dalam menangani pilihan ini di antara memilih wadah tunggal untuk aplikasi yang digabungkan dengan erat vs banyak koin, atau siapa pun yang melakukan tolok ukur pada ini

Apakah mungkin menggunakan dua kontainer dalam satu layanan?

Anda dapat menghubungkan beberapa kontainer menggunakan jaringan yang ditentukan pengguna dan volume bersama . Proses utama wadah bertanggung jawab untuk mengelola semua proses yang dimulainya.

Bagaimana cara meng-host beberapa wadah Docker pada satu server dengan proxy terbalik nginx?

Menyiapkan Nginx sebagai proxy terbalik untuk menerapkan beberapa layanan di server yang sama menggunakan Docker .
Prasyarat. .
Langkah 1. Siapkan wadah proxy balik Nginx. .
Langkah 2. Siapkan wadah untuk pembuatan sertifikat SSL otomatis. .
Langkah 3. Selesaikan file penulisan buruh pelabuhan. .
Langkah 4. Verifikasi bahwa proxy balik Nginx berfungsi

Bagaimana cara menggunakan PHP dengan nginx Docker?

Layanan Nginx . Create a folder named PHP with Nginx and open it in Visual Studio Code. Di dalamnya, buat file bernama docker-compose. yml dan tulis ini di dalamnya. Di Docker Compose, Anda menentukan apa yang disebut "layanan", yang akan diwakili oleh kontainer yang berjalan di buruh pelabuhan.

Bagaimana cara menghubungkan dua wadah bersama?

Untuk membuat tautan, Anda menggunakan tanda --link . Pertama, buat wadah baru, kali ini berisi database. Ini membuat wadah baru bernama db dari gambar pelatihan/postgres, yang berisi database PostgreSQL. Sekarang, buat wadah web baru dan tautkan dengan wadah db Anda.