Should I use Vagrant or Docker for creating an isolated environment?
I use Ubuntu for development and deployment and have a need for creating an isolated environment.
I am considering either Vagrant or Docker for this purpose. What are the pros and cons, or how do these solutions compare?
Disclaimer: I wrote Vagrant! But because I wrote Vagrant, I spend most of my time living in the DevOps world which includes software like Docker. I work with a lot of companies using Vagrant and many use Docker, and I see how the two interplay.
Before I talk too much, a direct answer: in your specific scenario (yourself working alone, working on Linux, using Docker in production), you can stick with Docker alone and simplify things. In many other scenarios (I discuss further), it isn't so easy.
It isn't correct to directly compare Vagrant to Docker. In some scenarios, they do overlap, and in the vast majority, they don't. Actually, the more apt comparison would be Vagrant versus something like Boot2Docker (minimal OS that can run Docker). Vagrant is a level above Docker in terms of abstractions, so it isn't a fair comparison in most cases.
Vagrant launches things to run apps/services for the purpose of development. This can be on VirtualBox, VMware. It can be remote like AWS, OpenStack. Within those, if you use containers, Vagrant doesn't care, and embraces that: it can automatically install, pull down, build, and run Docker containers, for example. With Vagrant 1.6, Vagrant has docker-based development environments, and supports using Docker with the same workflow as Vagrant across Linux, Mac, and Windows. Vagrant doesn't try to replace Docker here, it embraces Docker practices.
Docker specifically runs Docker containers. If you're comparing directly to Vagrant: it is specifically a more specific (can only run Docker containers), less flexible (requires Linux or Linux host somewhere) solution. Of course if you're talking about production or CI, there is no comparison to Vagrant! Vagrant doesn't live in these environments, and so Docker should be used.
귀사에서 모든 프로젝트에 대해 도커 컨테이너만 실행하고 리눅스에서 개발자만 실행하고 있다면, 도커는 분명 귀사를 위해 일할 수 있을 것입니다!
그렇지 않을 경우, 비즈니스/생산성 측면에서 실질적인 이점이 있는 Vagrant가 제공해야 할 많은 것을 잃게 되므로 Docker를 단독으로 사용하는 것은 이점이 없다고 봅니다.
Vagrant는 VirtualBox, VMware, AWS, OpenStack 등의 시스템을 실행할 수 있습니다.필요한 게 뭐든 상관없어 바그란트가 발사할 수 있어요Docker를 사용하는 경우 Vagrant는 이 중 하나에 Docker를 설치할 수 있으므로 해당 용도로 사용할 수 있습니다.
Vagrant는 모든 프로젝트에 대한 단일 워크플로우입니다.다른 말로 하자면, 사람들이 도커 컨테이너에 있든 없든 간에 프로젝트를 실행하기 위해 배워야 하는 것은 한 가지일 뿐입니다.예를 들어, 미래에 도커와 직접 경쟁할 경쟁자가 발생한다면 바그란트도 이를 실행할 수 있을 것입니다.
Vagrant는 Windows(XP로 돌아가기), Mac(10.5로 돌아가기), Linux(커널 2.6으로 돌아가기)에서 작동합니다.세 경우 모두 워크플로우는 동일합니다.도커를 사용하는 경우 Vagrant는 이 세 가지 시스템 모두에서 도커를 실행할 수 있는 시스템(VM 또는 원격)을 시작할 수 있습니다.
Vagrant는 네트워킹 및 동기화 폴더와 같은 고급 또는 중요하지 않은 것들을 구성하는 방법을 알고 있습니다.예를 들어, Vagrant는 정적 IP를 시스템 또는 포워드 포트에 연결하는 방법을 알고 있으며, 어떤 시스템(VirtualBox, VMware 등)을 사용하든 구성은 동일합니다.동기화된 폴더의 경우 Vagrant는 로컬 파일을 원격 시스템에 전달하는 여러 메커니즘(VirtualBox 공유 폴더, NFS, rsync, Samba [plugin] 등)을 제공합니다.Docker를 사용하는 경우, Vagrant가 없는 VM으로 Docker를 사용하는 경우에도 수동으로 이 작업을 수행하거나 Vagrant를 재창조해야 합니다.
Vagrant 1.6은 도커 기반 개발 환경에 대한 1등급 지원을 제공합니다.이렇게 하면 Linux에서 가상 시스템이 시작되지 않고 Mac 및 윈도우즈에서 가상 시스템이 자동으로 시작됩니다.결과적으로 Docker와의 협력은 모든 플랫폼에서 통일적인 반면 Vagrant는 네트워킹, 동기화된 폴더 등과 같은 지루한 세부 사항을 여전히 처리합니다.
Vagrant 대신 Docker를 사용하는 것에 찬성하는 의견을 들은 적이 있는 구체적인 반론을 설명하기 위해:
"움직이는 부품이 적습니다." - 예, 모든 프로젝트에 대해 도커를 전용으로 사용할 경우 그럴 수 있습니다.그럼에도 불구하고 도커 잠금을 위해 유연성을 희생하고 있습니다.도커를 과거, 현재, 미래의 프로젝트에 사용하지 않기로 결정하면 더 많은 움직이는 부품이 생길 것입니다.Vagrant를 사용했다면 나머지를 지원하는 움직이는 부품이 하나 있습니다.
"더 빨라졌다!" - Linux 컨테이너를 실행할 수 있는 호스트가 있으면 Docker는 컨테이너 실행 속도가 가상 머신을 실행하는 속도보다 훨씬 빠릅니다.하지만 가상 머신(또는 원격 머신)을 시작하는 것은 일회성 비용입니다.하루 동안 대부분의 Vagrant 사용자는 VM을 실제로 파괴하지 않습니다.이것은 개발 환경에 대한 이상한 최적화입니다.도커가 정말 빛을 발하는 생산 과정에서 컨테이너를 빠르게 위/아래로 회전시켜야 한다는 것을 이해합니다.
저는 이제 도커를 바그란트와 비교하는 것이 매우 어렵다는 것을 알 수 있기를 바랍니다.개발 환경의 경우 Vagrant가 더 추상적이고 더 일반적입니다.도커(그리고 바그란트처럼 행동할 수 있는 다양한 방법)는 바그란트가 제공하는 다른 모든 것을 무시한 채 바그란트의 구체적인 사용 사례입니다.
결론적으로: 매우 구체적인 사용 사례에서 도커는 Vagrant의 대체 가능성이 확실합니다.대부분의 사용 사례에서는 그렇지 않습니다.부랑자는 도커를 사용하는 것을 방해하는 것이 아니라 실제로 그러한 경험을 보다 원활하게 만들기 위해 할 수 있는 일을 합니다.만약 이것이 사실이 아니라면, 바그란트의 목표는 어떤 시스템과도 똑같이 잘 작동하는 것이기 때문에, 저는 이것들을 개선하기 위한 제안들을 기꺼이 받아들일 것입니다.
이것이 일을 해결하기를 바랍니다!
저는 도커의 저자입니다.
간단히 말하면, 기계를 관리하려면 Vagrant를 사용해야 합니다.그리고 응용프로그램 환경을 구축하고 실행하려면 Docker를 사용해야 합니다.
Vagrant는 가상 머신을 관리하기 위한 도구입니다.도커(Docker)는 애플리케이션을 경량 컨테이너에 패키징하여 구축하고 배포하기 위한 도구입니다.컨테이너는 종속성(실행 파일, 라이브러리, 구성 파일 등)과 함께 거의 모든 소프트웨어 구성 요소를 보유할 수 있으며, 보장되고 반복 가능한 런타임 환경에서 실행할 수 있습니다.이를 통해 한 번만 앱을 구축하고 어디에든 배포할 수 있습니다. 테스트를 위해 랩톱에, 실시간 배포를 위해 여러 서버에 설치하는 등.
리눅스에서 도커만 사용할 수 있다는 것은 일반적인 오해입니다.그렇지 않습니다. Mac 및 Windows에 도커를 설치할 수도 있습니다.Mac에 설치하면 Docker는 컨테이너의 래퍼 역할을 하는 작은 Linux VM(디스크에서 25MB!)을 번들로 제공합니다.설치한 후에는 완전히 투명해집니다. 도커 명령줄을 정확히 동일한 방법으로 사용할 수 있습니다.따라서 매우 가볍고 테스트하기 쉽고 이동하기 쉬운 컨테이너를 사용하여 애플리케이션을 테스트하고 개발할 수 있으며(예: 재사용 가능한 컨테이너를 도커 커뮤니티와 공유하려면 https://hub.docker.com 를 참조), 가상 머신을 관리하는 데 필요한 세부 사항에 대해 걱정할 필요가 없습니다.어쨌든 목적을 위한 수단일 뿐인 ines.
이론적으로 바그란트를 도커의 추상화 레이어로 사용할 수 있습니다.저는 두 가지 이유로 이에 반대할 것을 권합니다.
첫째, 바그란트는 도커에게 좋은 추상화가 아닙니다.Vagrant는 가상 머신을 관리하도록 설계되었습니다.도커는 애플리케이션 런타임을 관리하도록 설계되었습니다.즉, 도커는 설계상 응용프로그램과 더 풍부한 방식으로 상호 작용할 수 있으며 응용프로그램 런타임에 대한 더 많은 정보를 가지고 있습니다.Docker의 기본 요소는 프로세스, 로그 스트림, 환경 변수 및 구성 요소 간 네트워크 링크입니다.Vagrant의 기본 요소는 시스템, 블록 장치 및 ssh 키입니다.Vagrant는 스택에서 더 낮게 위치하며 컨테이너와 상호 작용할 수 있는 유일한 방법은 다른 종류의 컴퓨터인 것처럼 가장하여 "부팅"하고 "로그인"할 수 있습니다.물론, 도커 플러그인으로 부랑자를 입력하면 좋은 일이 일어날 겁니다.도커가 할 수 있는 모든 것을 대체할 수 있습니까?토박이 도커를 며칠 동안 먹어보고 직접 찾아보세요 :)
둘째, 락인 논쟁."바그란트를 추상화로 사용하면 도커에 갇히지 않습니다!"기계를 관리하도록 설계된 Vagrant의 관점에서 보면, 컨테이너는 단지 다른 종류의 기계가 아닌가요?Amazon EC2 및 VMware와 마찬가지로 프로비저닝 툴을 특정 벤더와 연결시키지 않도록 주의해야 합니다.이렇게 하면 잠금이 발생합니다. 바그란트와 함께 모든 것을 추상화하는 것이 더 좋습니다.이것이 도커의 핵심을 완전히 빗나간다는 것만 빼면요.도커는 컴퓨터를 프로비저닝하는 것이 아니라 애플리케이션을 어디든 떨어뜨릴 수 있는 가벼운 휴대용 런타임으로 감싸줍니다.
응용프로그램의 런타임을 선택하는 방법은 컴퓨터를 프로비저닝하는 방법과 무관합니다.예를 들어, 다른 사용자가 프로비저닝한 시스템(예: 시스템 관리자가 구축한 EC2 인스턴스)에 애플리케이션을 배포하거나, Vagrant가 프로비저닝할 수 없는 베어 메탈 시스템에 애플리케이션을 배포하는 경우가 매우 흔합니다.반대로 응용 프로그램 개발과 무관한 시스템(예: Windows IIS 바로 사용 가능한 상자 등)을 프로비저닝하는 데 Vagrant를 사용할 수도 있습니다.또는 Vagrant를 사용하여 Docker를 사용하지 않는 프로젝트에 대해 시스템을 프로비저닝할 수도 있습니다. 예를 들어 종속성 관리 및 샌드박스 작업에 루비젬과 rvm을 함께 사용할 수도 있습니다.
요약: Vagrant는 시스템을 관리하기 위한 것이고, Docker는 애플리케이션 환경을 구축하고 실행하기 위한 것입니다.
고립이 목적이라면 도커가 당신이 원하는 것이라고 생각합니다.
Vagrant는 가상 시스템 관리자입니다.가상 시스템 구성과 프로비저닝을 스크립팅할 수 있습니다.그러나 VirtualBox(또는 다른 시스템)에 의존하는 가상 시스템은 여전히 막대한 오버헤드를 가지고 있습니다.따라서 대용량의 하드 드라이브 파일이 필요하고 많은 램이 필요하며 성능이 좋지 않을 수도 있습니다.
반면 도커는 LXC를 통해 커널 cgroup과 네임스페이스를 사용합니다.호스트와 동일한 커널 및 동일한 파일 시스템을 사용하고 있음을 의미합니다.Dockerfile을 사용할 수 있습니다.docker build
명령을 실행하여 컨테이너의 프로비저닝 및 구성을 처리합니다.도커 파일을 만드는 방법에 대한 예는 docs.docker.com 에 있습니다. 매우 직관적입니다.
Vagrant를 사용할 수 있는 유일한 이유는 Ubuntu 박스에서 BSD, Windows 또는 기타 리눅스가 아닌 개발을 해야 하는 경우입니다.그렇지 않으면 도커를 찾아갑니다.
저는 제가 도커에 대한 경험이 없다는 것을 인정하는 것으로 답변의 서문을 시작합니다. 많은 관심을 끌고 있는 정말 깔끔한 해결책에 대한 열렬한 관찰자로서 외에는 말이죠.
저는 바그랑트에 대한 경험이 꽤 있고 적극적으로 추천할 수 있습니다.LXC 기반이 아니라 VM 기반이라는 점에서 확실히 더 비중 있는 솔루션입니다.하지만 괜찮은 노트북(8GB RAM, i5/i7 CPU)이 개발 툴링과 함께 Vagrant/VirtualBox를 사용하여 VM을 실행하는 데 문제가 없다는 사실을 알게 되었습니다.
Vagrant와 함께 제공하는 가장 좋은 점 중 하나는 자동 구성을 위한 Puppet/Chef/shell 스크립트와의 통합입니다.이러한 옵션 중 하나를 사용하여 프로덕션 환경을 구성하는 경우 원하는 대로 동일한 개발 환경을 만들 수 있습니다.
Vagrant의 또 다른 좋은 점은 애플리케이션 코드와 함께 Vagrant 파일을 버전화할 수 있다는 것입니다.이는 팀의 다른 모든 사용자가 이 파일을 공유할 수 있으며 모든 사용자가 동일한 환경 구성으로 작업할 수 있다는 것을 의미합니다.
흥미롭게도, 바그란트와 도커는 사실 무료일지도 모릅니다.다양한 가상화 프로바이더를 지원하기 위해 Vagrant를 확장할 수 있으며, Docker도 가까운 미래에 지원을 받을 수 있는 프로바이더 중 하나일 수 있습니다.이 주제에 대한 최근의 논의는 https://github.com/dotcloud/docker/issues/404 를 참조하십시오.
그들은 매우 상호보완적입니다.
저는 몇 달 전부터 모든 프로젝트에 VirtualBox, Vagrant, Docker를 조합하여 사용하고 있으며, 다음과 같은 이점을 강하게 느끼고 있습니다.
Vagrant에서는 모든 Chef 단독 프로비저닝을 완전히 제거할 수 있으며, Vagrant 파일에서 필요한 작업은 도커를 설치하는 단일 소형 셸 스크립트를 실행하는 시스템만 준비하면 됩니다.이는 모든 프로젝트의 Vagrant 파일이 거의 동일하고 매우 간단하다는 것을 의미합니다.
여기 전형적인 Vagrant 파일이 있습니다.
# -*- 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
도커를 설치하는 부트스트랩 파일은 다음과 같습니다.
#!/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
이제 필요한 모든 서비스를 실행하려면 다음과 같이 보이는 docker_start 스크립트가 있습니다.
#!/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"
이 예에서는 MongoDB, Elastis 검색, RabbitMQ 및 Memcached를 실행하고 있습니다.
도커가 아닌 셰프 단독 구성은 훨씬 더 복잡할 것입니다.
운영 체제로 전환할 때 마지막으로 얻을 수 있는 큰 이점은 개발 환경을 호스트의 인프라로 전환하는 것으로, 도커를 실행할 수 있는 구성만 충분하다는 점에서 호스트의 인프라스트럭처로 전환하는 것입니다.
당신이 관심이 있다면 나는 나의 웹사이트에 개발환경에 대한 더 자세한 기사를 가지고 있습니다.
Implementing A Vagrant / Docker Development Environment
Vagrant-lxc is a plugin for Vagrant that let's you use LXC to provision Vagrant. It does not have all the features that the default vagrant VM (VirtualBox) has but it should allow you more flexibility than docker containers. There is a video in the link showing its capabilities that is worth watching.
With Vagrant now you can have Docker as a provider. http://docs.vagrantup.com/v2/docker/. Docker provider can be used instead of VirtualBox or VMware.
Please note that you can also use Docker for provisioning with Vagrant. This is very different than using Docker as a provider. http://docs.vagrantup.com/v2/provisioning/docker.html
This means you can replace Chef or Puppet with Docker. You can use combinations like Docker as provider (VM) with Chef as provisioner. Or you can use VirtualBox as provider and Docker as provisioner.
Using both is an important part of application delivery testing. I am only beginning to get involved with Docker and thinking very hard about an application team that has terrible complexity in building and delivering its software. Think of a classic Phoenix Project / Continuous Delivery situation.
The thinking goes something like this:
- Take a Java/Go application component and build it as a container (note, not sure if the app should be built in the container or built then installed to the container)
- Deliver the container to a Vagrant VM.
- Repeat this for all application components.
- Iterate on the component(s) to code against.
- Continuously test the delivery mechanism to the VM(s) managed by Vagrant
- Sleep well knowing when it is time to deploy the container, that integration testing was occurring on a much more continuous basis than it was before Docker.
This seems to be the logical extension of Mitchell's statement that Vagrant is for development combined with Farley/Humbles thinking in Continuous Delivery. If I, as a developer, can shrink the feedback loop on integration testing and application delivery, higher quality and better work environments will follow.
The fact that as a developer I am constantly and consistently delivering containers to the VM and testing the application more holistically means that production releases will be further simplified.
So I see Vagrant evolving as a way of leveraging some of the awesome consequences Docker will have for app deployment.
Definitely Docker for the win!
As you may know Vagrant is for virtual machine management whereas Docker is for software containers management. If you are not aware of the difference, here is: A software container can share the same machine and kernel with other software containers. Using containers you save money because you don't waste resources on multiple operating systems (kernels), you can pack more software per server keeping a good degree of isolation.
Of course is a new discipline to care with its own pitfals and challenges.
Go for Docker Swarm if your requirements cross the single machine resources limit.
There is a really informative article in the actual Oracle Java magazine about using Docker in combination with Vagrant (and Puppet):
Conclusion
Docker’s lightweight containers are faster compared with classic VMs and have become popular among developers and as part of CD and DevOps initiatives. If your purpose is isolation, Docker is an excellent choice. Vagrant is a VM manager that enables you to script configurations of individual VMs as well as do the provisioning. However, it is sill a VM dependent on VirtualBox (or another VM manager) with relatively large overhead. It requires you to have a hard drive idle that can be huge, it takes a lot of RAM, and performance can be suboptimal. Docker uses kernel cgroups and namespace isolation via LXC. This means that you are using the same kernel as the host and the same ile system. Vagrant is a level above Docker in terms of abstraction, so they are not really comparable. Configuration management tools such as Puppet are widely used for provisioning target environments. Reusing existing Puppet-based solutions is easy with Docker. You can also slice your solution, so the infrastructure is provisioned with Puppet; the middleware, the business application itself, or both are provisioned with Docker; and Docker is wrapped by Vagrant. With this range of tools, you can do what’s best for your scenario.
How to build, use and orchestrate Docker containers in DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0
ReferenceURL : https://stackoverflow.com/questions/16647069/should-i-use-vagrant-or-docker-for-creating-an-isolated-environment
'programing' 카테고리의 다른 글
자바스크립트에서 이미지를 캐시하는 방법 (0) | 2023.09.13 |
---|---|
커서를 선언하는 올바른 방법은 무엇입니까? (0) | 2023.09.13 |
Android에서 다른 조각으로 이동한 후 탐색 스택을 지우는 방법 (0) | 2023.09.13 |
행이 없는 경우 행을 삽입하는 방법, 그렇지 않으면 MariaDB에서 두 경우 모두 ID를 선택하고 반환하는 방법은 무엇입니까? (0) | 2023.09.13 |
지난 5년간 조회 (0) | 2023.09.13 |