Saya mencoba untuk membungkus kepala saya di sekitar Docker dari titik menyebarkan aplikasi yang dimaksudkan untuk dijalankan pada pengguna di desktop. Aplikasi saya hanyalah sebuah aplikasi web flask dan database mongo. Biasanya saya akan menginstal keduanya dalam VM dan, meneruskan port host ke aplikasi web tamu. Saya ingin mencoba Docker tetapi saya tidak yakin bagaimana saya seharusnya menggunakan lebih dari satu program. Dokumentasi mengatakan hanya ada ENTRYPOINT jadi bagaimana saya bisa memiliki Mongo dan aplikasi labu saya. Atau apakah mereka perlu berada di wadah yang terpisah, dalam hal bagaimana mereka berbicara satu sama lain dan bagaimana hal ini membuat pendistribusian aplikasi menjadi mudah?
150
Jawaban:
Mungkin hanya ada satu ENTRYPOINT, tetapi target itu biasanya adalah skrip yang meluncurkan sebanyak mungkin program yang diperlukan. Anda juga dapat menggunakan misalnya Supervisord atau yang serupa untuk mengurus peluncuran beberapa layanan di dalam satu wadah. Ini adalah contoh dari wadah buruh pelabuhan menjalankan mysql, apache dan wordpress dalam satu wadah .
Katakanlah, Anda memiliki satu database yang digunakan oleh satu aplikasi web. Maka mungkin lebih mudah untuk menjalankan keduanya dalam satu wadah.
Jika Anda memiliki database bersama yang digunakan oleh lebih dari satu aplikasi, maka akan lebih baik untuk menjalankan database dalam wadahnya masing-masing dan aplikasi masing-masing dalam wadah mereka sendiri.
Setidaknya ada dua kemungkinan bagaimana aplikasi dapat berkomunikasi satu sama lain ketika mereka berjalan dalam wadah yang berbeda:
sumber
Saya memiliki persyaratan yang sama untuk menjalankan tumpukan LAMP, Mongo DB, dan layanan saya sendiri
Docker adalah virtualisasi berbasis OS, itulah sebabnya ia mengisolasi wadahnya di sekitar proses yang sedang berjalan, oleh karena itu membutuhkan setidaknya satu proses yang berjalan di FOREGROUND.
Jadi, Anda memberikan skrip startup Anda sendiri sebagai titik masuk, sehingga skrip startup Anda menjadi skrip gambar Docker yang diperluas, di mana Anda dapat menumpuk sejumlah layanan sejauh SETIDAKNYA SATU LAYANAN TERLALU MULAI YANG DIMULAI, YANG TERLALU MENUJU AKHIR
Jadi file gambar Docker saya memiliki dua baris di bawah ini pada akhirnya:
Dalam skrip saya, saya menjalankan semua MySQL, MongoDB, Tomcat dll. Pada akhirnya saya menjalankan Apache saya sebagai utas foreground.
Ini memungkinkan saya untuk memulai semua layanan saya dan menjaga wadah tetap hidup dengan layanan terakhir mulai di latar depan
Semoga ini bisa membantu
UPDATE : Sejak saya terakhir menjawab pertanyaan ini, hal-hal baru telah muncul seperti penulisan Docker , yang dapat membantu Anda menjalankan setiap layanan pada wadahnya sendiri, namun mengikat semuanya bersama-sama sebagai dependensi di antara layanan-layanan tersebut, cobalah mengetahui lebih lanjut tentang komposisi docker dan gunakan, itu cara yang lebih elegan kecuali jika kebutuhan Anda tidak cocok dengannya.
sumber
Saya sangat tidak setuju dengan beberapa solusi sebelumnya yang merekomendasikan untuk menjalankan kedua layanan dalam wadah yang sama. Itu jelas dinyatakan dalam dokumentasi bahwa itu tidak direkomendasikan :
Ada beberapa kasus penggunaan yang baik untuk pengawas atau program serupa tetapi menjalankan aplikasi web + database bukan bagian dari mereka.
Anda harus menggunakan komposisi buruh pelabuhan untuk melakukan itu dan mengatur banyak wadah dengan tanggung jawab berbeda.
sumber
Mereka bisa berada di wadah yang terpisah, dan memang, jika aplikasi itu juga dimaksudkan untuk berjalan di lingkungan yang lebih besar, mereka mungkin akan melakukannya.
Sistem multi-kontainer akan membutuhkan lebih banyak orkestrasi untuk dapat memunculkan semua dependensi yang diperlukan, meskipun dalam Docker v0.6.5 +, ada fasilitas baru untuk membantu dengan yang dibangun ke dalam Docker itu sendiri - Menghubungkan . Dengan solusi multi-mesin, masih ada sesuatu yang harus diatur dari luar lingkungan Docker.
Dengan dua wadah yang berbeda, kedua bagian masih berkomunikasi melalui TCP / IP, tetapi kecuali jika port telah dikunci secara khusus (tidak disarankan, karena Anda tidak dapat menjalankan lebih dari satu salinan), Anda harus melewati port baru bahwa database telah terpapar ke aplikasi, sehingga dapat berkomunikasi dengan Mongo. Ini lagi, sesuatu yang bisa dibantu oleh Linking.
Untuk instalasi yang lebih sederhana dan kecil, di mana semua dependensi berada dalam wadah yang sama, memiliki kedua database dan runtime Python dimulai oleh program yang awalnya disebut sebagai ENTRYPOINT juga dimungkinkan. Ini bisa sesederhana skrip shell, atau pengontrol proses lainnya - Supervisord cukup populer, dan sejumlah contoh ada di Dockerfiles publik.
sumber
Saya setuju dengan jawaban lain bahwa menggunakan dua wadah lebih disukai, tetapi jika Anda memiliki hati untuk menggabungkan beberapa layanan dalam satu wadah Anda dapat menggunakan sesuatu seperti pengawas.
di Hipache misalnya, termasuk Dockerfile berjalan supervisord, dan menspesifikasikan berkas supervisord.conf untuk kedua hipache dan Redis-server yang akan dijalankan.
sumber
Docker memberikan beberapa contoh tentang cara melakukannya. Pilihan ringan adalah:
sumber
Anda dapat menjalankan 2 proses di latar depan dengan menggunakan
wait
. Buat skrip bash dengan konten berikut. Misalnyastart.sh
:Di Dockerfile Anda, mulai dengan
sumber
Jika skrip khusus sepertinya terlalu banyak overhead, Anda dapat menelurkan proses terpisah secara eksplisit
sh -c
. Sebagai contoh:sumber