Saya punya teman yang mengatakan:
Docker luar biasa. Anda dapat menggunakannya untuk mereplikasi produksi dan semua kebiasaannya di mesin lokal Anda. Kemudian Anda bisa menggunakan instance itu langsung melalui semua alur kerja pementasan dengan sangat cepat .
Sekarang ini akan menjadi kenyataan jika pengembang menulis Ruby, PHP atau Go - di mana ada link biner arah ke sistem operasi.
Tetapi ketika menggunakan Java - sudah ada lapisan virtual antara sistem operasi dan bahasa, membuat konsistensi operasi terlepas dari sistem operasi yang mendasarinya.
Dapat diperdebatkan, dalam hal ini, manfaat menjalankan Docker bagi pengembang lokal untuk mereplikasi lingkungan produksi dinegasikan . (Dibandingkan dengan Ruby, PHP, atau Go).
Saya terbuka untuk diskusi tentang ini dan saya ingin mendengar sudut pandang yang berbeda (dengan bukti).
Apakah manfaat pengembangan menggunakan Docker dinegasikan saat menggunakan Java dibandingkan dengan bahasa lain yang lebih dekat dengan binari Unix?
sumber
Jawaban:
Tidak semuanya.
Bayangkan Anda menjalankan versi 1.8.0 Java pada mesin pengembangan Anda dan server. Ngomong-ngomong, Anda bekerja secara bersamaan pada dua proyek, keduanya menggunakan Java.
Suatu hari, bug ditemukan di JVM, dan server yang menjalankan proyek pertama yang Anda kerjakan dimigrasi ke 1.8.1. Omong-omong, server yang menjalankan proyek kedua tidak terpengaruh oleh bug, dan dikelola oleh tim administrator sistem yang berbeda, yang mungkin tidak bersedia memperbarui ke 1.8.1.
Sekarang, setidaknya untuk salah satu proyek, Anda menjalankan versi Java yang berbeda.
Ini mungkin tidak terlalu mengganggu Anda (sampai satu server bermigrasi ke 1.9, sementara yang lain menyimpan versi lama), tetapi ini berarti Anda tidak lagi mereplikasi lingkungan produksi di mesin lokal Anda, yang memungkinkan untuk ukuran kecil bug untuk masuk.
Jika Anda membayangkan bahwa sistem file Anda, dependensi Anda, pengaturan keamanan Anda, konfigurasi lokal Anda dan versi Linux Anda sendiri berbeda dari produksi, Anda menempatkan diri Anda pada risiko menulis kode yang akan gagal dalam produksi. Alih-alih mengambil risiko ini, Anda bisa menggunakan virtualisasi atau Docker, dengan minor hingga tanpa kehilangan produktivitas.
sumber
Anda jarang hanya menggunakan "Aplikasi Java". Aplikasi java Anda memiliki banyak program dukungan yang berbeda di sekitarnya. Kami menggunakan Apache HTTPD, Apache Tomcat, ActiveMQ untuk pengiriman pesan, Deamon FTP, MySQL, dan beberapa layanan khusus untuk berintegrasi dengan program yang tidak berfungsi langsung dengan Java.
Ini bahkan tidak masuk ke perangkat lunak pengembangan yang menyertainya - gerhana, semut, adobe flex, groovy, firefox dan subversi (saya melewatkan beberapa)
Dibutuhkan antara sehari penuh dan seminggu untuk menyiapkan workstation baru - kami telah membahas pindah ke Docker untuk menyederhanakan masalah ini. Akan luar biasa jika kita dapat secara andal meluncurkan workstation baru dalam beberapa jam.
Belum lagi fakta bahwa ketika kita menggunakan kita perlu mempertahankan - 20 server; Docker mulai terlihat seperti kesepakatan yang cukup bagus!
(20 tampaknya Cukup menyakitkan untuk aplikasi yang hanya berjalan di satu server pada satu waktu ... tetapi kalikan satu server dengan cluster (x2), test / staging / prod (x3), Internal / Eksternal (x2) dan situs utama / backup situs (x2) dan Anda naik ke sana dengan cepat)
sumber
Pertanyaan ini juga cocok untuk golang, di mana Anda bisa mengekstrak binari yang terhubung secara statis dan menjalankannya di suatu tempat, berbeda dengan Python atau C ++ di mana Anda biasanya memiliki sejumlah besar perpustakaan terkait yang mengarahkan orang untuk hanya membangun sebuah wadah buruh pelabuhan dari pengembangan lingkungan.
Ada dua poin untuk dijawab di sini:
Satu: harus ada cara yang lebih baik , dan ada: Anda dapat membangun wadah buruh pelabuhan yang lebih kecil (dan lebih efisien) hanya dengan menggunakan lingkungan pemasangan, yang mengarah pada keuntungan yang sama seperti dalam kasus Golang-dengan-lingkungan versus Golang-saja -kontainer biner. Dalam kasus Java, Anda bisa membuat toples yang gemuk atau aplikasi yang bisa diinstal yang berisi semua toples perpustakaan dan skrip shell; dalam kasus Python, Anda bisa menggunakan auditwheel untuk membuat roda mandiri yang independen terhadap lingkungan build (dan Anda bisa menggunakan C ++ dengan tautan statis ke efek yang hampir sama).
Dua: untuk apa Anda membutuhkan buruh pelabuhan? Di tanah Jawa, Anda dapat melakukan banyak pemisahan antara berbagai komponen dengan menggunakan pemuat kelas, tetapi poin utamanya adalah apa yang ada di sekitar aplikasi Java. Tidak ada aplikasi Java yang berjalan dengan sendirinya - jika tidak berjalan di docker, biasanya harus diawasi oleh supervisor atau systemd atau sejenisnya. Masukkan cloud Kubernetes, Marathon, atau Docker, yang menggunakan abstraksi wadah untuk memvirtualkan bukan host itu sendiri, tetapi sebenarnya memvirtualisasikan seluruh jaringan sehingga Anda bisa menggunakan kontainer dan mereka menjalankan beberapa host acak.
Layanan microser biasanya berjalan pada cloud berbasis buruh pelabuhan karena memungkinkan Anda untuk memperlakukan host buruh pelabuhan sebagai ternak, bukan sebagai hewan peliharaan, dan demikian pula dengan aplikasi buruh pelabuhan. Tentu saja, abstraksi ini menjadi bocor segera setelah Anda memasang volume host ke buruh pelabuhan dan perlu menjalankan kontainer buruh pelabuhan persis pada host yang memiliki volume ini. Beberapa orang menyiasati hal itu.
sumber
Ini adalah pertanyaan yang sangat bagus tetapi setelah bekerja dengan Docker, saya akan memutarnya:
Kontainer benar-benar menantang banyak asumsi yang saya miliki tentang pengembangan yang berasal dari pengalaman saya. Misalnya, jika seseorang membuat kode path untuk file sumber daya dalam aplikasi, banyak pengembang yang berpengalaman akan tahu bahwa ini bermasalah dan Anda harus membuatnya dapat dikonfigurasi. Tetapi jika Anda menargetkan sebuah wadah, apakah ini benar-benar masalahnya? Ketika Anda membangun wadah, Anda memberi tahu apa itu struktur direktori. Anda mengkonfigurasi jalur di sana. Jadi, haruskah Anda mengkonfigurasinya dua kali? Apa manfaatnya? Jika Anda tidak membuat mereka cocok, itu tidak akan berhasil jadi ... KERING?
Saya baru-baru ini membuat aplikasi prototipe dengan Java dan Docker yang pada dasarnya menonton acara GC dan ketika bagian lama tumpukan mencapai persentase ambang batas, itu akan menutup sendiri. Docker (mode segerombolan) akan memunculkan yang baru. Pada dasarnya, ini menghilangkan kebutuhan untuk siklus GC besar di JVM dan membiarkan buruh pelabuhan mengelolanya. Itu tidak bekerja sebaik yang saya harapkan (klien melihat beberapa dampak dari shutdown) tetapi itu cukup fungsional untuk melakukan demo langsung ke kerumunan.
Anda harus benar-benar mencoba wadah jika Anda penasaran. Ini benar-benar merupakan teknologi yang mengganggu dan Anda harus mengatasinya. Docker adalah tempat yang bagus untuk memulai tetapi setidaknya ada satu alternatif lain yang bagus untuk semua orang, IMO.
sumber