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


2083

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

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


27
둘 다 지금 결합이다 : docs.vagrantup.com/v2/provisioning/docker.html
알프

78
귀하의 질문은 두 서비스에 대한 작가의 답변을 모두 얻을만큼 충분히 운이 좋았습니다. Mitchell and Solomon Hykes
itsazzad

4
새로운 요약을하고 싶습니다. 질문은 대부분 잘못되었습니다. 올바른 질문은 : 격리 된 환경을 만들기 위해 Vagrant 또는 docker-compose를 사용해야합니까? 대답은 Vagrant와 docker-compose가 환경을 설명하는 동일한 작업을 수행한다는 것입니다. 대신 Docker와 Virtualbox를 비교해야합니다. 차이점은 Vagrant는 Windows, Linux 또는 OSX에서 Docker, VMWare, Virtualbox와 같은 모든 가상화를 사용할 수 있지만 docker-compose는 Linux 기반 Docker 이미지 만 사용할 수 있다는 것입니다.
PHZ.fi-Pharazon

저에게 정답은 "정기 작업 활동에서 속도가 얼마나 중요합니까"입니다. Vagrant가 Docker보다 느리다는 것을 알았습니다. 도커에서, 특히 초기 풀링 후 도커의 캐시 및 레이어 접근 방식은 개발자가이를 사용하는 가장 쉽고 빠른 방법입니다.
Michael Durrant

답변:


1155

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

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

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

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


13
불행히도 아직은 아닙니다. 32 비트 시스템 인 경우 도커를 실행하려면 64 비트 게스트 시스템이있는 VM이 ​​필요합니다. 그러나 go1.1을 사용하면 32 비트 지원이 향상되고 docker가 곧 32 비트 아치를 지원할 수 있습니다.
creack

8
이것은 Mac과 Windows의 경우에 해당하지만 docker 0.7부터 모든 Linux 배포판이 제대로 작동합니다. 작동하지 않는 것을 알고 있다면 알려주십시오. 또한 Mac 또는 Windows 스택이없는 한 (아마도 일어날 수는 있지만) Linux 이외의 곳에서 Docker를 실행하고 싶지 않습니다. 도커 클라이언트는 Mac에서 제대로 작동하고 BSD에서 곧 작동하며 데몬은 결국 BSD, Solaris 및 Mac을 지원합니다.
creack

9
누군가 가이 의견을 읽는 경우 Docker가 12 일 전에 ver1.0을 치고 ( blog.docker.com/2014/06/its-here-docker-1-0 ) 다양한 플랫폼이 안정적 이라는 것을 알아야합니다 지원 ( docs.docker.com/installation )
JorgeArtware

17
vagrant는 LXC와 docker provisioner를 가지고 있습니다. 그러나 방랑자와 독은 근본적으로 다릅니다. Vagrant는 순전히 개발 환경을위한 것이며, docker는 프로덕션 및 Linux만을위한 것입니다.
Dannyboy

2
Docker는 이제 Windows 10 Pro 이상 및 Windows Server 2016에서 작동합니다. 방금 Windows 10 Home에서 Windows 10 Pro로 업그레이드하고 docker 앱을 설치했습니다. 이제 Windows 10에서 Linux 도커 이미지를 실행할 수 있습니다. 훌륭합니다!
PrestonDocks

2339

면책 조항 : 나는 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의 목표는 모든 시스템과 동일하게 작동하는 것이기 때문에 개선 사항을 제안합니다.

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


4
@JaredMarkell 아마도 그가 Protobox 와 같은 그의 Vagrant 머신을 관리 할 수있는 웹 기반 서비스를 찾고 있다고 생각 합니다.
Ryan Kennedy

73
@Mitchell 나는 이것을 자세히 설명해 주셔서 감사합니다. 분명히 당신이 완전히 객관적인 것은 불가능하므로 뉘앙스와 그것들이 사용될 수있는 다양한 상황을 설명하는 데 시간을내어 주셔서 감사합니다. 오늘날 다양한 도구에 대한 많은 혼란은 도구가 많이 겹치므로 많은 사람들이 누군가가 무엇을해야하는지 알려주고 구현할 수있는 모든 규모의 솔루션을 원한다고 생각합니다. 귀하의 답변의 아름다움은 근본적인 질문에 답변한다는 것입니다. 어떻게 격리 된 환경을 만들 수 있습니까? (도구에 관계없이).
Jordan

4
@JaredMarkell 도커는 REST API를 가지고 docs.docker.com/reference/api/docker_remote_api을
Tarnay 칼만에게

3
@ OğuzÇelikdemir Vagrant는 그 이상을 할 수 있습니다. 물론 모든 프로젝트에 대해 특정 가상 머신을 준비하는 경우에도 지속됩니다. 그러나 개발 중에 종종 더 많은 서비스 / 데몬 / 설정을 추가하게됩니다 (예 : 개발 중에 프로젝트에 RabbitMQ를 사용하기로 결정한 경우). 순수한 VM 방식을 사용하려면 RabbitMQ를 설치 및 구성한 상태에서 새 이미지를 준비하고 개발자가 VM을이 새로운 이미지로 변경하도록해야합니다. 방랑자-방랑자 구성에 적절한 줄을 추가하고 있으며 모든 개발자가 (를 사용하여 vagrant provision) 쉽게 VM을 업그레이드 할 수 있습니다 .
Tomasz Struczyński

5
( "공개"를 의미하며 "면책 조항"이 아니라 중요한 것을 밝히고 책임을 거부합니다 : english.stackexchange.com/q/115850 )
Jerry101

1418

저는 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를 사용하지 않는 프로젝트의 시스템을 프로비저닝 할 수 있습니다. 예를 들어 종속성 관리 및 샌드 박싱과 같은 루비 젬과 rvm의 조합을 사용합니다.

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


396
이 답변의 Vagrant 측면이 잘못되었다는 점을 알고 싶었습니다. Vagrant는 컴퓨터 관리 용이 아니며 Vagrant는 개발 환경 관리 용입니다. Vagrant의 스핀 업 머신은 대부분 역사적입니다. 다음 버전의 Vagrant는 Docker를 호스트 또는 모든 VM (Mac, Win)에서 직접 공급자로 사용하여 개발 환경을 시작하는 일류 지원을 제공합니다. 또한 다른 사람이 원하는 경우 호스트 또는 VM에서 원시 LXC를 스핀 업할 수도 있습니다. Vagrant는 VM 생성 여부에 관계없이 이식 가능한 개발 환경을 만드는 가장 좋은 방법에 관심이 있습니다.
Mitchell

7
@Davide 자세한 내용은 vagrantup.com/blog/…
Mitchell

48
"리눅스에서만 Docker 만 사용할 수 있다는 것은 일반적인 오해입니다."사실이지만 Docker에서는 Linux 만 사용할 수 있다고 말하는 것이 정확합니다. 다양한 환경 설정 (다른 데이터베이스, PHP 버전, 캐싱 백엔드 등)에서 내 응용 프로그램을 실행하는 테스트 러너를 설정하려면 docker 컨테이너를 사용하여 쉽게 수행 할 수 있습니다. 그러나 응용 프로그램이 Windows IIS env 또는 BSD 또는 OSX에서 제대로 실행되는지 확인할 수 없습니다.
Mixologic

10
Vagrant가 docker에 대한 내장 제공자 지원을 제공했기 때문에 첫 번째 포인트는 구식입니다. docs.vagrantup.com/v2/provisioning/docker.html
Alp

19
게시물이 오래되었습니다. Vagrant는 현재 Docker를 공급자로 지원합니다. 그리고 블로그 에서 Vagrant와 Docker를 함께 사용하는 방법을 보여주는 비디오가 있습니다 .
sargas

86

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 를 참조 하십시오 .


7
Guys, 나는 docker에 대한 실험적인 방랑자 공급자 인 github.com/fgrehm/docker-provider 를 발표했습니다 .
fgrehm

2
Docker는 가상화가 아니지만 다른 VM과 같은 공급자가 아닌 동일한 호스트 커널을 사용하여 자체 컨테이너 내에서 OS를 실행하므로 Docker는 이미 Vagrant에서 지원합니다.
Aftab Naveed

1
Docker는 OS 자체를 가상화하여 기본 하드웨어를 암시 적으로 재사용합니다. 컨테이너에서 실행되는 파일 시스템, 네트워킹 및 프로세스를 추상화하고 격리하므로 가상화입니다.
jose.angel.jimenez

63

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

나는 몇 달 동안 모든 프로젝트에 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 솔로 구성은 훨씬 더 복잡합니다.

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

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

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


2
그 docker_start 오케스트레이션을 모두 수행했지만 컨테이너를 서로 연결하지 않아도됩니다. Vagrant에서 포트 번호를 실행하고 있기 때문에 하드 코딩 된 포트 번호를 사용하고 있습니까?
WineSoaked

6
안녕 WineSoaked, 위의 예는 실제로 모든 서비스를 사용하는 컨테이너를 보여주지 않습니다. 언급 된 블로그 게시물을 보면 프로젝트의 개발 컨테이너를 시작하는 또 다른 스크립트 script / vagrant / docker_web이 있습니다. 이것은 실제로 docker run 명령에서 --link를 사용하고 Rails 프로젝트는 docker 주입 환경 변수를 사용하여 서비스에 연결합니다.
Mark Stratmann

1
두 제품을 합병 할 가능성이 있습니다. 앱 래퍼의 환경 테스트 및 도커로 방랑자. 두 가지를 병합하면 여러 시나리오에서 단일 앱 또는 단위 테스트를 테스트 할 수 있습니다. 많은 "테스트 플랫폼 서비스"가 Vagrant + Docker를 사용하고 있다고 생각합니다.
m3nda

8
"그들은 매우 무료입니다." — 둘 다 실제로 사용할 수 있습니다.
Underyx

2
안녕하세요 @koppor 나는 약 3 개월 전에 도커 기계를 마지막으로 사용했지만 아직 다시 돌아 가지 않았습니다. 내가 가진 문제는 VMWare 드라이버를 사용할 때 내 MAC 호스트 호스트에서 docker를 실행하는 VM으로 폴더를 공유하는 데 버그가 있다는 것입니다. 즉, Mac에서 로컬로 코드를 편집 할 수없고 변경 내용이 docker 컨테이너에 반영됩니다. 그들이 아직 고쳤는지 모르겠지만, 그렇게 할 때 실제로 그것을 바꿀 것입니다. 그러나이 답변을 작성한 후 모든 컨테이너 오케스트레이션을 도커 작성으로 전환했습니다.
Mark Stratmann

53

Vagrant-lxcLgrant 를 사용하여 Vagrant를 프로비저닝 할 수있는 Vagrant 플러그인입니다. 기본 vagrant VM (VirtualBox)의 모든 기능을 갖추고 있지는 않지만 docker 컨테이너보다 유연성이 뛰어납니다. 볼 가치가있는 기능을 보여주는 비디오가 링크에 있습니다.



46

Vagrant를 사용하면 Docker를 공급자로 사용할 수 있습니다. http://docs.vagrantup.com/v2/docker/ . VirtualBox 또는 VMware 대신 Docker 공급자를 사용할 수 있습니다.

Vagrant를 사용하여 프로비저닝하는 데 Docker를 사용할 수도 있습니다. 이것은 Docker를 공급자로 사용하는 것과는 매우 다릅니다. http://docs.vagrantup.com/v2/provisioning/docker.html

즉, Chef 또는 Puppet 을 Docker로 바꿀 수 있습니다 . Chef를 provisioner로 사용하여 Docker as provider (VM)와 같은 조합을 사용할 수 있습니다. 또는 VirtualBox를 공급자로, Docker를 공급자로 사용할 수 있습니다.


23
세계는 미친 갔다) 우리는 방랑 내부에 고정 표시기 용기 실행 고정 표시기 공급자를 사용하여 방랑 실행할 수 있습니다
의 Andrzej Rehmann을

@zainengineer, Windows의 Vagrant 용 Docker 공급자는 여전히 boot2docker를 사용합니까 아니면 Docker Toolbox의 변형을 사용합니까?
Derek Mahar

@zainengineer 당신은 예시적인 예제들에 대한 링크를 가지고 있습니까?
Wlad

16

두 가지를 모두 사용하는 것은 응용 프로그램 제공 테스트에서 중요한 부분입니다. Docker에 참여하기 시작했고 소프트웨어를 구축하고 제공하는 데 끔찍한 응용 프로그램 팀에 대해 매우 열심히 생각하고 있습니다. 고전적인 피닉스 프로젝트 / 지속적인 배달 상황을 생각해보십시오.

생각은 다음과 같습니다.

  • Java / Go 애플리케이션 컴포넌트를 가져 와서 컨테이너로 빌드하십시오 (앱이 컨테이너에 빌드되어야하는지 컨테이너에 빌드되어야하는지 확실하지 않음)
  • 컨테이너를 Vagrant VM에 제공하십시오.
  • 모든 응용 프로그램 구성 요소에 대해이 과정을 반복하십시오.
  • 코딩 할 구성 요소를 반복하십시오.
  • Vagrant가 관리하는 VM에 전달 메커니즘을 지속적으로 테스트
  • 컨테이너 배포시기가 언제인지 잘 알고 있습니다. 통합 테스트는 Docker 이전보다 훨씬 더 지속적으로 수행되고있었습니다.

이것은 Vagrant가 Continuous Delivery의 Farley / Humbles 사고와 결합 된 개발을위한 것이라고 Mitchell의 진술의 논리적 확장으로 보입니다. 개발자로서 통합 테스트 및 응용 프로그램 제공에 대한 피드백 루프를 줄일 수 있다면 더 높은 품질과 더 나은 작업 환경이 이어질 것입니다.

개발자로서 컨테이너를 VM에 지속적으로 지속적으로 제공하고 애플리케이션을보다 전체적으로 테스트한다는 것은 프로덕션 릴리스가 더욱 단순화 될 것임을 의미합니다.

따라서 Docker가 앱 배포에 미칠 수있는 멋진 결과를 활용하는 방법으로 Vagrant가 진화하는 것을 봅니다.


우연히 이것에 관한 블로그 게시물이 있습니까? 거의 2 년이 지났는데 어떻게 진행되고 있습니까? 여전히 도커 또는 도커 및 도커 함대 / 기계와 함께 방랑자를 사용하고 있습니까?
Andrzej Rehmann

내가 일하고있는 회사를 인수하여 @Hoto의 모든 컨텐츠를 중단했습니다. 짧은 대답은 집에서 애완 동물 프로젝트에 도커 기계를 사용한다는 것입니다. 직장에서 나는 <gulp> 관리자 </ gulp>이고 많은 기술을하지 않습니다. Docker를 사용할 계획이 없으므로 도구는 일반적으로 Vagrant입니다.
Boyd Hemphill

10

승리를위한 도커!

아시다시피 Vagrant는 가상 머신 관리를위한 것이고 Docker는 소프트웨어 컨테이너 관리를위한 것입니다. 차이점을 모르는 경우 다음과 같습니다. 소프트웨어 컨테이너는 동일한 시스템 및 커널을 다른 소프트웨어 컨테이너와 공유 할 수 있습니다. 컨테이너를 사용하면 여러 운영 체제 (커널)에서 리소스를 낭비하지 않기 때문에 비용을 절약 할 수 있으므로 서버 당 더 많은 소프트웨어를 패키징하여 격리 수준을 유지할 수 있습니다.

물론 자신 만의 함정과 도전을 돌볼 새로운 훈련이 있습니다.

요구 사항이 단일 시스템 리소스 제한을 초과하면 Docker Swarm으로 이동하십시오.


8

실제 Oracle Java 매거진에는 Docker를 Vagrant (및 Puppet)와 함께 사용하는 방법에 대한 유용한 정보가 있습니다.

결론

Docker의 경량 컨테이너는 클래식 VM에 비해 속도가 빠르고 개발자와 CD 및 DevOps 이니셔티브의 일부로 인기를 얻었습니다. 목적이 격리라면 Docker가 탁월한 선택입니다. Vagrant는 프로비저닝뿐만 아니라 개별 VM의 구성을 스크립팅 할 수있는 VM 관리자입니다. 그러나 상대적으로 큰 오버 헤드가있는 VirtualBox (또는 다른 VM 관리자)에 종속 된 VM이 아닙니다. 거대한 하드 드라이브 유휴 상태가 필요하고 많은 RAM이 필요하며 성능이 차선책 일 수 있습니다. Docker는 LXC를 통해 커널 cgroup과 네임 스페이스 격리를 사용합니다. 이는 호스트 및 동일한 ile 시스템과 동일한 커널을 사용하고 있음을 의미합니다. Vagrant는 추상화 측면에서 Docker보다 높은 수준이므로 실제로 비교할 수는 없습니다. Puppet과 같은 구성 관리 도구는 대상 환경을 프로비저닝하는 데 널리 사용됩니다. Docker를 사용하면 기존 Puppet 기반 솔루션을 쉽게 재사용 할 수 있습니다. 또한 솔루션을 슬라이스하여 Puppet으로 인프라를 프로비저닝 할 수 있습니다. 미들웨어, 비즈니스 애플리케이션 자체 또는 둘 다 Docker로 프로비저닝됩니다. Docker는 Vagrant로 포장되어 있습니다. 이 범위의 도구를 사용하면 시나리오에 가장 적합한 것을 수행 할 수 있습니다.

DevOps에서 Docker 컨테이너를 빌드, 사용 및 조정하는 방법 http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0


1
이렇게 많은 t의의가 누락되었다
폴 Verest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.