Haruskah saya menggunakan Vagrant atau Docker untuk menciptakan lingkungan yang terisolasi? [Tutup]

2083

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?

murtaza52
sumber
27
Keduanya dapat dikombinasikan sekarang: docs.vagrantup.com/v2/provisioning/docker.html
Alp
78
Pertanyaan Anda cukup beruntung untuk mendapatkan kedua jawaban penulis dari kedua layanan: Mitchell dan Solomon Hykes
itsazzad
4
Saya ingin memberikan ringkasan baru - pertanyaannya kebanyakan salah. Pertanyaan yang tepat adalah: Haruskah saya menggunakan Vagrant atau komposisi buruh pelabuhan untuk menciptakan lingkungan yang terisolasi? Jawabannya adalah Vagrant dan docker-compose melakukan tugas yang sama untuk mendeskripsikan lingkungan, dan Anda sebaiknya membandingkan Docker dengan Virtualbox. Perbedaannya adalah bahwa Vagrant dapat menggunakan virtualisasi apa pun seperti Docker, VMWare, Virtualbox pada Windows, Linux atau OSX, tetapi komposisi docker hanya dapat menggunakan gambar Docker berbasis Linux.
PHZ.fi-Pharazon
Bagi saya jawabannya adalah "Seberapa pentingkah kecepatan bagi Anda dalam aktivitas kerja reguler". Saya menemukan Vagrant lebih lambat dari Docker. Pada buruh pelabuhan, terutama setelah tarikan awal, pendekatan cache dan lapisan buruh pelabuhan menjadikannya yang termudah dan tercepat bagi saya sebagai pengembang untuk menggunakannya
Michael Durrant

Jawaban:

1155

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 buildperintah 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.

creack
sumber
13
Sayangnya belum. Jika Anda berada dalam sistem 32 bit, Anda akan memerlukan VM dengan sistem tamu 64 bit untuk menjalankan buruh pelabuhan. Namun, dengan go1.1 dukungan 32 bit menjadi lebih baik dan ada kemungkinan bahwa buruh pelabuhan akan segera mendukung lengkungan 32 bit
creack
8
Ini berlaku untuk Mac dan Windows, tetapi sejak docker 0.7, setiap distro linux berfungsi dengan baik. Jika Anda mengetahui yang tidak berfungsi, beri tahu saya. Juga, kecuali Anda memiliki tumpukan Mac atau Windows (yang tidak mungkin tetapi bisa terjadi), Anda tidak ingin menjalankan Docker di mana pun kecuali di linux. Klien buruh pelabuhan bekerja dengan baik di Mac, harus segera bekerja pada BSD dan daemon akhirnya akan mendukung BSD, Solaris dan Mac.
Creack
9
Jika seseorang membaca komentar ini, Anda harus tahu bahwa Docker mencapai ver1.0 hanya 12 hari yang lalu ( blog.docker.com/2014/06/its-here-docker-1-0 ) dan banyak platform yang berbeda stabil & didukung sekarang ( docs.docker.com/installation )
JorgeArtware
17
gelandangan memiliki LXC dan penyedia docker. Namun - Vagrant dan buruh pelabuhan pada dasarnya adalah hal-hal yang berbeda. Vagrant murni untuk lingkungan pengembangan, buruh pelabuhan lebih untuk produksi dan Linux saja.
Dannyboy
2
Docker sekarang berfungsi pada Windows 10 Pro dan lebih tinggi dan Windows Server 2016. Saya baru saja memutakhirkan dari Windows 10 Home ke Windows 10 Pro dan menginstal aplikasi docker. Sekarang saya dapat menjalankan gambar docker Linux pada Windows 10. Ini brilian!
PrestonDocks
2339

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!

Mitchell
sumber
4
@JaredMarkell Saya pikir mungkin dia sedang mencari layanan berbasis web yang memungkinkannya mengelola mesin Vagrant, seperti Protobox .
Ryan Kennedy
73
@Itchell, saya hanya ingin mengucapkan terima kasih karena menjelaskan ini dengan sangat rinci. Jelas tidak mungkin bagi Anda untuk sepenuhnya objektif, jadi saya menghargai Anda meluangkan waktu untuk menjelaskan nuansa dan berbagai situasi di mana mereka dapat digunakan. Saya pikir banyak kebingungan di sekitar berbagai alat hari ini adalah bahwa mereka tumpang tindih banyak, dan banyak orang menginginkan solusi satu ukuran untuk semua orang di mana seseorang hanya memberitahu mereka apa yang harus dilakukan dan mereka dapat menerapkannya. Keindahan dari jawaban Anda adalah bahwa ia menjawab pertanyaan mendasar: bagaimana saya bisa menciptakan lingkungan yang terisolasi? (terlepas dari alat).
Jordan
4
@JaredMarkell Docker memiliki REST API docs.docker.com/reference/api/docker_remote_api
Tarnay Kálmán
3
@ OğuzÇelikdemir Vagrant dapat melakukan lebih dari itu. Tentu saja, jika Anda menyiapkan mesin virtual spesifik untuk setiap proyek, ini akan bertahan lama. Tetapi selama pengembangan saya sering akhirnya menambahkan lebih banyak layanan / daemon / pengaturan (mis. Ketika saya memutuskan untuk menggunakan RabbitMQ untuk proyek selama pengembangan). Pendekatan VM murni akan mengharuskan Anda menyiapkan gambar baru, dengan RabbitMQ diinstal dan dikonfigurasi, dan memaksa pengembang untuk mengubah VM mereka ke yang baru ini. Untuk Vagrant - Saya menambahkan baris yang sesuai dalam konfigurasi gelandangan dan semua pengembang dapat memutakhirkan VM mereka dengan mudah (menggunakan vagrant provision).
Tomasz Struczyński
5
(Maksud Anda "pengungkapan", mengungkapkan sesuatu yang penting, bukan "penafian", menyangkal tanggung jawab: english.stackexchange.com/q/115850 )
Jerry101
1418

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.

Solomon Hykes
sumber
396
Hanya ingin mencatat bahwa aspek Vagrant dari jawaban ini salah. Vagrant bukan untuk mengelola mesin, Vagrant adalah untuk mengelola lingkungan pengembangan. Fakta bahwa mesin Vagrant berputar sebagian besar bersejarah. Versi Vagrant berikutnya memiliki dukungan kelas satu untuk memutar lingkungan dev menggunakan Docker sebagai penyedia langsung pada host atau VM apa pun (Mac, Win). Itu juga dapat memutar LXC mentah jika itu yang diinginkan seseorang (sekali lagi, pada host atau VM). Vagrant tertarik untuk melakukan apa yang terbaik untuk menciptakan lingkungan pengembangan portabel, apakah itu berarti menciptakan VM atau tidak.
Mitchell
7
@Davide Ini membahas lebih detail: vagrantup.com/blog/…
Mitchell
48
"Ini kesalahpahaman umum bahwa Anda hanya dapat menggunakan Docker di Linux" Sementara itu benar, akurat untuk mengatakan bahwa Anda hanya dapat menggunakan Linux di Docker. Jika saya ingin mengatur pelari uji yang menjalankan aplikasi saya dalam berbagai konfigurasi lingkungan (basis data berbeda, versi php, caching backend dll), maka saya dapat dengan mudah melakukannya dengan wadah buruh pelabuhan. Tapi saya tidak bisa melihat apakah aplikasi saya akan berjalan dengan baik di windows IIS env, atau pada BSD atau OSX.
Mixologic
10
Poin pertama Anda kedaluwarsa karena Vagrant memiliki dukungan penyedia bawaan
Alp
19
Pos sudah kedaluwarsa. Vagrant mendukung Docker sebagai penyedia sekarang. Dan ada beberapa video yang menunjukkan bagaimana Anda dapat menggunakan Vagrant dan Docker secara bersamaan di blog mereka .
sargas
86

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.

Chris Bushell
sumber
7
Guys, saya merilis penyedia gelandangan eksperimental untuk buruh pelabuhan: github.com/fgrehm/docker-provider .
fgrehm
2
Docker bukan virtualisasi, tetapi menjalankan OS di dalam wadahnya sendiri, menggunakan kernel host yang sama, bukan penyedia seperti halnya VM lain, jadi buruh pelabuhan sudah didukung oleh Vagrant.
Aftab Naveed
1
Docker adalah virtualisasi dari OS itu sendiri, secara implisit menggunakan kembali perangkat keras yang mendasarinya. Ini adalah virtualisasi karena abstrak dan mengisolasi sistem file, jaringan dan proses yang berjalan dalam sebuah wadah.
jose.angel.jimenez
63

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

# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "mark2"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
  [3000, 5000, 2345, 15672, 5672, 15674, 27017, 28017, 9200, 9300, 11211, 55674, 61614, 55672, 5671, 61613].each do |p|
    config.vm.network :forwarded_port, guest: p, host: p
  end
  config.vm.network :private_network, ip: "192.168.56.20"
  config.vm.synced_folder ".", "/vagrant", :type => "nfs"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    vb.customize ["modifyvm", :id, "--cpus", "2"]
  end
  # Bootstrap to Docker
  config.vm.provision :shell, path: "script/vagrant/bootstrap", :privileged => true
  # Build docker containers
  config.vm.provision :shell, path: "script/vagrant/docker_build", :privileged => true
  # Start containers
  # config.vm.provision :shell, path: "script/vagrant/docker_start", :privileged => true
end

File Bootstrap yang menginstal buruh pelabuhan terlihat seperti ini

#!/usr/bin/env bash
echo 'vagrant  ALL= (ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers
apt-get update -y
apt-get install htop -y
apt-get install linux-image-extra-`uname -r` -y
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
apt-get update -y
apt-get install lxc-docker -y
apt-get install curl -y

Sekarang untuk mendapatkan semua layanan yang saya butuhkan berjalan saya memiliki skrip docker_start yang terlihat seperti ini

#!/bin/bash
cd /vagrant
echo Starting required service containers
export HOST_NAME=192.168.56.20
# Start MongoDB
docker run --name=mongodb --detach=true --publish=27017:27017 --publish=28017:28017 dockerfile/mongodb
read -t5 -n1 -r -p "Waiting for mongodb to start..." key
# Start rabbitmq
docker run --name=rabbitmq --detach=true --publish=5671:5671 --publish=5672:5672 --publish=55672:55672 --publish=15672:15672 --publish=15674:15674 --publish=61613:61613 --env RABBITMQ_USER=guest --env RABBITMQ_PASS=guest rabbitmq
read -t5 -n1 -r -p "Waiting for rabbitmq to start..." key
# Start cache
docker run --name=memcached --detach=true --publish=11211:11211  ehazlett/memcached
read -t5 -n1 -r -p "Waiting for cache to start..." key
# Start elasticsearch
docker run --name=elasticsearch --detach=true --publish=9200:9200 --publish=9300:9300 dockerfile/elasticsearch
read -t5 -n1 -r -p "Waiting for elasticsearch to start..." key
echo "All services started"

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

Mark Stratmann
sumber
2
Anda melakukan semua orkestra docker_start tetapi tidak repot-repot menghubungkan wadah bersama. Apakah Anda hanya akan menggunakan nomor port hard-kode karena Anda menjalankannya di bawah Vagrant?
WineSoaked
6
Hai WineSoaked, contoh di atas tidak menunjukkan wadah yang benar-benar menggunakan semua layanan tersebut. Jika Anda melihat pada posting blog yang disebutkan di atas ada skrip skrip / gelandangan / docker_web yang menjalankan wadah pengembangan untuk proyek tersebut. Ini memang menggunakan --link pada perintah run docker dan proyek Rails menggunakan variabel lingkungan yang disuntikkan buruh pelabuhan untuk terhubung ke layanan.
Mark Stratmann
1
Saya bisa melihat potensi menggabungkan kedua produk. Gelandangan sebagai pengujian lingkungan dan buruh pelabuhan untuk pembungkus aplikasi. Menggabungkan keduanya Anda dapat menguji satu aplikasi atau unit-test pada banyak skenario. Saya pikir banyak "layanan platform pengujian" menggunakan Vagrant + Docker pada saat itu.
m3nda
8
"Mereka sangat gratis." - Keduanya gratis untuk digunakan, memang.
Underyx
2
Hai @koppor Saya terakhir menggunakan mesin buruh pelabuhan sekitar tiga bulan yang lalu dan belum kembali ke sana. Masalah yang saya miliki adalah bahwa ia memiliki bug dalam berbagi folder dari host host MAC saya ke VM yang menjalankan buruh pelabuhan saat menggunakan driver VMWare. Ini berarti bahwa saya tidak dapat mengedit kode secara lokal di Mac dan memiliki perubahan yang tercermin dalam wadah buruh pelabuhan. Saya tidak tahu apakah mereka sudah memperbaikinya, ketika mereka melakukannya saya memang akan beralih ke sana. Namun saya telah mengalihkan semua orkestrasi wadah saya menjadi buruh pelabuhan sejak menulis jawaban ini
Mark Stratmann
53

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.

GnarlinBrando
sumber
5
Dan di sini ada tautan langsung ke proyek github.com/fgrehm/vagrant-lxc
gertas
46

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.

zainengineer
sumber
23
dunia menjadi gila;) kita bisa menjalankan gelandangan menggunakan penyedia buruh pelabuhan untuk menjalankan wadah buruh pelabuhan di dalam gelandangan
Andrzej Rehmann
@ zainengineer, apakah penyedia Docker untuk Vagrant di Windows masih menggunakan boot2docker atau apakah ia menggunakan beberapa varian Docker Toolbox?
Derek Mahar
@ zainengineer Apakah Anda memiliki beberapa tautan ke contoh ilustrasi (bukan dokumen gelandangan)?
Wlad
16

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:

  • Ambil komponen aplikasi Java / Go dan bangun sebagai wadah (perhatikan, tidak yakin apakah aplikasi harus dibangun di wadah atau dibangun kemudian dipasang ke wadah)
  • Kirim wadah ke VM Vagrant.
  • Ulangi ini untuk semua komponen aplikasi.
  • Iterate pada komponen yang akan dikodekan.
  • Terus menguji mekanisme pengiriman ke VM yang dikelola oleh Vagrant
  • Tidur nyenyak ketika tiba saatnya untuk menyebarkan wadah, bahwa pengujian integrasi terjadi secara terus menerus daripada Docker.

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.

Boyd Hemphill
sumber
apakah Anda punya posting blog tentang ini? sudah hampir dua tahun sekarang, bagaimana kabarnya? masih menggunakan gelandangan dengan buruh pelabuhan atau hanya buruh pelabuhan dan buruh pelabuhan / mesin?
Andrzej Rehmann
Perusahaan tempat saya bekerja diakuisisi dan mereka mengambil semua konten saya @Hoto. Jawaban singkatnya adalah saya menggunakan mesin buruh pelabuhan di rumah untuk proyek kesayangan saya. Di tempat kerja saya adalah <gulp> manajer </gulp> dan tidak banyak melakukan teknologi. Kami tidak memiliki rencana untuk menggunakan Docker sehingga alat kami umumnya adalah Vagrant.
Boyd Hemphill
10

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.

Jairo Andres Velasco Romero
sumber
8

Ada artikel yang sangat informatif di majalah Oracle Java tentang menggunakan Docker dalam kombinasi dengan Vagrant (dan Wayang):

Kesimpulan

Kontainer ringan Docker lebih cepat dibandingkan dengan VM klasik dan telah menjadi populer di kalangan pengembang dan sebagai bagian dari inisiatif CD dan DevOps. Jika tujuan Anda adalah isolasi, Docker adalah pilihan yang sangat baik. Vagrant adalah manajer VM yang memungkinkan Anda untuk skrip konfigurasi masing-masing VM serta melakukan penyediaan. Namun, itu masih tergantung pada VM pada VirtualBox (atau manajer VM lain) dengan overhead yang relatif besar. Ini mengharuskan Anda untuk memiliki hard drive idle yang dapat menjadi besar, membutuhkan banyak RAM, dan kinerja dapat suboptimal. Docker menggunakan cgroup kernel dan isolasi namespace melalui LXC. Ini berarti Anda menggunakan kernel yang sama dengan host dan sistem ile yang sama. Vagrant adalah tingkat di atas Docker dalam hal abstraksi, sehingga mereka tidak benar-benar sebanding. Alat manajemen konfigurasi seperti Wayang banyak digunakan untuk menyediakan lingkungan target. Menggunakan kembali solusi berbasis Wayang yang ada mudah dengan Docker. Anda juga dapat mengiris solusi Anda, sehingga infrastrukturnya dilengkapi dengan Wayang; middleware, aplikasi bisnis itu sendiri, atau keduanya disediakan dengan Docker; dan Docker dibungkus oleh Vagrant. Dengan rangkaian alat ini, Anda dapat melakukan yang terbaik untuk skenario Anda.

Cara membangun, menggunakan, dan mengatur wadah Docker di DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0

Adrian Krebs
sumber
1
Begitu banyak yang hilang
Paul Verest