Dalam banyak posting blog, dan pendapat umum, ada pepatah yang mengatakan "satu proses per kontainer".
Mengapa aturan ini ada? Mengapa tidak menjalankan ntp, nginx, uwsgi dan lebih banyak proses dalam satu wadah yang harus memiliki semua proses untuk bekerja?
posting blog yang menyebutkan aturan ini:
docker
containers
Evgeny
sumber
sumber
Jawaban:
Mari kita lupakan argumen arsitektur dan filosofis tingkat tinggi sejenak. Meskipun mungkin ada beberapa kasus tepi di mana beberapa fungsi dalam satu wadah mungkin masuk akal, ada beberapa alasan praktis mengapa Anda mungkin ingin mempertimbangkan untuk mengikuti "satu fungsi per wadah" sebagai aturan praktis:
Perhatikan bahwa saya mengatakan fungsi, bukan proses. Bahasa itu sudah usang. Dokumentasi buruh pelabuhan resmi telah beralih dari mengatakan "satu proses" untuk bukannya merekomendasikan "satu masalah" per kontainer.
sumber
Setelah membunuh sebuah wadah "dua proses" beberapa hari yang lalu, ada beberapa titik sakit bagi saya yang menyebabkan saya menggunakan dua wadah bukannya skrip python yang memulai dua proses:
sumber
Rekomendasi berasal dari tujuan dan desain virtualisasi tingkat sistem Operasi
Wadah telah dirancang untuk mengisolasi proses bagi orang lain dengan memberikan ruang pengguna dan sistem file sendiri.
Ini adalah evolusi logis
chroot
yang menyediakan sistem file yang terisolasi, langkah selanjutnya adalah mengisolasi proses dari yang lain untuk menghindari memori menimpa dan memungkinkan untuk menggunakan sumber daya yang sama (misalnya TCP port 8080) dari beberapa proses tanpa konflik.Minat utama dalam sebuah wadah untuk mengemas perpustakaan yang dibutuhkan untuk proses tanpa khawatir tentang konflik versi. Jika Anda menjalankan beberapa proses yang membutuhkan dua versi dari perpustakaan yang sama di ruang pengguna dan sistem file yang sama, Anda harus mengubah setidaknya LDPATH untuk setiap proses sehingga perpustakaan yang tepat ditemukan terlebih dahulu, dan beberapa perpustakaan tidak dapat men-tweak dengan cara ini, karena path mereka dikodekan dalam executable pada waktu kompilasi, lihat pertanyaan SO ini untuk lebih jelasnya.
Pada level jaringan Anda harus mengkonfigurasi setiap proses untuk menghindari penggunaan port yang sama.
Menjalankan banyak proses dalam wadah yang sama membutuhkan beberapa penyesuaian berat dan pada akhirnya mengalahkan tujuan isolasi, jika Anda boleh menjalankan banyak proses dalam ruang pengguna yang sama, berbagi fileytem dan sumber daya jaringan yang sama, lalu mengapa tidak menjalankannya pada tuan rumah itu sendiri?
Berikut adalah daftar lengkap dari tweaking / jebakan berat yang bisa saya pikirkan:
Menangani log
Entah dengan volume yang dipasang atau disisipkan pada stdout ini membawa beberapa manajemen. Jika menggunakan volume yang dipasang kontainer Anda harus memiliki "tempat" sendiri di host atau dua kontainer yang sama akan berjuang untuk sumber daya yang sama. Ketika interleaving pada stdout untuk memanfaatkannya
docker logs
dapat menjadi mimpi buruk untuk dianalisis jika sumber tidak dapat diidentifikasi dengan mudah.Waspadalah terhadap proses zombie
Jika salah satu proses Anda dalam kecelakaan kontainer, pengawas mungkin tidak dapat membersihkan anak-anak dalam keadaan zombie, dan init host tidak akan pernah mewarisi mereka. Setelah Anda kehabisan jumlah pids yang tersedia (2 ^ 22 jadi sekitar 4 juta) banyak hal akan gagal.
Pemisahan masalah
Jika Anda menjalankan dua hal yang terpisah, seperti server apache dan logstash dalam wadah yang sama, yang dapat memudahkan penanganan log, tetapi Anda harus mematikan apache untuk memperbarui logstash. (Pada kenyataannya, Anda harus menggunakan driver logging dari Docker) Apakah akan berhenti dengan anggun menunggu sesi saat ini berakhir atau tidak? Jika berhenti dengan anggun, mungkin perlu beberapa saat dan menjadi lama untuk memutar versi baru. Jika Anda melakukan kill, Anda akan berdampak pada pengguna untuk pengirim log dan itu harus dihindari IMHO.
Akhirnya ketika Anda memiliki beberapa proses Anda mereproduksi OS, dan dalam hal ini menggunakan virtualisasi perangkat keras terdengar lebih sesuai dengan kebutuhan ini.
sumber
Seperti dalam kebanyakan kasus, itu tidak semua atau tidak sama sekali. Pedoman "satu proses per wadah" berasal dari gagasan bahwa wadah harus melayani tujuan yang berbeda. Misalnya, sebuah wadah tidak boleh berupa aplikasi web dan server Redis.
Ada beberapa kasus di mana masuk akal untuk menjalankan banyak proses dalam satu wadah, selama kedua proses tersebut mendukung fungsi modular tunggal.
sumber
Proses yang saya sebut layanan di sini, layanan 1 kontainer ~ 1 , jika ada layanan saya gagal maka saya hanya akan memutar kontainer yang bersangkutan dan dengan-dalam detik semuanya kembali. Jadi, tidak akan ada ketergantungan antara layanan. Ini adalah praktik terbaik untuk menjaga ukuran wadah Anda kurang dari 200 MB dan maks 500 MB (kecuali untuk kontainer asli windows lebih dari 2 GB), jika tidak, itu akan sama dengan mesin virtual, tidak cukup tetapi, kinerja sudah cukup. Juga, pertimbangkan beberapa parameter sebagai penskalaan, bagaimana saya bisa membuat layanan saya ketahanan, penerapan otomatis, dll.
Dan, ini murni panggilan Anda bagaimana Anda perlu membuat pola arsitektur Anda seperti layanan mikro di lingkungan polygot menggunakan teknologi wadah yang paling sesuai dengan lingkungan Anda dan akan mengotomatiskan hal-hal untuk Anda.
sumber