Mengapa disarankan untuk menjalankan hanya satu proses dalam satu wadah?


79

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:


Tetapi - apakah boleh memiliki wadah yang sangat "gemuk" dengan lusinan proses untuk melakukan peluncuran dan pengoperasian server perusahaan yang masih belum memiliki Docker?
Peter

@ J.Apakah itu mungkin tidak akan apa-apa kontainer berbeda dari VM, ada beberapa masalah kecil bahkan untuk aplikasi kecil - untuk peluncuran perusahaan itu akan menjadi proyek dua tahun untuk menjalankan semuanya dalam wadah di tempat pertama.
Evgeny

Jawaban:


65

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:

  • Penskalaan wadah secara horizontal jauh lebih mudah jika wadah diisolasi untuk satu fungsi. Perlu wadah apache lain? Putar satu di tempat lain. Namun jika wadah apache saya juga memiliki DB, cron, dan barang-barang lainnya yang disemir, ini mempersulit hal-hal.
  • Memiliki fungsi tunggal per wadah memungkinkan wadah dengan mudah digunakan kembali untuk proyek atau tujuan lain.
  • Ini juga membuatnya lebih portabel dan dapat diprediksi untuk dev untuk menarik komponen dari produksi untuk memecahkan masalah secara lokal daripada seluruh lingkungan aplikasi.
  • Penambalan / peningkatan (baik OS dan aplikasi) dapat dilakukan dengan cara yang lebih terisolasi dan terkontrol. Menyulap banyak bit-and-bob dalam wadah Anda tidak hanya menghasilkan gambar yang lebih besar, tetapi juga menyatukan komponen-komponen ini. Mengapa harus mematikan aplikasi X dan Y hanya untuk memutakhirkan Z?
    • Di atas juga berlaku untuk penyebaran kode dan rollback.
  • Fungsi pemisahan ke beberapa wadah memungkinkan lebih banyak fleksibilitas dari perspektif keamanan dan isolasi. Anda mungkin ingin (atau meminta) layanan untuk diisolasi pada tingkat jaringan - baik secara fisik atau dalam jaringan overlay - untuk mempertahankan postur keamanan yang kuat atau mematuhi hal-hal seperti PCI.
  • Faktor-faktor lain yang lebih kecil seperti berurusan dengan stdout / stderr dan mengirim log ke log kontainer, menjaga kontainer sesingkat mungkin dll.

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.


1
Namun, tampaknya argumen tingkat rendah terhadap utas cocok di sini ... web.stanford.edu/ ~ouster
cgi

Hebat, jawaban komprehensif!
Rob Wells

Apakah gagasan bahwa pertanyaan itu tidak benar-benar berarti 'proses' dalam pengertian OS - bahwa buruh pelabuhan dan tulisan terkait menggunakan terminologi berbeda yang sekarang telah diklarifikasi dengan beralih ke kata 'fungsi'? Karena kalau tidak, sementara saya mengakui bahwa ini adalah jawaban yang diterima dan diberi nilai tertinggi, saya tidak berpikir itu menjawab pertanyaan yang diajukan.
Tom

27

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:

  1. Docker pandai mengenali kontainer yang jatuh. Itu tidak dapat melakukan itu ketika proses utama terlihat baik-baik saja, tetapi beberapa proses lainnya mati dengan mengerikan. Tentu, Anda dapat memantau proses Anda secara manual, tetapi mengapa menerapkannya kembali?
  2. log buruh pelabuhan menjadi jauh lebih tidak berguna ketika beberapa proses memuntahkan log mereka ke konsol. Sekali lagi, Anda bisa menulis nama proses ke log, tetapi buruh pelabuhan juga bisa melakukannya.
  3. Menguji dan menalar tentang mendapatkan wadah jauh lebih sulit.

Ini harus menjadi jawaban yang diterima.
ClintM

Sepakat. Meskipun ada beberapa jawaban lain dengan beberapa poin hebat, poin kuncinya adalah tentang penanganan buruh pelabuhan dari PID 1.
Brett Wagner

13

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 chrootyang 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 logsdapat 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.


3
Saya menemukan argumen ini tidak meyakinkan. Ada perbedaan besar antara proses dengan banyak wadah dan berjalan di host. Meskipun menjelaskan maksud asli wadah agak relevan, itu sebenarnya bukan alasan kuat untuk menghindari wadah multi-proses. TKI, Anda menjawab "mengapa tidak" dengan "mengapa ya", yang tidak membantu seperti seharusnya. Sangat mudah untuk menjalankan banyak proses dalam wadah yang sama - itulah sebabnya ya. Mengapa tidak tetap harus dijelaskan.
Assaf Lavie

1
Anda belum merinci tentang jenis tweaker yang ada dalam pikiran Anda. Dan Anda belum memastikan bahwa tweaking ini lebih berfungsi daripada mengatur beberapa wadah. Mari kita ambil contoh konkret: Anda sering melihat gambar buruh pelabuhan paket yang memiliki pengawas menjalankan beberapa proses utama dan beberapa proses tambahan. Ini sangat mudah diatur; bisa dibilang semudah memisahkan wadah. misal pengirim aplikasi & log. Jadi, tanggung jawab ada di pihak Anda, saya percaya, untuk berdebat mengapa ini tidak terjadi.
Assaf Lavie

1
BTW, saya percaya ada argumen yang valid terhadap wadah multi-proses, tetapi Anda tidak menyebutkannya. Tapi bagaimanapun, itu jauh dari kasus yang jelas. Dalam beberapa kasus, sangat dapat diterima untuk mengizinkan lebih dari satu proses. Heck, beberapa gambar yang sangat populer menelurkan beberapa sub-proses - apakah itu jahat juga? Apa yang saya katakan adalah ada pertukaran, dan jawaban Anda menggambarkan satu sisi yang kurang bernuansa dan detail.
Assaf Lavie

1
menarik ... Sepertinya kami memiliki pendapat yang sama (identik) tentang ini. Mungkin Anda harus mengabaikannya dalam kasus ini, karena itu dari seseorang yang ingin mendapatkan lencana Kritik ... dan memutuskan untuk menyalahgunakan jawaban Anda untuk mendapatkan lencana itu ...
Pierre.Vriens

1
Saya tidak "terburu-buru" untuk menyimpulkan ... Saya hanya menyarankan Anda untuk mengabaikannya. Tetapi "Anda" tidak dapat mengubah pikiran saya tentang apa yang telah saya lihat dengan mata kepala saya sendiri tentang siapa jawaban negatif dari jawaban Anda. Pokoknya, saatnya pindah ...
Pierre.Vriens

6

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.


2

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.