격리 된 환경을 만들기 위해 Vagrant 또는 Docker를 사용해야합니까?

vagrant docker


개발 및 배포에 Ubuntu를 사용하며 격리 된 환경을 만들어야합니다.

이 목적으로 Vagrant 또는 Docker를 고려하고 있습니다. 장단점은 무엇입니까? 또는 이러한 솔루션을 어떻게 비교합니까?





Answer 1 creack


당신의 목적이 고립이라면 Docker가 당신이 원하는 것이라고 생각합니다.

Vagrant는 가상 머신 관리자입니다. 프로비저닝뿐만 아니라 가상 머신 구성을 스크립팅 할 수 있습니다. 그러나 여전히 오버 헤드가 큰 VirtualBox (또는 기타) 에 따라 가상 머신입니다 . 용량이 큰 하드 드라이브 파일이 필요하고 많은 램이 필요하며 성능이 좋지 않을 수 있습니다.

반면 Docker는 LXC 를 통해 커널 cgroup과 네임 스페이스를 사용합니다 . 이는 호스트 및 동일한 파일 시스템과 동일한 커널을 사용하고 있음을 의미합니다. 컨테이너의 프로비저닝 및 구성을 처리하기 위해 dockerfile을 docker build 명령 과 함께 사용할 수 있습니다 . 당신은 예를 들어이 docs.docker.com 당신의 Dockerfile을 만드는 방법에 대한을; 매우 직관적입니다.

Vagrant를 사용할 수있는 유일한 이유는 Ubuntu 상자에서 BSD, Windows 또는 기타 비 Linux 개발을 수행해야하기 때문입니다. 그렇지 않으면 Docker로 이동하십시오.




Answer 2 Mitchell


면책 조항 : 나는 Vagrant를 썼습니다! 그러나 Vagrant를 작성했기 때문에 Docker와 같은 소프트웨어가 포함 된 DevOps 세계에서 대부분의 시간을 보냅니다. Vagrant를 사용하는 많은 회사와 Docker를 사용하는 많은 회사와 협력하고 있으며 두 회사가 어떻게 상호 작용하는지 확인합니다.

너무 많은 이야기를하기 전에 직접 답 하십시오. 특정 시나리오 (자체 작업, Linux 작업, 프로덕션에서 Docker 사용)에서 Docker 만 사용하여 작업을 단순화 할 수 있습니다. 다른 많은 시나리오에서 (나는 더 논의한다) 쉽지 않다.

Vagrant를 Docker와 직접 비교하는 것은 올바르지 않습니다. 어떤 시나리오에서는 그것들이 겹치며 대다수는 그렇지 않습니다. 실제로, 더 적절한 비교는 Vagrant와 Boot2Docker (Docker를 실행할 수있는 최소 OS)와 같은 것입니다. Vagrant는 추상화 측면에서 Docker보다 높은 수준이므로 대부분의 경우 공정한 비교가 아닙니다.

Vagrant는 개발 목적으로 앱 / 서비스를 실행하는 것을 시작합니다. 이것은 VirtualBox, VMware에있을 수 있습니다. AWS, OpenStack과 같이 원격 일 수 있습니다. 그 중에서도 컨테이너를 사용하는 경우 Vagrant는 신경 쓰지 않으며 다음을 수용합니다. 예를 들어 Docker 컨테이너를 자동으로 설치, 풀다운, 빌드 및 실행할 수 있습니다. Vagrant 1.6을 통해 Vagrant는 docker 기반 개발 환경을 가지고 있으며 Linux, Mac 및 Windows에서 Vagrant와 동일한 워크 플로우로 Docker를 사용할 수 있습니다. Vagrant는 Docker를 대체하려고 시도하지 않으며 Docker 관행을 포용합니다.

Docker는 특히 Docker 컨테이너를 실행합니다. Vagrant와 직접 비교하는 경우 : 특히 더 구체적이며 (Docker 컨테이너 만 실행할 수 있음) 덜 유연합니다 (Linux 또는 Linux 호스트가 필요합니다). 물론 생산 또는 CI에 대해 이야기하고 있다면 Vagrant와 비교할 수 없습니다! Vagrant는 이러한 환경에 살지 않으므로 Docker를 사용해야합니다.

조직에서 모든 프로젝트에 대해 Docker 컨테이너 만 실행하고 Linux에서 실행중인 개발자 만있는 경우 Docker가 확실히 효과가 있습니다!

그렇지 않으면, 당신은 실질적인 비즈니스 / 생산성 이점이있는 Vagrant가 제공하는 많은 것을 잃기 때문에 Docker를 혼자 사용하려고 시도하면 이점이 없습니다.

  • Vagrant는 VirtualBox, VMware, AWS, OpenStack 등의 머신을 시작할 수 있습니다. 필요한 것은 중요하지 않습니다. Vagrant가 시작할 수 있습니다. Docker를 사용하는 경우 Vagrant는 Docker를 이들 중 하나에 설치하여 해당 용도로 사용할 수 있습니다.

  • Vagrant는 모든 프로젝트를위한 단일 워크 플로우입니다. 또는 달리 말하면, Docker 컨테이너에 있는지 여부에 관계없이 사람들이 프로젝트를 실행하는 방법을 배워야합니다. 예를 들어, 미래에 경쟁 업체가 Docker와 직접 경쟁하게되면 Vagrant도이를 실행할 수 있습니다.

  • Vagrant는 Windows (XP로 돌아 가기), Mac (10.5로 돌아 가기) 및 Linux (커널 2.6로 돌아 가기)에서 작동합니다. 세 경우 모두 작업 과정이 동일합니다. Docker를 사용하는 경우 Vagrant는 이러한 세 시스템 모두에서 Docker를 실행할 수있는 머신 (VM 또는 원격)을 시작할 수 있습니다.

  • Vagrant는 네트워킹 및 폴더 동기화와 같은 고급 또는 사소한 것을 구성하는 방법을 알고 있습니다. 예를 들어 : Vagrant는 컴퓨터 또는 전달 포트에 고정 IP를 연결하는 방법을 알고 있으며 구성은 동일한 시스템 (VirtualBox, VMware 등)에 관계없이 동일합니다. 동기화 된 폴더에 대해 Vagrant는 로컬을 가져 오는 여러 메커니즘을 제공합니다. 파일을 원격 컴퓨터 (VirtualBox 공유 폴더, NFS, rsync, Samba [plugin] 등)로 가져옵니다. Docker, Vagrant가없는 VM이있는 Docker를 사용하는 경우 수동 으로이 작업을 수행 하거나이 경우 Vagrant를 재발 명해야합니다.

  • Vagrant 1.6은 docker 기반 개발 환경 을 일류 지원 합니다 . Linux에서는 가상 머신이 시작되지 않으며 Mac 및 Windows에서는 가상 머신이 자동으로 실행됩니다. 결과적으로 Docker 작업은 모든 플랫폼에서 균일하며 Vagrant는 네트워킹, 동기화 된 폴더 등과 같은 지루한 세부 사항을 여전히 처리합니다.

Vagrant 대신 Docker를 사용하는 것에 대해 들었던 특정 반박 론을 해결하려면 다음을 수행하십시오.

  • "이동하는 부분이 적다"-예, 모든 프로젝트에 Docker를 독점적으로 사용한다면 가능합니다. 그럼에도 불구하고 Docker lock-in의 유연성을 희생합니다. 과거, 현재 또는 미래의 프로젝트에 Docker를 사용하지 않기로 결정한 경우 움직이는 부분이 더 많습니다. Vagrant를 사용했다면 나머지 부분을 지원하는 움직이는 부분이 있습니다.

  • "더 빠릅니다!" -Linux 컨테이너를 실행할 수있는 호스트가 있으면 Docker는 가상 머신을 시작하는 것보다 컨테이너를 빠르게 실행할 수 있습니다. 그러나 가상 머신 (또는 원격 머신)을 시작하는 것은 일회성 비용입니다. 하루 종일 대부분의 Vagrant 사용자는 실제로 VM을 파괴하지 않습니다. 개발 환경에 대한 이상한 최적화입니다. Docker가 실제로 빛나는 프로덕션 환경에서 컨테이너를 빠르게 스핀 업 / 다운해야한다는 것을 알고 있습니다.

Docker와 Vagrant를 비교하는 것이 매우 어렵다는 것을 분명히 알기를 바랍니다. 개발 환경의 경우 Vagrant는 더 추상적이고 더 일반적입니다. Docker (및 Vagrant처럼 행동 할 수있는 다양한 방법)는 Vagrant가 제공하는 모든 것을 무시하고 Vagrant의 특정 사용 사례입니다.

결론 : 매우 구체적인 사용 사례에서 Docker는 Vagrant를 대체 할 수 있습니다. 대부분의 경우에는 그렇지 않습니다. Vagrant는 Docker 사용을 방해하지 않습니다. 실제로는 그 경험을 더 매끄럽게 만들기 위해 할 수있는 일을합니다. 이것이 사실이 아니라면 Vagrant의 목표는 모든 시스템과 동일하게 작동하는 것이기 때문에 개선 사항을 제안합니다.

희망이 이것들을 정리하기를 바랍니다!




Answer 3 Solomon Hykes


저는 Docker의 저자입니다.

짧은 대답은 컴퓨터를 관리하려면 Vagrant를 사용해야한다는 것입니다. 응용 프로그램 환경을 구축하고 실행하려면 Docker를 사용해야합니다.

Vagrant는 가상 머신을 관리하기위한 도구입니다. Docker는 응용 프로그램을 경량 컨테이너에 패키징하여 빌드 및 배포하기위한 도구입니다. 컨테이너는 거의 모든 소프트웨어 구성 요소와 해당 종속성 (실행 파일, 라이브러리, 구성 파일 등)을 보유하고 보장되고 반복 가능한 런타임 환경에서 실행할 수 있습니다. 따라서 테스트를 위해 랩톱에서 라이브 배포를 위해 다른 서버에서 앱을 한 번 빌드하고 어디서나 배포 할 수 있습니다.

Linux에서만 Docker를 사용할 수 있다는 것은 일반적인 오해입니다. 맞지 않습니다. Mac 및 Windows에 Docker를 설치할 수도 있습니다. Mac에 설치하면 Docker는 작은 Linux VM (디스크의 25MB!)을 컨테이너의 래퍼 역할을합니다. 일단 설치되면 완전히 투명합니다. Docker 명령 줄을 정확히 같은 방식으로 사용할 수 있습니다. 이렇게하면 두 가지 이점을 모두 얻을 수 있습니다. 컨테이너를 사용하여 응용 프로그램을 테스트하고 개발할 수 있습니다. 컨테이너는 매우 가볍고 테스트하기 쉽고 이동하기 쉽습니다 (예 : https://hub.docker.com 과 재사용 가능한 컨테이너를 공유) Docker 커뮤니티)를 사용하면 가상 머신 관리에 대한 세부 사항에 대해 걱정할 필요가 없습니다.

이론적으로 Vagrant를 Docker의 추상화 계층으로 사용할 수 있습니다. 나는 두 가지 이유로 이것을 반대하는 것이 좋습니다.

  • 첫째, Vagrant는 Docker의 추상화가 아닙니다. Vagrant는 가상 머신을 관리하도록 설계되었습니다. Docker는 응용 프로그램 런타임을 관리하도록 설계되었습니다. 즉, Docker는 설계 상 응용 프로그램과보다 다양한 방식으로 상호 작용할 수 있으며 응용 프로그램 런타임에 대한 자세한 정보를 제공합니다. Docker의 기본 요소는 프로세스, 로그 스트림, 환경 변수 및 구성 요소 간의 네트워크 링크입니다. Vagrant의 기본 요소는 시스템, 블록 장치 및 ssh 키입니다. Vagrant는 단순히 스택에서 낮게 유지되며 컨테이너와 상호 작용할 수있는 유일한 방법은 다른 종류의 컴퓨터 인 것처럼 "부팅"하고 "로그인"하는 것입니다. 따라서 Docker 플러그인으로 "vagrant up"을 입력하면 예쁜 일이 발생합니다.Docker가 할 수있는 모든 것을 대체 할 수 있습니까? 며칠 동안 네이티브 Docker를 사용 해보고 직접보십시오 :)

  • 둘째, 잠금 인수. "Vagrant를 추상화로 사용하면 Docker에 고정되지 않습니다!". 기계를 관리하도록 설계된 Vagrant의 관점에서 이것은 완벽한 의미가 있습니다. 컨테이너가 다른 종류의 기계가 아닌가? Amazon EC2 및 VMware와 마찬가지로 프로비저닝 도구를 특정 공급 업체에 연결하지 않도록주의해야합니다! 이것은 잠금을 생성합니다-Vagrant로 완전히 추상화하는 것이 좋습니다. 이것을 제외하면 Docker의 요점을 완전히 놓친 것입니다. Docker는 컴퓨터를 프로비저닝하지 않습니다. 어디서나 떨어질 수있는 가벼운 휴대용 런타임으로 애플리케이션을 감 쌉니다.

응용 프로그램에 대해 선택한 런타임은 시스템을 프로비저닝하는 방법과 아무 관련이 없습니다! 예를 들어 다른 사람이 프로비저닝 한 시스템 (예 : Vagrant를 사용하여 시스템 관리자가 배포 한 EC2 인스턴스) 또는 Vagrant가 전혀 프로비저닝 할 수없는 베어 메탈 시스템에 애플리케이션을 배포하는 것은 매우 빈번합니다. 반대로 Vagrant를 사용하면 응용 프로그램 개발과 아무런 관련이없는 컴퓨터 (예 : 즉시 사용 가능한 Windows IIS 상자 등)를 프로비저닝 할 수 있습니다. 또는 Vagrant를 사용하여 Docker를 사용하지 않는 프로젝트의 시스템을 프로비저닝 할 수 있습니다. 예를 들어 종속성 관리 및 샌드 박싱과 같이 rubygems와 rvm을 조합하여 사용할 수 있습니다.

요약 : Vagrant는 컴퓨터 관리 용이며 Docker는 응용 프로그램 환경 구축 및 실행 용입니다.




Answer 4 Chris Bushell


Docker에 대한 경험이 없다는 것을 인정하여 답장을 선포합니다. 단, 많은 견인력을 얻는 정말 깔끔한 솔루션으로 보이는 것에 대한 열렬한 관찰자입니다.

나는 Vagrant에 대해 상당한 경험을 가지고 있으며 강력히 추천 할 수 있습니다. LXC 기반이 아닌 VM 기반이라는 점에서 더 무거운 솔루션입니다. 그러나 괜찮은 랩톱 (8GB RAM, i5 / i7 CPU)은 개발 도구와 함께 Vagrant / VirtualBox를 사용하여 VM을 실행하는 데 문제가 없음을 발견했습니다.

Vagrant의 가장 큰 장점 중 하나는 구성 자동화를 위해 Puppet / Chef / shell 스크립트 와의 통합입니다 . 이러한 옵션 중 하나를 사용하여 프로덕션 환경을 구성하는 경우, 원하는 환경과 거의 비슷한 개발 환경을 만들 수 있으며 이것이 바로 원하는 것입니다.

Vagrant의 또 다른 장점은 응용 프로그램 코드와 함께 Vagrantfile의 버전을 지정할 수 있다는 것입니다. 즉, 팀의 다른 모든 사람이이 파일을 공유 할 수 있으며 모든 사람이 동일한 환경 구성으로 작업하고 있음을 보증합니다.

흥미롭게도 Vagrant와 Docker는 실제로 무료 일 수 있습니다. 여러 가상화 공급자를 지원하기 위해 Vagrant를 확장 할 수 있으며 Docker가 가까운 장래에 지원을받는 그러한 공급자 중 하나 일 수 있습니다. 주제에 대한 최근 토론 은 https://github.com/dotcloud/docker/issues/404 를 참조 하십시오 .




Answer 5 Mark Stratmann


그들은 매우 보완 적입니다.

나는 몇 달 동안 모든 프로젝트에 VirtualBox, Vagrant 및 Docker의 조합을 사용해 왔으며 다음과 같은 이점을 강하게 느꼈습니다.

Vagrant에서는 Chef 솔로 프로비저닝을 완전히 제거 할 수 있으며, docker를 설치하는 하나의 작은 쉘 스크립트를 실행하는 시스템을 준비하기 만하면 vagrant 파일이 필요합니다. 이것은 모든 프로젝트에 대한 나의 Vagrantfile이 거의 동일하고 매우 단순하다는 것을 의미합니다.

전형적인 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를 설치하는 Bootstrap 파일은 다음과 같습니다

#!/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, Elastisearch, RabbitMQ 및 Memcached를 실행하고 있습니다.

독 커가 아닌 Chef 솔로 구성은 훨씬 더 복잡합니다.

프로덕션 환경으로 전환 할 때 최종 빅 플러스는 개발 환경을 도커를 실행하기에 충분한 구성이 있다는 점에서 모두 동일한 호스트 인프라로 변환하므로 실제로 작업이 거의 없습니다.

관심이 있다면 내 웹 사이트의 개발 환경에 대한 자세한 기사가 있습니다.

방랑자 / 도커 개발 환경 구현