Cara Menjalankan Beberapa Layanan Dalam Satu Kontainer Docker.

\u003cimg data-pagespeed-no-defer/\u003e.

Docker adalah teknologi untuk mengemas komponen tumpukan Anda sebagai wadah yang terisolasi. Praktik umum untuk menjalankan setiap proses Anda dalam wadahnya sendiri, menciptakan pemisahan yang bersih antar komponen. Ini meningkatkan modularitas dan memungkinkan Anda mengakses manfaat skalabilitas containerization.

Masih ada situasi di mana Anda ingin menjalankan beberapa layanan dalam satu wadah. Meskipun ini tidak muncul secara alami di ekosistem Docker, tunjukkan beberapa pendekatan berbeda yang dapat Anda gunakan untuk membuat wadah dengan lebih dari satu proses berumur panjang.

Mengidentifikasi Masalah.

Kontainer Docker menjalankan satu proses latar depan. Ini ditentukan oleh gambar ENTRYPOINT dan instruksi CMD. ENTRYPOINT diatur dalam gambar Dockerfile sementara CMD dapat diganti saat membuat wadah. Kontainer secara otomatis berhenti ketika proses latar depan mereka keluar.

Anda dapat meluncurkan proses lain dari CMD tetapi wadah hanya akan tetap berjalan saat proses latar depan asli masih hidup. Menjaga peti kemas tetap beroperasi melalui umur gabungan dari dua layanan independen tidak dapat dilakukan secara langsung menggunakan mekanisme ENTRYPOINT/CMD.

Membungkus Beberapa Proses dalam Satu Titik Masuk.

Skrip pembungkus adalah solusi paling sederhana untuk masalah ini. Anda dapat menulis skrip yang memulai semua proses Anda dan menunggu hingga selesai. Menyetel skrip sebagai Docker ENTRYPOINT Anda akan menjalankannya sebagai proses latar depan wadah, menjaga wadah tetap berjalan hingga salah satu skrip yang dibungkus keluar.

#./bin/bash/opt/first-process &/opt/second-process &wait -nexit $.

This script starts the /opt/first-process and /opt/second-process binaries inside the container. The use of & allows the script to continue without waiting for each process to exit. wait is used to suspend the script until one of the processes does terminate. The script then exits with the status code issued by the finished script.

Model ini menghasilkan wadah yang menjalankan proses pertama dan proses kedua hingga salah satunya keluar. Pada saat itu, wadah akan berhenti, meskipun proses lain mungkin masih berjalan.

Untuk menggunakan skrip ini, ubah gambar Docker Anda ENTRYPOINT dan CMD untuk menjadikannya proses latar depan kontainer:.

ENTRYPOINT ("/bin/sh")CMD ("./path/to/script.sh") The --init Container Option

Salah satu tantangan dalam mengelola proses container adalah membersihkan secara efektif saat proses tersebut keluar. Docker menjalankan CMD Anda sebagai ID proses 1, membuatnya bertanggung jawab untuk menangani sinyal dan menghilangkan zombie. Jika skrip Anda tidak memiliki kemampuan ini, Anda bisa berakhir dengan proses anak yatim piatu yang bertahan di dalam wadah Anda.

Perintah docker run memiliki flag --init yang memodifikasi entrypoint untuk menggunakan tini sebagai PID 1. Ini adalah implementasi proses init minimal yang menjalankan CMD Anda, menangani penerusan sinyal, dan terus menuai zombie.

Ini bermanfaat menggunakan --init jika Anda berharap akan menghasilkan banyak proses dan tidak ingin menangani pembersihan secara manual. Tini adalah rasa init ringan yang dirancang untuk wadah. Ini jauh lebih kecil daripada alternatif yang sepenuhnya matang seperti systemd dan pemula.

Menggunakan Manajer Proses Khusus.

Pembuatan skrip manual dengan cepat menjadi kurang optimal ketika Anda memiliki banyak proses untuk dikelola. Mengadopsi manajer proses adalah cara lain untuk menjalankan beberapa layanan di dalam wadah Docker Anda. Manajer proses menjadi ENTRYPOINT Anda dan bertanggung jawab untuk memulai, memelihara, dan membersihkan setelah proses pekerja Anda.

There are several options available when implementing this approach. supervisord is a popular choice which is easily configured via an /etc/supervisor/conf.d/supervisord.conf file:

(program:apache2)command=/usr/sbin/apache2 -DFOREGROUND(program:mysqld)command=/usr/sbin/mysqld_safe

File konfigurasi ini mengonfigurasi supervisord untuk memulai Apache dan MySQL. Untuk menggunakannya dalam wadah Docker, tambahkan semua paket yang diperlukan ke gambar Anda, lalu salin file konfigurasi supervisord Anda ke lokasi yang benar. Tetapkan supervisord sebagai gambar CMD untuk menjalankannya secara otomatis saat kontainer mulai.

FROM ubuntu:latestRUN apt-get install -y apache2 mysql-server supervisorCOPY supervisord.conf /etc/supervisor/conf.d/supervisord.confENTRYPOINT ("/bin/sh")CMD ("/usr/bin/supervisord")

Karena supervisord berjalan terus menerus, tidak mungkin menghentikan container ketika salah satu proses yang Anda monitor keluar. Opsi alternatif adalah s6-overlay yang memang memiliki kemampuan ini. Ini menggunakan model layanan deklaratif di mana Anda menempatkan skrip layanan langsung ke /etc/services. d:.

# Add s6-overlay to your imageADD "#./bin/shn/usr/sbin/apache2 -DFOREGROUND" > /etc/services.d/first-service/runRUN chmod +x /etc/services.d/first-service/run# Use s6-overlay as your image's entrypointENTRYPOINT ("/init")

Anda dapat menambahkan skrip penyelesaian yang dapat dieksekusi di dalam direktori layanan Anda untuk menangani penghentian wadah dengan pemberhentian buruh pelabuhan. s6-overlay akan secara otomatis menjalankan skrip ini ketika prosesnya menerima sinyal TERM karena perintah stop.

Skrip akhir menerima kode keluar dari layanan mereka sebagai argumen pertama mereka. Kode diatur ke 256 ketika layanan dimatikan karena sinyal yang tidak tertangkap. Script perlu menulis kode keluar terakhir ke /run/s6-linux-init-container-results/exitcode. s6-overlay membaca file ini dan keluar dengan nilai di dalamnya, menyebabkan kode itu digunakan sebagai kode penghenti kontainer Anda.

#./bin/shecho "$1" > /run/s6-linux-init-container-results/exitcode When Should You Run Multiple Processes In a Container.

Teknik ini paling baik digunakan dengan proses yang digabungkan erat yang tidak dapat Anda pisahkan untuk dijalankan sebagai wadah independen. Anda mungkin memiliki program yang bergantung pada utilitas pembantu latar belakang atau aplikasi monolitik yang melakukan manajemen proses individualnya sendiri. Teknik yang ditunjukkan di atas dapat membantu Anda menampung jenis perangkat lunak ini.

Menjalankan banyak proses dalam sebuah wadah tetap harus dihindari sedapat mungkin. Berpegang teguh pada satu proses latar depan memaksimalkan isolasi, mencegah komponen saling mengganggu, dan meningkatkan kemampuan Anda untuk men-debug dan menguji bagian tertentu. Anda dapat menskalakan komponen satu per satu menggunakan orkestra penampung, yang memberi Anda fleksibilitas untuk menjalankan lebih banyak instans dari proses paling intensif sumber daya Anda.

Kesimpulan.

Wadah biasanya memiliki satu proses latar depan dan berjalan selama masih hidup. Model ini selaras dengan praktik terbaik containerisasi dan memungkinkan Anda mendapatkan manfaat maksimal dari teknologi.

Dalam beberapa situasi, Anda mungkin memerlukan beberapa proses untuk dijalankan dalam sebuah wadah. Karena semua gambar pada akhirnya memiliki satu titik masuk, Anda harus menulis skrip pembungkus atau menambahkan manajer proses yang bertanggung jawab untuk memulai binari target Anda.

Pengelola proses memberi Anda semua yang Anda butuhkan tetapi mengasapi gambar Anda dengan paket dan konfigurasi tambahan. Skrip pembungkus lebih sederhana tetapi mungkin perlu dipasangkan dengan Dockers --init flag untuk mencegah proliferasi proses zombie.

Komentar