Apakah manfaat pengembangan menggunakan Docker dinegasikan saat menggunakan Java dibandingkan dengan bahasa lain yang lebih dekat dengan binari Unix?

53

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?

Hawkeye
sumber
34
Menurut Anda mengapa ruby ​​dan php adalah biner? Ruby dan php secara teknis bahkan lebih virtual daripada Jawa - di Jawa Anda harus mengkompilasi terlebih dahulu kemudian menjalankan program Anda di mesin virtual. Di Ruby dan php Anda mengirimkan kode sumber dan mesin virtual langsung membaca sumbernya.
slebetman
12
"Tetapi ketika menggunakan Java - sudah ada lapisan virtual antara sistem operasi dan bahasa, membuat konsistensi operasi terlepas dari sistem operasi yang mendasarinya." LOL. Java menemukan "menulis sekali, uji di mana-mana."
Andy
2
Java adalah target yang bergerak. Kadang-kadang fitur diperkenalkan yang memecah hal-hal (pengetatan keamanan beberapa tahun yang lalu adalah contoh utama) atau Anda mengalami bug yang mengharuskan Anda menggunakan versi tertentu. Jauh lebih mudah untuk mengontrol ini di buruh pelabuhan daripada menggunakan sistem pengemasan asli komputer host.
Thorbjørn Ravn Andersen
1
"membuat konsistensi operasi terlepas dari sistem operasi yang mendasarinya" Perhatikan bahwa membuat runtime bahasa berperilaku secara konsisten tidak meniadakan fakta bahwa Anda mungkin masih memiliki beberapa dependensi eksternal. Bisa jadi sesuatu yang sederhana seperti menggunakan jalur file tertentu untuk log Anda.
jpmc26

Jawaban:

86

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.

Arseni Mourzenko
sumber
20
Juga hal semacam ini terjadi sepanjang waktu di perusahaan besar. Itu bukan hanya hal teoretis.
enderland
5
Apa yang Anda lakukan ketika menemukan bug di Docker?
Owen
Juga Java 9 akan memecahkan banyak hal. Akan ada beberapa upaya yang dibutuhkan.
Thorbjørn Ravn Andersen
8
@Owen Hal yang sama yang Anda lakukan ketika Anda menemukan bug di Jawa. Atau di {Linux, Windows}. Atau di CPU Anda .
Kroltan
1
@Trilarion: Ya, meskipun sebagian besar dalam bentuk posting blog oleh pengembang perusahaan. Yang mengatakan, salah satu tautan "Pelajari selengkapnya" di docker.com/customers akan memberikan contoh perusahaan besar yang menggunakan buruh pelabuhan untuk menyelesaikan masalah tersebut. Yang mengatakan, biasanya perusahaan seperti itu menerima begitu saja bahwa mereka membutuhkan pasangan yang sempurna antara produksi dan pengembangan, dan menyelesaikan ini dengan VM. Kemudian, mereka menyadari, "hei, Docker memecahkan masalah yang sama dengan VM, kecuali itu berjalan lebih cepat dan dapat digunakan untuk menjaga penyebaran yang konsisten."
Brian
35

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)

Bill K
sumber
Mengapa tidak membuat gambar?
Dmitry Kudriavtsev
Kami berharap untuk. Kami adalah tim kecil yang mencoba untuk menambahkan fitur ke sistem yang cukup banyak digunakan / penting dan tidak memiliki kontrol yang cukup atas server untuk menentukan penyebaran mereka. Mungkin menggunakannya untuk dev, kita sudah cukup dibatasi pada ram 32mb - saya berasumsi berjalan dari gambar buruh pelabuhan akan memiliki beberapa overhead ... tapi rencana kita adalah bergerak ke arah itu.
Bill K
Saya bermaksud untuk workstation
Dmitry Kudriavtsev
Waktu dan memori - kita harus meninggalkan bagian untuk berjalan di workstation 32 GB kita (server 64 GB menjalankan semuanya dengan baik). Kami telah bereksperimen sedikit dan mungkin mencobanya lain kali kita perlu membangun workstation dev baru.
Bill K
8

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.

Yannick
sumber
5

Ini adalah pertanyaan yang sangat bagus tetapi setelah bekerja dengan Docker, saya akan memutarnya:

Apakah manfaat JVM dinegasikan dengan kontainerisasi (misalnya Docker)?

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.

JimmyJames
sumber
"... tapi ada setidaknya satu alternatif yang layak yang baik untuk semua orang" Jadi, mungkinkah ini alternatif yang layak?
Trilarion
@Trilarion rkt (atau roket) . Saat ini didukung oleh Kubernetes bersama dengan Docker.
JimmyJames