Saya menggunakan Ubuntu untuk pengembangan dan penyebaran dan memiliki kebutuhan untuk menciptakan lingkungan yang terisolasi.
Saya sedang mempertimbangkan Vagrant atau Docker untuk tujuan ini. Apa kelebihan dan kekurangannya, atau bagaimana perbandingan solusi ini?
Jawaban:
Jika tujuan Anda adalah isolasi, saya pikir Docker adalah apa yang Anda inginkan.
Vagrant adalah manajer mesin virtual. Hal ini memungkinkan Anda untuk skrip konfigurasi mesin virtual serta ketentuan tersebut. Namun, itu masih merupakan mesin virtual tergantung pada VirtualBox (atau yang lain) dengan overhead yang besar. Ini mengharuskan Anda untuk memiliki file hard drive yang besar, membutuhkan banyak ram, dan kinerja mungkin tidak terlalu baik.
Docker di sisi lain menggunakan cgroup kernel dan namespacing melalui LXC . Ini berarti bahwa Anda menggunakan kernel yang sama dengan host dan sistem file yang sama. Anda dapat menggunakan Dockerfile dengan
docker build
perintah untuk menangani penyediaan dan konfigurasi wadah Anda. Anda memiliki contoh di docs.docker.com tentang cara membuat Dockerfile Anda; ini sangat intuitif.Satu-satunya alasan Anda ingin menggunakan Vagrant adalah jika Anda perlu melakukan pengembangan BSD, Windows atau non-Linux lainnya pada kotak Ubuntu Anda. Jika tidak, pilih Docker.
sumber
Penafian: Saya menulis Vagrant! Tetapi karena saya menulis Vagrant, saya menghabiskan sebagian besar waktu saya hidup di dunia DevOps yang mencakup perangkat lunak seperti Docker. Saya bekerja dengan banyak perusahaan menggunakan Vagrant dan banyak menggunakan Docker, dan saya melihat bagaimana keduanya saling mempengaruhi.
Sebelum saya berbicara terlalu banyak, jawaban langsung: dalam skenario spesifik Anda (Anda bekerja sendiri, bekerja di Linux, menggunakan Docker dalam produksi), Anda dapat tetap menggunakan Docker sendirian dan menyederhanakan banyak hal. Dalam banyak skenario lain (saya bahas lebih lanjut), itu tidak mudah.
Tidak benar membandingkan secara langsung Vagrant dengan Docker. Dalam beberapa skenario, mereka tumpang tindih, dan sebagian besar tidak. Sebenarnya, perbandingan yang lebih tepat adalah Vagrant versus sesuatu seperti Boot2Docker (OS minimal yang dapat menjalankan Docker). Vagrant adalah tingkat di atas Docker dalam hal abstraksi, jadi itu bukan perbandingan yang adil dalam kebanyakan kasus.
Vagrant meluncurkan berbagai hal untuk menjalankan aplikasi / layanan untuk tujuan pengembangan. Ini bisa di VirtualBox, VMware. Bisa jauh seperti AWS, OpenStack. Di dalamnya, jika Anda menggunakan wadah, Vagrant tidak peduli, dan merangkul hal itu: ia dapat secara otomatis memasang, menarik, membuat, dan menjalankan wadah Docker, misalnya. Dengan Vagrant 1.6, Vagrant memiliki lingkungan pengembangan berbasis buruh pelabuhan , dan mendukung penggunaan Docker dengan alur kerja yang sama dengan Vagrant di Linux, Mac, dan Windows. Vagrant tidak mencoba untuk menggantikan Docker di sini, itu mencakup praktik Docker.
Docker secara khusus menjalankan wadah Docker. Jika Anda membandingkan langsung dengan Vagrant: itu adalah solusi yang lebih spesifik (hanya dapat menjalankan Docker), kurang fleksibel (memerlukan Linux atau host Linux di suatu tempat). Tentu saja jika Anda berbicara tentang produksi atau CI, tidak ada perbandingan dengan Vagrant! Vagrant tidak hidup di lingkungan ini, dan karenanya Docker harus digunakan.
Jika organisasi Anda hanya menjalankan wadah Docker untuk semua proyek mereka dan hanya memiliki pengembang yang berjalan di Linux, maka oke, Docker pasti bisa bekerja untuk Anda!
Kalau tidak, saya tidak melihat manfaat dari mencoba menggunakan Docker saja, karena Anda kehilangan banyak apa yang ditawarkan Vagrant, yang memiliki manfaat bisnis / produktivitas nyata:
Vagrant dapat meluncurkan mesin VirtualBox, VMware, AWS, OpenStack, dll. Tidak masalah apa yang Anda butuhkan, Vagrant dapat meluncurkannya. Jika Anda menggunakan Docker, Vagrant dapat menginstal Docker di semua ini sehingga Anda dapat menggunakannya untuk tujuan itu.
Vagrant adalah alur kerja tunggal untuk semua proyek Anda. Atau dengan kata lain, itu hanya satu hal yang orang harus pelajari untuk menjalankan proyek apakah itu dalam wadah Docker atau tidak. Jika, misalnya, di masa depan, pesaing muncul untuk bersaing secara langsung dengan Docker, Vagrant akan dapat menjalankannya juga.
Vagrant bekerja pada Windows (kembali ke XP), Mac (kembali ke 10.5), dan Linux (kembali ke kernel 2.6). Dalam ketiga kasus, alur kerjanya sama. Jika Anda menggunakan Docker, Vagrant dapat meluncurkan mesin (VM atau jarak jauh) yang dapat menjalankan Docker di ketiga sistem ini.
Vagrant tahu cara mengkonfigurasi beberapa hal lanjut atau non-sepele seperti jaringan dan folder sinkronisasi. Sebagai contoh: Vagrant tahu cara melampirkan IP statis ke mesin atau meneruskan port, dan konfigurasinya sama tidak peduli sistem apa yang Anda gunakan (VirtualBox, VMware, dll.) Untuk folder yang disinkronkan, Vagrant menyediakan banyak mekanisme untuk mendapatkan lokal Anda file ke mesin jarak jauh (folder bersama VirtualBox, NFS, rsync, Samba [plugin], dll.). Jika Anda menggunakan Docker, bahkan Docker dengan VM tanpa Vagrant, Anda harus melakukan ini secara manual atau mereka harus menemukan kembali Vagrant dalam kasus ini.
Vagrant 1.6 memiliki dukungan kelas satu untuk lingkungan pengembangan berbasis buruh pelabuhan . Ini tidak akan meluncurkan mesin virtual di Linux, dan secara otomatis akan meluncurkan mesin virtual di Mac dan Windows. Hasil akhirnya adalah bahwa bekerja dengan Docker seragam di semua platform, sementara Vagrant masih menangani detail hal-hal yang membosankan seperti jaringan, folder yang disinkronkan, dll.
Untuk membahas argumen tanggapan khusus yang saya dengar dalam mendukung penggunaan Docker, bukan Vagrant:
"Itu bagian yang kurang bergerak" - Ya, bisa jadi, jika Anda menggunakan Docker secara eksklusif untuk setiap proyek. Bahkan kemudian, itu mengorbankan fleksibilitas untuk mengunci Docker. Jika Anda pernah memutuskan untuk tidak menggunakan Docker untuk proyek, masa lalu, sekarang, atau masa depan, maka Anda akan memiliki lebih banyak komponen bergerak. Jika Anda pernah menggunakan Vagrant, Anda memiliki satu bagian bergerak yang mendukung sisanya.
"Lebih cepat!" - Setelah Anda memiliki host yang dapat menjalankan kontainer Linux, Docker jelas lebih cepat dalam menjalankan kontainer daripada mesin virtual mana pun yang akan diluncurkan. Tetapi meluncurkan mesin virtual (atau mesin jarak jauh) adalah biaya satu kali. Sepanjang hari, sebagian besar pengguna Vagrant tidak pernah benar-benar menghancurkan VM mereka. Ini adalah optimasi aneh untuk lingkungan pengembangan. Dalam produksi, di mana Docker benar-benar bersinar, saya mengerti perlunya dengan cepat memutar / menurunkan kontainer.
Saya harap sekarang jelas untuk melihat bahwa sangat sulit, dan saya percaya tidak benar, untuk membandingkan Docker dengan Vagrant. Untuk lingkungan dev, Vagrant lebih abstrak, lebih umum. Docker (dan berbagai cara Anda dapat membuatnya berperilaku seperti Vagrant) adalah kasus penggunaan khusus Vagrant, mengabaikan segala hal lain yang ditawarkan Vagrant.
Kesimpulannya: dalam kasus penggunaan yang sangat spesifik, Docker tentu saja merupakan pengganti yang mungkin untuk Vagrant. Dalam kebanyakan kasus penggunaan, tidak. Vagrant tidak menghalangi penggunaan Docker Anda; itu benar-benar melakukan apa yang bisa untuk membuat pengalaman itu lebih lancar. Jika Anda menemukan ini tidak benar, saya senang mengambil saran untuk memperbaiki keadaan, karena tujuan Vagrant adalah bekerja sama baiknya dengan sistem apa pun.
Semoga ini jelas!
sumber
vagrant provision
).Saya penulis Docker.
Jawaban singkatnya adalah bahwa jika Anda ingin mengelola mesin, Anda harus menggunakan Vagrant. Dan jika Anda ingin membangun dan menjalankan lingkungan aplikasi, Anda harus menggunakan Docker.
Vagrant adalah alat untuk mengelola mesin virtual. Docker adalah alat untuk membangun dan menggunakan aplikasi dengan mengemasnya ke dalam wadah yang ringan. Wadah dapat menampung hampir semua komponen perangkat lunak beserta dependensinya (dapat dieksekusi, perpustakaan, file konfigurasi, dll.), Dan jalankan dalam lingkungan runtime yang dijamin dan dapat diulang. Ini membuatnya sangat mudah untuk membangun aplikasi Anda sekali dan menyebarkannya di mana saja - pada laptop Anda untuk pengujian, kemudian pada server yang berbeda untuk penyebaran langsung, dll.
Ini adalah kesalahpahaman umum bahwa Anda hanya dapat menggunakan Docker di Linux. Itu tidak benar; Anda juga dapat menginstal Docker di Mac, dan Windows. Ketika diinstal pada Mac, Docker bundel VM Linux kecil (25 MB pada disk!) Yang bertindak sebagai pembungkus untuk wadah Anda. Setelah diinstal, ini sepenuhnya transparan; Anda dapat menggunakan baris perintah Docker dengan cara yang persis sama. Ini memberi Anda yang terbaik dari kedua dunia: Anda dapat menguji dan mengembangkan aplikasi Anda menggunakan wadah, yang sangat ringan, mudah diuji dan mudah untuk dipindahkan (lihat misalnya https://hub.docker.com untuk berbagi wadah yang dapat digunakan kembali dengan komunitas Docker), dan Anda tidak perlu khawatir tentang seluk beluk mengelola mesin virtual, yang bagaimanapun juga hanyalah sarana untuk mencapai tujuan.
Secara teori dimungkinkan untuk menggunakan Vagrant sebagai lapisan abstraksi untuk Docker. Saya merekomendasikan ini karena dua alasan:
Pertama, Vagrant bukanlah abstraksi yang baik untuk Docker. Vagrant dirancang untuk mengelola mesin virtual. Docker dirancang untuk mengelola runtime aplikasi. Ini berarti bahwa Docker, secara desain, dapat berinteraksi dengan aplikasi dengan cara yang lebih kaya, dan memiliki lebih banyak informasi tentang runtime aplikasi. Primitif dalam Docker adalah proses, aliran log, variabel lingkungan, dan tautan jaringan antara komponen. Primitif dalam Vagrant adalah mesin, perangkat blok, dan kunci ssh. Vagrant hanya duduk lebih rendah di tumpukan, dan satu-satunya cara ia dapat berinteraksi dengan sebuah wadah adalah dengan berpura-pura itu hanya jenis mesin lain, sehingga Anda bisa "boot" dan "masuk". Jadi, tentu saja, Anda dapat mengetik "gelandangan" dengan plugin Docker dan sesuatu yang cantik akan terjadi. Apakah ini merupakan pengganti dari apa yang dapat dilakukan Docker? Coba Docker asli selama beberapa hari dan lihat sendiri :)
Kedua, argumen penguncian. "Jika Anda menggunakan Vagrant sebagai abstraksi, Anda tidak akan dikunci ke Docker!". Dari sudut pandang Vagrant, yang dirancang untuk mengelola mesin, ini masuk akal: bukankah wadah hanyalah jenis mesin lain? Sama seperti Amazon EC2 dan VMware, kita harus berhati-hati untuk tidak mengikat alat penyediaan kami dengan vendor tertentu! Ini akan membuat lock-in - lebih baik untuk abstrak semua itu dengan Vagrant. Kecuali ini merindukan titik Docker sepenuhnya. Docker tidak menyediakan mesin; itu membungkus aplikasi Anda dalam runtime portabel ringan yang dapat dijatuhkan di mana saja.
Apa runtime yang Anda pilih untuk aplikasi Anda tidak ada hubungannya dengan bagaimana Anda menyediakan mesin Anda! Misalnya cukup sering untuk menyebarkan aplikasi ke mesin yang disediakan oleh orang lain (misalnya instance EC2 yang digunakan oleh administrator sistem Anda, mungkin menggunakan Vagrant), atau untuk telanjang mesin logam yang tidak dapat disediakan oleh Vagrant sama sekali. Sebaliknya, Anda dapat menggunakan Vagrant untuk mesin penyediaan yang tidak ada hubungannya dengan pengembangan aplikasi Anda - misalnya kotak IIS Windows yang siap digunakan atau sesuatu. Atau Anda dapat menggunakan Vagrant untuk mesin penyediaan untuk proyek yang tidak menggunakan Docker - mungkin mereka menggunakan kombinasi rubygems dan rvm untuk manajemen ketergantungan dan kotak pasir misalnya.
Singkatnya: Vagrant adalah untuk mengelola mesin, dan Docker adalah untuk membangun dan menjalankan lingkungan aplikasi.
sumber
Saya mengawali balasan saya dengan mengakui bahwa saya tidak memiliki pengalaman dengan Docker, selain sebagai pengamat yang rajin tentang apa yang tampak sebagai solusi yang sangat rapi yang mendapatkan banyak daya tarik.
Saya memiliki cukup banyak pengalaman dengan Vagrant dan sangat merekomendasikannya. Ini tentu saja solusi yang lebih berat dalam hal menjadi berbasis VM daripada berbasis LXC. Namun, saya telah menemukan laptop yang layak (RAM 8 GB, CPU i5 / i7) tidak mengalami kesulitan menjalankan VM menggunakan Vagrant / VirtualBox di samping perkakas pengembangan.
Salah satu hal hebat dengan Vagrant adalah integrasi dengan Puppet / Chef / skrip shell untuk mengotomatisasi konfigurasi. Jika Anda menggunakan salah satu opsi ini untuk mengonfigurasi lingkungan produksi Anda, Anda dapat membuat lingkungan pengembangan yang hampir identik dengan yang akan Anda dapatkan, dan inilah yang Anda inginkan.
Hal hebat lainnya dengan Vagrant adalah Anda dapat membuat versi Vagrantfile bersama dengan kode aplikasi Anda. Ini berarti semua orang di tim Anda dapat membagikan file ini dan Anda dijamin semua orang bekerja dengan konfigurasi lingkungan yang sama.
Menariknya, Vagrant dan Docker sebenarnya bisa gratis. Vagrant dapat diperluas untuk mendukung penyedia virtualisasi yang berbeda, dan mungkin saja Docker adalah salah satu penyedia tersebut yang mendapat dukungan dalam waktu dekat. Lihat https://github.com/dotcloud/docker/issues/404 untuk diskusi terbaru tentang topik ini.
sumber
Mereka sangat saling melengkapi.
Saya telah menggunakan kombinasi VirtualBox, Vagrant dan Docker untuk semua proyek saya selama beberapa bulan dan sangat merasakan manfaat berikut.
Di Vagrant Anda dapat sepenuhnya menghapus ketentuan solo Chef dan yang perlu Anda lakukan dengan file gelran Anda adalah menyiapkan mesin yang menjalankan skrip shell kecil tunggal yang menginstal buruh pelabuhan. Ini berarti bahwa Vagrantfiles saya untuk setiap proyek hampir identik dan sangat sederhana.
Berikut ini adalah Vagrantfile yang khas
File Bootstrap yang menginstal buruh pelabuhan terlihat seperti ini
Sekarang untuk mendapatkan semua layanan yang saya butuhkan berjalan saya memiliki skrip docker_start yang terlihat seperti ini
Dalam contoh ini saya menjalankan MongoDB, Elastisearch, RabbitMQ dan Memcached
Konfigurasi solo Chef non-buruh pelabuhan akan jauh lebih rumit.
Nilai tambah besar diperoleh saat Anda beralih ke produksi, menerjemahkan lingkungan pengembangan ke infrastruktur host yang semuanya sama karena mereka hanya memiliki konfigurasi yang cukup untuk menjalankan buruh pelabuhan, artinya memang sangat sedikit pekerjaan.
Jika Anda tertarik, saya memiliki artikel yang lebih terperinci tentang lingkungan pengembangan di situs web saya sendiri di
Menerapkan Lingkungan Pengembangan Vagrant / Docker
sumber
Vagrant-lxc adalah plugin untuk Vagrant yang memungkinkan Anda menggunakan LXC untuk menyediakan Vagrant. Ini tidak memiliki semua fitur yang dimiliki VM gelandangan default (VirtualBox) tetapi harus memungkinkan Anda lebih fleksibel daripada wadah buruh pelabuhan. Ada video di tautan yang menunjukkan kemampuannya yang layak ditonton.
sumber
Dengan Vagrant sekarang Anda dapat memiliki Docker sebagai penyedia. http://docs.vagrantup.com/v2/docker/ . Penyedia Docker dapat digunakan sebagai pengganti VirtualBox atau VMware.
Harap dicatat bahwa Anda juga dapat menggunakan Docker untuk penyediaan dengan Vagrant. Ini sangat berbeda dari menggunakan Docker sebagai penyedia. http://docs.vagrantup.com/v2/provisioning/docker.html
Ini berarti Anda dapat mengganti Chef atau Wayang dengan Docker. Anda dapat menggunakan kombinasi seperti Docker sebagai penyedia (VM) dengan Chef sebagai penyedia. Atau Anda dapat menggunakan VirtualBox sebagai penyedia dan Docker sebagai penyedia.
sumber
Menggunakan keduanya adalah bagian penting dari pengujian pengiriman aplikasi. Saya baru mulai terlibat dengan Docker dan berpikir sangat keras tentang tim aplikasi yang memiliki kompleksitas mengerikan dalam membangun dan mengirimkan perangkat lunaknya. Pikirkan situasi Proyek Phoenix / Pengiriman Berkelanjutan klasik.
Pemikirannya kira-kira seperti ini:
Ini tampaknya menjadi perpanjangan logis dari pernyataan Mitchell bahwa Vagrant adalah untuk pengembangan dikombinasikan dengan pemikiran Farley / Humbles dalam Pengiriman Berkelanjutan. Jika saya, sebagai pengembang, dapat mengecilkan loop umpan balik pada pengujian integrasi dan pengiriman aplikasi, kualitas yang lebih tinggi dan lingkungan kerja yang lebih baik akan mengikuti.
Fakta bahwa sebagai pengembang, saya secara konstan dan konsisten mengirimkan kontainer ke VM dan menguji aplikasi secara lebih holistik berarti bahwa rilis produksi akan lebih disederhanakan.
Jadi saya melihat Vagrant berkembang sebagai cara meningkatkan beberapa konsekuensi luar biasa yang akan dimiliki Docker untuk penerapan aplikasi.
sumber
Tentunya Docker untuk menang!
Seperti yang Anda ketahui, Vagrant adalah untuk manajemen mesin virtual sedangkan Docker adalah untuk manajemen wadah perangkat lunak. Jika Anda tidak mengetahui perbedaannya, berikut adalah: Wadah perangkat lunak dapat berbagi mesin dan kernel yang sama dengan wadah perangkat lunak lainnya. Menggunakan wadah yang menghemat uang karena Anda tidak membuang sumber daya pada beberapa sistem operasi (kernel), Anda dapat mengemas lebih banyak perangkat lunak per server dengan menjaga tingkat isolasi yang baik.
Tentu saja adalah disiplin baru untuk merawat pitfals dan tantangannya sendiri.
Gunakan Docker Swarm jika persyaratan Anda melewati batas sumber daya mesin tunggal.
sumber
Ada artikel yang sangat informatif di majalah Oracle Java tentang menggunakan Docker dalam kombinasi dengan Vagrant (dan Wayang):
Kesimpulan
Cara membangun, menggunakan, dan mengatur wadah Docker di DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0
sumber