Yalıtılmış bir ortam oluşturmak için Vagrant veya Docker kullanmalı mıyım? [kapalı]


2083

Geliştirme ve dağıtım için Ubuntu kullanıyorum ve yalıtılmış bir ortam yaratmaya ihtiyacım var.

Bu amaçla Vagrant veya Docker'ı düşünüyorum. Artıları ve eksileri nelerdir veya bu çözümler nasıl karşılaştırılır?


27
Her ikisi de şimdi birleştirilebilir: docs.vagrantup.com/v2/provisioning/docker.html
Alp

78
Sorunuz her iki yazarın da cevaplarını alacak kadar şanslı: Mitchell ve Solomon Hykes
itsazzad

4
Yeni bir özet vermek istiyorum - soru çoğunlukla yanlış. Doğru soru şudur: İzole edilmiş bir ortam oluşturmak için Vagrant veya docker-compose kullanmalı mıyım? Cevap Vagrant ve docker-compose, ortamları tanımlamakla aynı görevi yerine getirir ve bunun yerine Docker'ı Virtualbox ile karşılaştırmanız gerekir. Fark, Vagrant'ın Docker, VMWare, Windows, Linux veya OSX'te Virtualbox gibi herhangi bir sanallaştırmayı kullanabilmesi, ancak docker-compose'un sadece Linux tabanlı Docker görüntülerini kullanabilmesidir.
PHZ.fi-Pharazon

Benim için cevap "Düzenli çalışma aktivitelerinde hız sizin için ne kadar önemli" dir. Vagrant'ı Docker'dan daha yavaş buluyorum. Docker'da, özellikle ilk çekmeden sonra, docker'ın önbellek ve katmanlar yaklaşımı, onu bir geliştirici olarak kullanmamın en kolay ve en hızlı olmasını sağlıyor
Michael Durrant

Yanıtlar:


1155

Amacınız izolasyonsa, Docker'ın istediğiniz şey olduğunu düşünüyorum.

Vagrant sanal bir makine yöneticisidir. Sağlamanın yanı sıra sanal makine yapılandırmasını da komut dosyası oluşturmanıza olanak tanır. Ancak, hala bağlı bir sanal makine VirtualBox'a (veya diğerlerine) büyük bir ek yüke . Büyük olabilen bir sabit sürücü dosyasına sahip olmanızı gerektirir, çok fazla koç alır ve performans çok iyi olmayabilir.

Docker ise LXC aracılığıyla çekirdek grubunu ve ad boşluğunu kullanıyor . Bu, anasistem ile aynı çekirdeği ve aynı dosya sistemini kullandığınız anlamına gelir. Kapsayıcınızın docker buildtemel hazırlığını ve yapılandırmasını işlemek için Dockerfile komutunu kullanabilirsiniz . Docs.docker.com adresinde Dockerfile dosyanızı nasıl oluşturacağınıza dair bir örnek var ; çok sezgisel.

Vagrant'ı kullanmak isteyebilmenizin tek nedeni, Ubuntu kutunuzda BSD, Windows veya başka bir Linux dışı geliştirme yapmanız gerektiğidir. Aksi takdirde Docker'a gidin.


13
Maalesef henüz değil. 32 bit bir sistemdeyseniz, bağlantı istasyonunu çalıştırmak için 64 bit konuk sistemine sahip bir VM'ye ihtiyacınız olacaktır. Bununla birlikte, go1.1 ile 32 bit desteği daha iyi olur ve
docker'ın

8
Bu Mac ve Windows için geçerlidir, ancak docker 0.7'den beri herhangi bir linux dağıtımı iyi çalışır. Eğer çalışmayan bir tanesini biliyorsanız, lütfen bana bildirin. Ayrıca, bir Mac veya Windows yığınınız yoksa (ki bu olası değildir, ancak olabilir), Docker'ı linux üzerinde değil herhangi bir yerde çalıştırmak istemezsiniz. Docker istemcisi Mac üzerinde iyi çalışıyor, yakında BSD üzerinde çalışmalı ve arka plan programı BSD, Solaris ve Mac'i destekleyecek.
creack

9
Birinin bu yorumları okuması durumunda, Docker'ın 12 gün önce ver1.0'a çarptığını ( blog.docker.com/2014/06/its-here-docker-1-0 ) ve çok sayıda farklı platformun kararlı olduğunu bilmelisiniz ve şimdi desteklenmektedir ( docs.docker.com/installation )
JorgeArtware

17
vagrant LXC ve liman hizmet sağlayıcısına sahiptir. Ancak - Vagrant ve liman işçisi temelde farklı şeylerdir. Vagrant tamamen geliştirme ortamları için, docker sadece üretim ve Linux için.
Dannyboy

2
Docker şimdi Windows 10 Pro ve üstü ve Windows Server 2016 üzerinde çalışıyor. Windows 10 Home'dan Windows 10 Pro'ya yeni yükseltme yaptım ve docker uygulamasını yükledim. Artık Windows 10'da Linux docker görüntülerini çalıştırabilirim.
PrestonDocks

2339

Feragatname: Vagrant yazdım! Ama Vagrant yazdığım için, zamanımın çoğunu Docker gibi yazılımlar içeren DevOps dünyasında yaşıyorum. Vagrant kullanan pek çok şirketle çalışıyorum ve birçoğu Docker kullanıyor ve bu iki etkileşimin nasıl olduğunu görüyorum.

Çok fazla konuşmadan önce doğrudan bir cevap: özel senaryoda (tek başına çalışmak, Linux üzerinde çalışmak, Docker'ı üretimde kullanmak), sadece Docker'a sadık kalabilir ve işleri basitleştirebilirsiniz. Diğer birçok senaryoda (daha fazla tartışacağım), o kadar kolay değil.

Vagrant'ı Docker ile doğrudan karşılaştırmak doğru değildir. Bazı senaryolarda örtüşürler ve büyük çoğunluğunda yoktur. Aslında, daha uygun karşılaştırma Vagrant'a karşı Boot2Docker (Docker'ı çalıştırabilen minimum işletim sistemi) olacaktır. Vagrant soyutlamalar açısından Docker'ın üzerinde bir seviyedir, bu nedenle çoğu durumda adil bir karşılaştırma değildir.

Vagrant, geliştirme amacıyla uygulamaları / hizmetleri çalıştırmak için bir şeyler başlatır. Bu VirtualBox, VMware üzerinde olabilir. AWS, OpenStack gibi uzak olabilir. Bunların içinde, kaplar kullanırsanız, Vagrant bunu umursamaz ve kucaklar: örneğin Docker kaplarını otomatik olarak kurabilir, aşağı çekebilir, oluşturabilir ve çalıştırabilir. Vagrant 1.6 ile, Vagrant liman işçisi tabanlı geliştirme ortamlarına sahiptir ve Docker'ı Linux, Mac ve Windows'ta Vagrant ile aynı iş akışıyla kullanmayı destekler. Vagrant, Docker'ı burada değiştirmeye çalışmaz, Docker uygulamalarını kucaklar.

Docker özellikle Docker kaplarını çalıştırır. Doğrudan Vagrant ile karşılaştırıyorsanız: özellikle daha spesifik (yalnızca Docker kapsayıcılarını çalıştırabilir), daha az esnek (bir yerde Linux veya Linux ana bilgisayar gerektirir) çözümüdür. Elbette üretim veya CI hakkında konuşuyorsanız, Vagrant ile karşılaştırılamaz! Vagrant bu ortamlarda yaşamıyor ve bu nedenle Docker kullanılmalı.

Kuruluşunuz tüm projeleri için yalnızca Docker kapsayıcıları çalıştırıyorsa ve yalnızca Linux'ta çalışan geliştiriciler varsa, tamam, Docker kesinlikle sizin için çalışabilir!

Aksi takdirde, Vagrant'ın sunduğu gerçek iş / üretkenlik avantajlarına sahip birçok şeyi kaybettiğiniz için Docker'ı tek başına kullanmaya çalışmanın bir faydasını görmüyorum:

  • Vagrant, VirtualBox, VMware, AWS, OpenStack vb. Makineleri başlatabilir. Neye ihtiyacınız olduğu önemli değil, Vagrant başlatabilir. Docker kullanıyorsanız, Vagrant Docker'ı bunlardan herhangi birine yükleyebilir, böylece bunları bu amaç için kullanabilirsiniz.

  • Vagrant, tüm projeleriniz için tek bir iş akışıdır. Ya da başka bir deyişle, bir Docker kapsayıcısında olsun ya da olmasın, insanların bir projeyi yürütmeyi öğrenmek zorunda oldukları tek şeydir. Örneğin, gelecekte bir yarışmacı doğrudan Docker ile rekabet etmek için ortaya çıkarsa, Vagrant bunu da çalıştırabilir.

  • Vagrant Windows (XP'ye geri dön), Mac (10.5'e geri dön) ve Linux (geri 2.6 çekirdeğine) üzerinde çalışır. Her üç durumda da, iş akışı aynıdır. Docker kullanıyorsanız, Vagrant, Docker'ı bu sistemlerin üçünde çalıştırabilen bir makine (VM veya uzaktan kumanda) başlatabilir.

  • Vagrant, ağ oluşturma ve klasörleri eşitleme gibi bazı gelişmiş veya önemsiz şeyleri nasıl yapılandıracağını bilir. Örneğin: Vagrant, bir makineye veya iletme bağlantı noktalarına nasıl statik bir IP ekleneceğini bilir ve hangi sistemi kullanırsanız kullanın (VirtualBox, VMware, vb.) Senkronize klasörler için, Vagrant yerel ayarlarınızı almak için birden fazla mekanizma sağlar dosyaları uzak makineye aktarın (VirtualBox paylaşılan klasörleri, NFS, rsync, Samba [eklenti], vb.). Docker, hatta Vagrant'sız bir VM'li Docker kullanıyorsanız, bunu manuel olarak yapmanız veya bu durumda Vagrant'ı yeniden icat etmesi gerekir.

  • Vagrant 1.6, liman işçisi tabanlı geliştirme ortamları için birinci sınıf desteğe sahiptir . Bu, Linux'ta sanal bir makine başlatmaz ve Mac ve Windows'ta otomatik olarak bir sanal makine başlatır. Sonuçta, Docker ile çalışmanın tüm platformlarda aynı olması, Vagrant ise ağ oluşturma, senkronize edilen klasörler gibi şeylerin yorucu ayrıntılarını hala ele alıyor.

Vagrant yerine Docker kullanmak lehine duyduğum belirli karşı argümanları ele almak için:

  • "Daha az hareketli parça" - Evet, Docker'ı her proje için özel olarak kullanıyorsanız, olabilir. O zaman bile, Docker kilitlenmesi için esneklikten ödün veriyor. Docker'ı herhangi bir proje, geçmiş, şimdiki zaman veya gelecek için kullanmaya karar verirseniz, daha fazla hareketli parçaya sahip olursunuz. Vagrant kullandıysanız, gerisini destekleyen hareketli bir parçaya sahipsiniz.

  • "Bu daha hızlı!" - Linux kapsayıcılarını çalıştırabilecek bir ana makineye sahip olduğunuzda, Docker bir kapsayıcıyı çalıştırırken kesinlikle herhangi bir sanal makinenin başlatmasından daha hızlıdır. Ancak sanal bir makinenin (veya uzak makinenin) başlatılması tek seferlik bir maliyettir. Gün boyunca, çoğu Vagrant kullanıcısı sanal makinelerini asla yok etmiyor. Geliştirme ortamları için garip bir optimizasyon. Docker'ın gerçekten parladığı üretimde, konteynerleri hızla yukarı / aşağı döndürme ihtiyacını anlıyorum.

Umarım şimdi Docker'ı Vagrant ile karşılaştırmanın çok zor olduğunu ve doğru olmadığına inanıyorum. Geliştirme ortamları için Vagrant daha soyut, daha geneldir. Docker (ve Vagrant gibi davranmanın çeşitli yolları) Vagrant'ın sunduğu her şeyi göz ardı ederek Vagrant'ın belirli bir kullanım örneğidir.

Sonuç olarak: son derece spesifik kullanım durumlarında Docker kesinlikle Vagrant'ın yerine geçebilir. Çoğu kullanım durumunda, değildir. Vagrant, Docker kullanımınızı engellemez; aslında bu deneyimi daha pürüzsüz hale getirmek için elinden geleni yapıyor. Bunun doğru olmadığını görürseniz, Vagrant'ın amacı herhangi bir sistemle eşit derecede iyi çalışmak olduğundan, şeyleri iyileştirmek için öneriler almaktan memnuniyet duyarım.

Umarım bu şeyleri temizler!


4
@JaredMarkell Sanırım belki de Protobox gibi Vagrant makinelerini yönetmesine izin veren web tabanlı bir hizmet arıyor .
Ryan Kennedy

73
@Mitchell Bunu bu kadar ayrıntılı açıkladığınız için teşekkür etmek istedim. Açıkçası tamamen nesnel olmanız imkansızdır, bu yüzden nüansları ve kullanılabilecekleri çeşitli durumları açıklamak için zaman ayırdığınız için teşekkür ederiz. Bugün çeşitli araçlarla ilgili karışıklıkların çoğunun çok fazla örtüştüğü ve birçok insanın birilerinin sadece ne yapmaları gerektiğini söyleyip uygulayabilecekleri tek boyutlu bir çözüm istediklerini düşünüyorum. Cevabınızın güzelliği, temel soruya cevap vermesidir: nasıl yalıtılmış bir ortam oluşturabilirim? (araçlara bakılmaksızın).
Ürdün

4
@JaredMarkell Docker bir REST API'sine sahiptir docs.docker.com/reference/api/docker_remote_api
Tarnay Kálmán

3
@ OğuzÇelikdemir Vagrant bundan daha fazlasını yapabilir. Elbette, her proje için belirli bir sanal makine hazırlarsanız, bu sürecek. Ancak geliştirme sırasında genellikle daha fazla hizmet / arka plan / ayar eklerim (örneğin geliştirme sırasında bir proje için RabbitMQ kullanmaya karar verdiğimde). Tamamen VM yaklaşımı, RabbitMQ kurulu ve yapılandırılmış olarak yeni bir görüntü hazırlamanızı ve geliştiricileri VM'lerini bu yeni görüntüye değiştirmeye zorlar. Vagrant için - Vagrant konfüzyonuna uygun satırlar ekliyorum ve tüm geliştiriciler VM'lerini kolayca yükseltebilirler (kullanarak vagrant provision).
Tomasz Struczyński

5
(Sorumluluğu reddederek "sorumluluk reddi" değil, önemli bir şeyi açığa çıkaran "açıklama" demek istediniz: english.stackexchange.com/q/115850 )
Jerry101

1418

Ben Docker'ın yazarıyım.

Kısa cevap, makineleri yönetmek istiyorsanız Vagrant kullanmanız gerektiğidir. Uygulama ortamları oluşturmak ve çalıştırmak istiyorsanız Docker'ı kullanmalısınız.

Vagrant sanal makineleri yönetmek için bir araçtır. Docker, uygulamaları hafif kaplara paketleyerek uygulamaları oluşturmak ve dağıtmak için bir araçtır. Bir kapsayıcı, bağımlılıkları (yürütülebilir dosyalar, kitaplıklar, yapılandırma dosyaları vb.) İle birlikte hemen hemen tüm yazılım bileşenlerini tutabilir ve bunu garantili ve tekrarlanabilir bir çalışma zamanı ortamında çalıştırabilir. Bu, uygulamanızı bir kez oluşturmayı ve herhangi bir yere dağıtmayı çok kolay hale getirir - test için dizüstü bilgisayarınızda, ardından canlı dağıtım için farklı sunucularda vb.

Linux'ta yalnızca Docker'ı kullanabileceğiniz yaygın bir yanlış anlamadır. Bu yanlış; Mac'e ve Windows'a Docker'ı da yükleyebilirsiniz. Mac'e yüklendiğinde Docker, kabınız için bir sarıcı görevi gören küçük bir Linux VM'yi (diskte 25 MB!) Paketler. Kurulduktan sonra bu tamamen şeffaftır; Docker komut satırını tamamen aynı şekilde kullanabilirsiniz. Bu size her iki dünyanın en iyisini verir: uygulamanızı çok hafif, test edilmesi kolay ve hareket etmesi kolay kapları kullanarak test edebilir ve geliştirebilirsiniz ( yeniden kullanılabilir kapları paylaşmak için bkz. Https://hub.docker.com . Docker topluluğu), ve sanal makineleri yönetmenin kesin bir ayrıntısı için endişelenmenize gerek yok.

Teorik olarak Vagrant'ı Docker için bir soyutlama katmanı olarak kullanmak mümkündür. Buna karşı iki nedenden dolayı tavsiye ederim:

  • Birincisi, Vagrant Docker için iyi bir soyutlama değildir. Vagrant sanal makineleri yönetmek için tasarlanmıştır. Docker bir uygulama çalışma zamanını yönetmek için tasarlanmıştır. Bu, Docker'ın tasarım gereği bir uygulama ile daha zengin şekillerde etkileşime girebileceği ve uygulama çalışma zamanı hakkında daha fazla bilgiye sahip olduğu anlamına gelir. Docker'daki temel öğeler, işlemler, günlük akışları, ortam değişkenleri ve bileşenler arasındaki ağ bağlantılarıdır. Vagrant'taki ilkeller makineler, blok cihazlar ve ssh anahtarlarıdır. Vagrant sadece yığının altına oturur ve bir kapla etkileşime girmenin tek yolu, "önyükleme" yapabileceğiniz ve "giriş yapabileceğiniz" gibi başka bir makine olduğunu iddia etmektir. Yani, bir Docker eklentisi ile "vagrant up" yazabilirsiniz ve oldukça güzel bir şey olacaktır. Docker'ın yapabileceklerinin tam olarak yerine geçebilir mi? Yerli Docker'ı birkaç gün deneyin ve kendiniz görün :)

  • İkincisi, kilitleme argümanı. "Vagrant'ı soyutlama olarak kullanırsanız, Docker'a kilitlenmeyeceksiniz!". Makineleri yönetmek için tasarlanan Vagrant açısından bu mükemmel bir anlam ifade ediyor: konteynerler sadece başka bir makine değil mi? Tıpkı Amazon EC2 ve VMware gibi, tedarik araçlarımızı belirli bir satıcıya bağlamamaya dikkat etmeliyiz! Bu, kilitlenmeyi yaratacaktır - Vagrant ile her şeyi soyutlamak daha iyidir. Bunun dışında Docker'ın amacı tamamen eksik. Docker makine tedarik etmiyor; uygulamanızı her yere bırakılabilen hafif bir taşınabilir çalışma zamanında sarar.

Uygulamanız için hangi çalışma süresinin seçtiğinizin, makinelerinizi nasıl sağladığınızla ilgisi yoktur! Örneğin, uygulamaları başkası tarafından sağlanan makinelere (örneğin, sistem yöneticiniz tarafından dağıtılan bir EC2 örneği, belki de Vagrant kullanarak) veya Vagrant'ın hiç sağlayamayacağı çıplak metal makinelere dağıtmak oldukça sık görülür. Tersine, Vagrant'ı uygulamanızı geliştirmeyle ilgisi olmayan makineleri (örneğin, kullanıma hazır bir Windows IIS kutusu veya benzeri) sağlamak için kullanabilirsiniz. Ya da Vagrant'ı Docker kullanmayan projeler için makine sağlamak için kullanabilirsiniz - belki de bağımlılık yönetimi ve sanal alan için rubygems ve rvm kombinasyonunu kullanırlar.

Özetle: Vagrant makineleri yönetmek içindir ve Docker uygulama ortamlarını oluşturmak ve çalıştırmak içindir.


396
Sadece bu cevabın Vagrant yönlerinin yanlış olduğunu belirtmek istedim. Vagrant makineleri yönetmek için değil, Vagrant geliştirme ortamlarını yönetmek için. Vagrant'ın makineleri döndürmesi çoğunlukla tarihi. Vagrant'ın bir sonraki sürümü, Docker'ı doğrudan ana bilgisayarda veya herhangi bir VM'de (Mac, Win) sağlayıcı olarak kullanarak geliştirici ortamını genişletmek için birinci sınıf desteğe sahiptir. Birisi ne istiyorsa (yine, ana bilgisayarda veya VM'de) ham LXC'yi de döndürebilir. Vagrant, taşınabilir bir geliştirme ortamı oluşturmak için en iyi olanı yapmakla ilgileniyor, bu bir VM oluşturmak ya da olmamak anlamına geliyor.
Mitchell

7
@Davide Bu daha ayrıntılı olarak ele alıyor: vagrantup.com/blog/…
Mitchell

48
"Docker'ı yalnızca Linux'ta kullanabileceğiniz yaygın bir yanlış anlama" Bu doğru olsa da, sadece Docker'da Linux kullanabileceğinizi söylemek doğrudur. Uygulamamı çok çeşitli ortam yapılandırmalarında (farklı veritabanları, php sürümleri, önbellek arka uçları vb.) Uygulayan bir test çalıştırıcısı kurmak istersem, bunu docker kaplarıyla kolayca yapabilirim. Ancak uygulamamın Windows IIS env'de mi yoksa BSD'de mi OSX'de düzgün çalışıp çalışmadığını göremiyorum.
Mixologic


19
Gönderi eski. Vagrant artık Docker'ı sağlayıcı olarak destekliyor. Ve Vagrant ve Docker'ı bloglarında birlikte nasıl kullanabileceğinizi gösteren bazı videolar var .
Aralık'ta sargas

86

Yanıtımı Docker ile hiçbir deneyimim olmadığını itiraf ediyorum, çok çekiş kazanan gerçekten temiz bir çözüm gibi görünen hevesli bir gözlemci olmaktan başka.

Vagrant ile deneyim iyi bir miktar var ve kesinlikle tavsiye. LXC tabanlı yerine VM tabanlı olması açısından kesinlikle daha ağır bir çözümdür. Ancak, iyi bir dizüstü bilgisayar buldum (8 GB RAM, i5 / i7 CPU) geliştirme takımının yanında Vagrant / VirtualBox kullanarak bir VM çalıştırmakta sorun yaşamadım.

Vagrant ile gerçekten harika şeylerden biri, yapılandırmayı otomatikleştirmek için Kukla / Şef / kabuk komut dosyalarıyla entegrasyon . Üretim ortamınızı yapılandırmak için bu seçeneklerden birini kullanıyorsanız, alacağınızla aynı olan bir geliştirme ortamı oluşturabilirsiniz ve bu tam olarak istediğiniz şeydir.

Vagrant ile diğer harika şey, Vagrantfile'ınızı uygulama kodunuzla birlikte versiyonlayabilmenizdir. Bu, ekibinizdeki diğer herkesin bu dosyayı paylaşabileceği ve herkesin aynı ortam yapılandırmasıyla çalışacağından emin olduğunuz anlamına gelir.

İlginçtir, Vagrant ve Docker aslında ücretsiz olabilir. Vagrant farklı sanallaştırma sağlayıcılarını destekleyecek şekilde genişletilebilir ve Docker'ın yakın gelecekte destek alan böyle bir sağlayıcı olması mümkün olabilir. Konuyla ilgili son tartışmalar için bkz. Https://github.com/dotcloud/docker/issues/404 .


7
Çocuklar, docker için deneysel bir vagrant sağlayıcısı yayınladım : github.com/fgrehm/docker-provider .
fgrehm

2
Docker sanallaştırma değildir, ancak aynı ana bilgisayar çekirdeğini kullanarak işletim sistemini kendi kapsayıcısında çalıştırır, diğer VM'ler gibi bir sağlayıcı değildir, bu nedenle docker zaten Vagrant tarafından desteklenir.
Aftab Naveed

1
Docker, altta yatan donanımı dolaylı olarak yeniden kullanan işletim sisteminin kendisinin sanallaştırılmasıdır. Bir kapta çalışan dosya sistemini, ağı ve işlemleri soyutlayıp izole ettiği için sanallaştırmadır.
jose.angel.jimenez

63

Çok tamamlayıcılar.

Birkaç aydır tüm projelerim için VirtualBox, Vagrant ve Docker'ın bir kombinasyonunu kullanıyorum ve aşağıdaki faydaları güçlü bir şekilde hissettim.

Vagrant içinde herhangi bir Chef solo provizyonu tamamen ortadan kaldırabilirsiniz ve vagrant dosyanızı yapmanız gereken tek şey, docker'ı yükleyen tek bir küçük kabuk betiği çalıştıran bir makine hazırlamaktır. Bu, her proje için Vagrant dosyalarının neredeyse aynı ve çok basit olduğu anlamına gelir.

İşte tipik bir Vagrantfile

# -*- 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

Docker'ı yükleyen Bootstrap dosyası şöyle görünür

#!/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

Şimdi çalıştırmam gereken tüm hizmetleri almak için böyle bir şeye benzeyen bir docker_start betiği var

#!/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"

Bu örnekte MongoDB, Elastisearch, RabbitMQ ve Memcached kullanıyorum

Docker olmayan bir Chef solo yapılandırması oldukça karmaşık olacaktır.

Üretim aşamasına geçtiğinizde, geliştirme ortamını, docker'ı çalıştırmak için yeterli yapılandırmaya sahip oldukları için aynı olan bir ana bilgisayar altyapısına çevirerek son büyük bir artı elde edilir.

İlgileniyorsanız, web sitemdeki geliştirme ortamı hakkında daha ayrıntılı bir makalem var.

Vagrant / Docker Geliştirme Ortamını Uygulama


2
Tüm docker_start düzenlemesini yaptınız, ancak kapları birbirine bağlamakla uğraşmadınız. Vagrant altında çalıştırdığınız için sabit kodlu bağlantı noktası numaralarıyla mı gidiyorsunuz?
WineSoaked

6
Merhaba WineSoaked, yukarıdaki örnek aslında tüm bu hizmetleri kullanan kapsayıcı göstermez. Bahsedilen blog yayınına bakarsanız, proje için geliştirme kapsayıcısını başlatan başka bir komut dosyası komut dosyası / vagrant / docker_web var. Bu gerçekten de docker run komutunda --link kullanır ve Rails projesi, hizmetlere bağlanmak için docker enjekte edilmiş ortam değişkenlerini kullanır.
Mark Stratmann

1
Her iki ürünü birleştirme potansiyelini görebiliyorum. Uygulama testi için çevre testi ve docker olarak Vagrant. Her ikisini birleştirerek tek bir uygulamayı veya birim testi birçok escenario üzerinde test edebilirsiniz. Bence "test platformları hizmetleri" çoğu zaman Vagrant + Docker kullanıyor.
m3nda

8
"Onlar çok ücretsiz." - Her ikisini de kullanmak gerçekten ücretsiz.
Underyx

2
Merhaba @koppor En son yaklaşık üç ay önce liman işçisi makine kullandım ve henüz geri dönmedim. Sahip olduğum sorun, MAC ana bilgisayarımdan VMWare sürücüsünü kullanırken VM çalışan docker'a klasör paylaşımında bir hata olmasıydı. Bu, Mac'te yerel olarak kodu düzenleyemediğim ve değişikliklerin docker kapsayıcısına yansıtıldığı anlamına geliyordu. Henüz çözüp çözmediklerini bilmiyorum, yaptıkları zaman buna geçeceğim. Bununla birlikte, bu cevabı yazdıktan sonra tüm konteyner düzenlemelerimi docker compose'e değiştirdim
Mark Stratmann

53

Vagrant-lxc Vagrant için Vagrant sağlamak için LXC kullanmanıza izin veren bir eklentidir. Varsayılan vagrant VM'nin (VirtualBox) sahip olduğu tüm özelliklere sahip değildir, ancak docker kaplarından daha fazla esnekliğe izin vermelidir. Bağlantıda izlemeye değer yeteneklerini gösteren bir video var.



46

Vagrant ile artık Docker'ı sağlayıcı olarak kullanabilirsiniz. http://docs.vagrantup.com/v2/docker/ . VirtualBox veya VMware yerine Docker sağlayıcısı kullanılabilir.

Vagrant ile provizyon yapmak için Docker'ı da kullanabileceğinizi lütfen unutmayın. Bu, Docker'ı sağlayıcı olarak kullanmaktan çok farklıdır. http://docs.vagrantup.com/v2/provisioning/docker.html

Bu, Şef veya Kuklayı Docker ile değiştirebileceğiniz anlamına gelir . Docker gibi kombinasyonları sağlayıcı olarak (VM) sağlayıcı olarak Chef ile kullanabilirsiniz. Veya sağlayıcı olarak VirtualBox ve sağlayıcı olarak Docker'ı kullanabilirsiniz.


23
dünya sadece çıldırdı;) vagrant içinde liman işçisi konteynırları çalıştırmak için liman işçisi sağlayıcı kullanarak vagrant çalıştırabilirsiniz
Andrzej Rehmann

@zainengineer, Windows'ta Vagrant için Docker sağlayıcısı hala boot2docker kullanıyor mu yoksa Docker Toolbox'ın bazı varyantlarını kullanıyor mu?
Derek Mahar

@zainengineer Açıklayıcı örneklere (vagrant dokümanları değil) bağlantılarınız var mı?
wlad

16

Her ikisini de kullanmak, uygulama teslim testinin önemli bir parçasıdır. Sadece Docker ile ilgilenmeye başlıyorum ve yazılımını oluşturma ve sunmada korkunç karmaşıklığa sahip bir uygulama ekibi hakkında çok fazla düşünmeye başladım. Klasik bir Phoenix Projesi / Sürekli Teslim durumunu düşünün.

Düşünme böyle bir şeye gider:

  • Bir Java / Go uygulama bileşenini alın ve bir kapsayıcı olarak oluşturun (not, uygulamanın kapta oluşturulup oluşturulmadığından veya kapsayıcıya kurulup kurulmadığından emin değilsiniz)
  • Kapsayıcıyı bir Vagrant VM'ye teslim edin.
  • Bunu tüm uygulama bileşenleri için tekrarlayın.
  • Kodlanacak bileşen (ler) i yineleyin.
  • Vagrant tarafından yönetilen VM'lere dağıtım mekanizmasını sürekli test edin
  • Kapsayıcıyı kurmanın zamanı geldiğinde iyi uyumak, uyumluluk testinin Docker'dan önceki sürüme göre çok daha sürekli bir şekilde gerçekleştiğini bilmek.

Bu, Mitchell'in Vagrant'ın Sürekli Teslimde Farley / Humbles düşüncesi ile birlikte gelişme amaçlı olduğu yönündeki ifadesinin mantıklı bir uzantısı gibi görünüyor. Bir geliştirici olarak, entegrasyon testi ve uygulama teslimi hakkındaki geri bildirim döngüsünü küçültebilirsem, daha yüksek kalite ve daha iyi çalışma ortamları gelecektir.

Bir geliştirici olarak sürekli ve sürekli olarak VM'ye kapları teslim ettiğim ve uygulamayı daha bütünsel olarak test ettiğim, üretim sürümlerinin daha da basitleştirileceği anlamına geliyor.

Bu yüzden Vagrant'ın geliştiğini Docker'ın uygulama dağıtımı için harika sonuçlarından yararlanmanın bir yolu olarak görüyorum.


şans eseri bunun hakkında bir blog yazısı var mı? neredeyse iki yıl oldu, nasıl gidiyor? hala docker veya sadece docker ve docker-fleat / makine ile vagrant kullanıyor?
Andrzej Rehmann

Çalıştığım şirket satın alındı ​​ve @Hoto'daki tüm içeriğimi indirdiler. Kısa cevap evde evcil hayvan projelerim için evde liman işçisi makine kullanıyorum. İşyerinde <gulp> yöneticisiyim </gulp> ve fazla teknoloji yapmıyorum. Docker'ı kullanma planımız yok, bu nedenle aracımız genellikle Vagrant.
Boyd Hemphill

10

Kazanmak için kesinlikle Docker!

Bildiğiniz gibi Vagrant sanal makine yönetimi için, Docker ise yazılım kapları yönetimi içindir. Farkın farkında değilseniz, işte burada: Bir yazılım kapsayıcısı aynı makineyi ve çekirdeği diğer yazılım kapsayıcılarıyla paylaşabilir. Kapları kullanarak paradan tasarruf edersiniz, çünkü kaynakları birden fazla işletim sisteminde (çekirdeklerde) boşa harcamazsınız, sunucu başına daha fazla yazılım paketleyebilirsiniz.

Tabii ki kendi tuzakları ve zorluklarıyla ilgilenmek için yeni bir disiplin.

Gereksinimleriniz tek makine kaynakları sınırını aşarsa Docker Swarm'a gidin.


8

Gerçek Oracle Java dergisinde Docker'ı Vagrant (ve Kukla) ile birlikte kullanma hakkında gerçekten bilgilendirici bir makale var:

Sonuç

Docker'ın hafif konteynerleri klasik VM'lere kıyasla daha hızlıdır ve geliştiriciler arasında ve CD ve DevOps girişimlerinin bir parçası olarak popüler olmuştur. Amacınız izolasyonsa, Docker mükemmel bir seçimdir. Vagrant, tek tek sanal makinelerin yapılandırmalarını komut dosyası oluşturmanıza ve provizyon yapmanıza olanak tanıyan bir VM yöneticisidir. Bununla birlikte, VirtualBox'a (veya başka bir VM yöneticisine) bağlı bir VM'yi nispeten büyük ek yükü ile eşiklendirir. Büyük olabilen bir sabit sürücü boşta olmanızı gerektirir, çok fazla RAM alır ve performans yetersiz olabilir. Docker, LXC aracılığıyla çekirdek gruplarını ve ad alanı izolasyonunu kullanır. Bu, ana bilgisayar ile aynı çekirdeği ve aynı ile sistemi kullandığınız anlamına gelir. Vagrant soyutlama açısından Docker'ın üzerinde bir seviye, bu yüzden gerçekten karşılaştırılabilir değiller. Kukla gibi yapılandırma yönetimi araçları, hedef ortamları sağlamak için yaygın olarak kullanılır. Docker ile mevcut Kukla tabanlı çözümleri tekrar kullanmak kolaydır. Ayrıca çözümünüzü dilimleyebilirsiniz, böylece altyapı Kukla ile sağlanır; ara katman yazılımı, işletme uygulamasının kendisi veya her ikisi de Docker ile sağlanır; ve Docker Vagrant tarafından sarıldı. Bu araç yelpazesi ile senaryonuz için en iyisini yapabilirsiniz.

DevOps'ta Docker kapsayıcıları nasıl oluşturulur, kullanılır ve düzenlenir http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0


1
Çok fazla t eksikti
Paul Verest
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.