Tôi nên sử dụng Vagrant hoặc Docker để tạo một môi trường biệt lập? [đóng cửa]


2083

Tôi sử dụng Ubuntu để phát triển và triển khai và có nhu cầu tạo ra một môi trường biệt lập.

Tôi đang xem xét hoặc Vagrant hoặc Docker cho mục đích này. Những ưu và nhược điểm, hoặc làm thế nào để so sánh các giải pháp này?


27
Cả hai đều có thể kết hợp ngay bây giờ: docs.vagrantup.com/v2/provisioning/docker.html
Alp

78
Câu hỏi của bạn đủ may mắn để có được cả hai câu trả lời của nhà văn về hai dịch vụ: Mitchell và Solomon Hykes
itazzad

4
Tôi muốn đưa ra một bản tóm tắt mới - câu hỏi chủ yếu là sai. Câu hỏi đúng là: Tôi nên sử dụng Vagrant hay docker-compose để tạo một môi trường biệt lập? Câu trả lời là Vagrant và docker-compose thực hiện cùng một nhiệm vụ mô tả các môi trường và thay vào đó bạn nên so sánh Docker với Virtualbox. Sự khác biệt là Vagrant có thể sử dụng bất kỳ ảo hóa nào như Docker, VMWare, Virtualbox trên Windows, Linux hoặc OSX, nhưng docker-compose chỉ có thể sử dụng hình ảnh Docker dựa trên Linux.
PHZ.fi-Pharazon

Đối với tôi câu trả lời là "Tốc độ quan trọng đối với bạn như thế nào trong các hoạt động công việc thường xuyên". Tôi thấy Vagrant chậm hơn Docker. Trên docker, đặc biệt là sau lần kéo ban đầu, cách tiếp cận bộ đệm và lớp của docker giúp tôi trở thành nhà phát triển dễ dàng và nhanh nhất đối với tôi
Michael Durrant

Câu trả lời:


1155

Nếu mục đích của bạn là sự cô lập, tôi nghĩ Docker là những gì bạn muốn.

Vagrant là một người quản lý máy ảo. Nó cho phép bạn kịch bản cấu hình máy ảo cũng như cung cấp. Tuy nhiên, nó vẫn là một máy ảo tùy thuộc vào VirtualBox (hoặc những người khác) với chi phí rất lớn. Nó đòi hỏi bạn phải có một tệp ổ cứng có thể rất lớn, cần nhiều ram và hiệu suất có thể không được tốt lắm.

Docker mặt khác sử dụng cgroup kernel và không gian tên thông qua LXC . Điều đó có nghĩa là bạn đang sử dụng cùng một kernel với máy chủ và cùng một hệ thống tệp. Bạn có thể sử dụng Dockerfile với docker buildlệnh để xử lý việc cung cấp và cấu hình bộ chứa của bạn. Bạn có một ví dụ tại docs.docker.com về cách tạo Dockerfile của bạn; nó rất trực quan

Lý do duy nhất bạn có thể muốn sử dụng Vagrant là nếu bạn cần thực hiện BSD, Windows hoặc phát triển không phải Linux khác trên hộp Ubuntu của mình. Nếu không, đi cho Docker.


13
Không may rằng chưa xong. Nếu bạn ở trong hệ thống 32 bit, bạn sẽ cần một máy ảo có hệ thống khách 64 bit để chạy docker. Tuy nhiên, với go1.1, hỗ trợ 32 bit trở nên tốt hơn và có thể docker sẽ hỗ trợ vòm 32 bit sớm
creack

8
Điều này đúng với Mac và Windows, nhưng vì docker 0.7, mọi phân phối linux đều hoạt động tốt. Nếu bạn biết một người không làm việc, xin vui lòng cho tôi biết. Ngoài ra, trừ khi bạn có ngăn xếp Mac hoặc Windows (điều này không thể xảy ra nhưng có thể xảy ra), bạn không muốn chạy Docker ở bất cứ đâu ngoài linux. Ứng dụng khách docker hoạt động tốt trên Mac, sẽ sớm hoạt động trên BSD và daemon cuối cùng sẽ hỗ trợ BSD, Solaris và Mac.
creack

9
Trong trường hợp ai đó đọc những bình luận này, bạn nên biết rằng Docker đã đạt ver1.0 chỉ 12 ngày trước ( blog.docker.com/2014/06/its-here-docker-1-0 ) và toàn bộ nhiều nền tảng khác nhau đều ổn định & được hỗ trợ ngay bây giờ ( docs.docker.com/installation )
JorgeArtware

17
vagrant có LXC và nhà cung cấp docker. Tuy nhiên - Vagrant và docker là những thứ khác nhau cơ bản. Vagrant hoàn toàn dành cho môi trường phát triển, docker chỉ dành cho sản xuất và Linux.
Dannyboy

2
Docker hiện hoạt động trên Windows 10 Pro trở lên và Windows Server 2016. Tôi vừa nâng cấp từ Windows 10 Home lên Windows 10 Pro và cài đặt ứng dụng docker. Bây giờ tôi có thể chạy hình ảnh docker Linux trên Windows 10. Thật tuyệt vời!
PrestonDocks

2339

Tuyên bố miễn trừ trách nhiệm: Tôi đã viết Vagrant! Nhưng vì tôi đã viết Vagrant, tôi dành phần lớn thời gian sống trong thế giới DevOps bao gồm phần mềm như Docker. Tôi làm việc với rất nhiều công ty sử dụng Vagrant và nhiều người sử dụng Docker, và tôi thấy hai người tương tác với nhau như thế nào.

Trước khi tôi nói quá nhiều, một câu trả lời trực tiếp: trong kịch bản cụ thể của bạn (bạn làm việc một mình, làm việc trên Linux, sử dụng Docker trong sản xuất), bạn có thể gắn bó với Docker một mình và đơn giản hóa mọi thứ. Trong nhiều kịch bản khác (tôi sẽ thảo luận thêm), nó không dễ dàng như vậy.

Không đúng khi so sánh trực tiếp Vagrant với Docker. Trong một số tình huống, chúng trùng lặp và trong phần lớn, chúng không. Trên thực tế, so sánh apt hơn sẽ là Vagrant so với một cái gì đó như Boot2Docker (hệ điều hành tối thiểu có thể chạy Docker). Vagrant là một cấp trên Docker về mặt trừu tượng, vì vậy nó không phải là một so sánh công bằng trong hầu hết các trường hợp.

Vagrant ra mắt những thứ để chạy ứng dụng / dịch vụ cho mục đích phát triển. Điều này có thể trên VirtualBox, VMware. Nó có thể là từ xa như AWS, OpenStack. Trong số đó, nếu bạn sử dụng các container, Vagrant không quan tâm và chấp nhận rằng: nó có thể tự động cài đặt, kéo xuống, xây dựng và chạy các container Docker chẳng hạn. Với Vagrant 1.6, Vagrant có môi trường phát triển dựa trên docker và hỗ trợ sử dụng Docker với quy trình làm việc tương tự như Vagrant trên Linux, Mac và Windows. Vagrant không cố gắng thay thế Docker ở đây, nó chấp nhận thực hành Docker.

Docker đặc biệt chạy container Docker. Nếu bạn đang so sánh trực tiếp với Vagrant: nó đặc biệt là một giải pháp cụ thể hơn (chỉ có thể chạy các container Docker), kém linh hoạt hơn (yêu cầu máy chủ Linux hoặc Linux ở đâu đó). Tất nhiên nếu bạn đang nói về sản xuất hoặc CI, không có so sánh với Vagrant! Vagrant không sống trong những môi trường này, và vì vậy Docker nên được sử dụng.

Nếu tổ chức của bạn chỉ chạy các container Docker cho tất cả các dự án của họ và chỉ có các nhà phát triển chạy trên Linux, thì không sao, Docker chắc chắn có thể làm việc cho bạn!

Mặt khác, tôi không thấy lợi ích khi cố gắng sử dụng Docker một mình, vì bạn mất rất nhiều những gì Vagrant cung cấp, có lợi ích kinh doanh / năng suất thực sự:

  • Vagrant có thể khởi chạy các máy VirtualBox, VMware, AWS, OpenStack, v.v. Không quan trọng bạn cần gì, Vagrant có thể khởi chạy nó. Nếu bạn đang sử dụng Docker, Vagrant có thể cài đặt Docker trên bất kỳ thứ nào trong số này để bạn có thể sử dụng chúng cho mục đích đó.

  • Vagrant là một quy trình làm việc duy nhất cho tất cả các dự án của bạn. Hoặc nói cách khác, đó chỉ là một điều mọi người phải học để chạy một dự án cho dù nó có trong một Docker container hay không. Ví dụ, nếu trong tương lai, một đối thủ cạnh tranh phát sinh để cạnh tranh trực tiếp với Docker, Vagrant cũng có thể chạy nó.

  • Vagrant hoạt động trên Windows (trở lại XP), Mac (trở lại 10.5) và Linux (trở lại kernel 2.6). Trong cả ba trường hợp, quy trình làm việc là như nhau. Nếu bạn sử dụng Docker, Vagrant có thể khởi chạy một máy (VM hoặc remote) có thể chạy Docker trên cả ba hệ thống này.

  • Vagrant biết cách định cấu hình một số thứ nâng cao hoặc không tầm thường như thư mục mạng và đồng bộ hóa. Ví dụ: Vagrant biết cách gắn IP tĩnh vào máy hoặc cổng chuyển tiếp và cấu hình giống nhau cho dù bạn sử dụng hệ thống nào (VirtualBox, VMware, v.v.) Đối với các thư mục được đồng bộ hóa, Vagrant cung cấp nhiều cơ chế để nhận cục bộ của bạn các tệp qua máy từ xa (thư mục chia sẻ VirtualBox, NFS, rsync, Samba [plugin], v.v.). Nếu bạn đang sử dụng Docker, thậm chí Docker có VM mà không có Vagrant, bạn sẽ phải tự làm điều này hoặc họ sẽ phải phát minh lại Vagrant trong trường hợp này.

  • Vagrant 1.6 có hỗ trợ hạng nhất cho các môi trường phát triển dựa trên docker . Điều này sẽ không khởi chạy một máy ảo trên Linux và sẽ tự động khởi chạy một máy ảo trên Mac và Windows. Kết quả cuối cùng là làm việc với Docker là thống nhất trên tất cả các nền tảng, trong khi Vagrant vẫn xử lý các chi tiết tẻ nhạt của những thứ như mạng, thư mục được đồng bộ hóa, v.v.

Để giải quyết các đối số truy cập cụ thể mà tôi đã nghe có lợi cho việc sử dụng Docker thay vì Vagrant:

  • "Nó là bộ phận ít chuyển động hơn" - Vâng, có thể, nếu bạn sử dụng Docker dành riêng cho mọi dự án. Thậm chí sau đó, nó đang hy sinh tính linh hoạt cho khóa Docker. Nếu bạn từng quyết định không sử dụng Docker cho bất kỳ dự án, quá khứ, hiện tại hoặc tương lai, thì bạn sẽ có nhiều phần chuyển động hơn. Nếu bạn đã sử dụng Vagrant, bạn có một phần chuyển động hỗ trợ phần còn lại.

  • "Nó nhanh hơn!" - Một khi bạn có máy chủ có thể chạy các thùng chứa Linux, Docker chắc chắn sẽ chạy nhanh hơn một container hơn bất kỳ máy ảo nào sẽ khởi chạy. Nhưng khởi chạy một máy ảo (hoặc máy từ xa) là chi phí một lần. Trong suốt cả ngày, hầu hết người dùng Vagrant không bao giờ thực sự phá hủy VM của họ. Đó là một tối ưu hóa kỳ lạ cho môi trường phát triển. Trong sản xuất, nơi Docker thực sự tỏa sáng, tôi hiểu sự cần thiết phải nhanh chóng quay lên / xuống container.

Tôi hy vọng bây giờ rõ ràng để thấy rằng nó rất khó, và tôi tin là không chính xác, để so sánh Docker với Vagrant. Đối với môi trường dev, Vagrant trừu tượng hơn, tổng quát hơn. Docker (và các cách khác nhau mà bạn có thể khiến nó hoạt động như Vagrant) là trường hợp sử dụng cụ thể của Vagrant, bỏ qua mọi thứ khác mà Vagrant cung cấp.

Tóm lại: trong các trường hợp sử dụng rất cụ thể, Docker chắc chắn là một sự thay thế khả dĩ cho Vagrant. Trong hầu hết các trường hợp sử dụng, nó không phải là. Vagrant không cản trở việc sử dụng Docker của bạn; nó thực sự làm những gì có thể để làm cho trải nghiệm đó mượt mà hơn. Nếu bạn thấy điều này không đúng, tôi rất vui khi nhận được đề xuất để cải thiện mọi thứ, vì mục tiêu của Vagrant là hoạt động tốt như nhau với bất kỳ hệ thống nào.

Hy vọng điều này sẽ làm rõ ràng mọi thứ!


4
@JaredMarkell Tôi nghĩ có lẽ anh ấy đang tìm kiếm một dịch vụ dựa trên web cho phép anh ấy quản lý các máy Vagrant của mình, chẳng hạn như Protobox .
Ryan Kennedy

73
@Mitchell Tôi chỉ muốn nói cảm ơn vì đã giải thích điều này một cách chi tiết. Rõ ràng là bạn không thể hoàn toàn khách quan nên tôi đánh giá cao rằng bạn đã dành thời gian để giải thích các sắc thái và các tình huống khác nhau mà chúng có thể được sử dụng. Tôi nghĩ rằng rất nhiều sự nhầm lẫn xung quanh một loạt các công cụ ngày nay là chúng trùng nhau rất nhiều, và rất nhiều người muốn một giải pháp phù hợp với một kích thước trong đó ai đó chỉ cho họ biết phải làm gì và họ có thể thực hiện nó. Cái hay của câu trả lời của bạn là nó trả lời câu hỏi tiềm ẩn: làm thế nào tôi có thể tạo ra một môi trường biệt lập? (không phân biệt công cụ).
Jordan


3
@ OğuzÇelikdemir Vagrant có thể làm nhiều hơn thế. Tất nhiên, nếu bạn chuẩn bị một máy ảo cụ thể cho mọi dự án, điều này sẽ kéo dài. Nhưng trong quá trình phát triển, tôi thường kết thúc việc thêm nhiều dịch vụ / trình nền / cài đặt (ví dụ: khi tôi quyết định sử dụng RabbitMQ cho một dự án trong quá trình phát triển). Cách tiếp cận thuần túy VM sẽ yêu cầu bạn chuẩn bị một hình ảnh mới, với RabbitMQ được cài đặt và định cấu hình, và buộc các nhà phát triển thay đổi VM của họ sang hình ảnh mới này. Đối với Vagrant - Tôi đang thêm các dòng thích hợp trong phân vùng mơ hồ và tất cả các nhà phát triển có thể nâng cấp VM của họ một cách dễ dàng (sử dụng vagrant provision).
Tomasz Struczyński

5
(Bạn có nghĩa là "tiết lộ", tiết lộ điều gì đó quan trọng, không phải "từ chối trách nhiệm", từ chối trách nhiệm: english.stackexchange.com/q/115850 )
Jerry101

1418

Tôi là tác giả của Docker.

Câu trả lời ngắn gọn là nếu bạn muốn quản lý máy móc, bạn nên sử dụng Vagrant. Và nếu bạn muốn xây dựng và chạy các môi trường ứng dụng, bạn nên sử dụng Docker.

Vagrant là một công cụ để quản lý các máy ảo. Docker là một công cụ để xây dựng và triển khai các ứng dụng bằng cách đóng gói chúng vào các thùng chứa nhẹ. Một container có thể chứa khá nhiều thành phần phần mềm cùng với các phần phụ thuộc của nó (tệp thực thi, thư viện, tệp cấu hình, v.v.) và thực thi nó trong môi trường thời gian chạy được bảo đảm và lặp lại. Điều này giúp bạn dễ dàng xây dựng ứng dụng của mình một lần và triển khai nó ở bất cứ đâu - trên máy tính xách tay của bạn để thử nghiệm, sau đó trên các máy chủ khác nhau để triển khai trực tiếp, v.v.

Đó là một quan niệm sai lầm phổ biến rằng bạn chỉ có thể sử dụng Docker trên Linux. Điều đó không chính xác; bạn cũng có thể cài đặt Docker trên Mac và Windows. Khi được cài đặt trên Mac, Docker gói một máy ảo Linux nhỏ (25 MB trên đĩa!) Hoạt động như một trình bao bọc cho thùng chứa của bạn. Sau khi cài đặt, điều này là hoàn toàn minh bạch; bạn có thể sử dụng dòng lệnh Docker theo cùng một cách chính xác. Điều này mang đến cho bạn những điều tốt nhất của cả hai thế giới: bạn có thể kiểm tra và phát triển ứng dụng của mình bằng cách sử dụng các thùng chứa, rất nhẹ, dễ kiểm tra và dễ di chuyển (ví dụ: https://hub.docker.com để chia sẻ các thùng chứa có thể tái sử dụng với cộng đồng Docker) và bạn không cần phải lo lắng về các chi tiết khó chịu trong việc quản lý các máy ảo, dù sao đây cũng chỉ là phương tiện để kết thúc.

Về lý thuyết, có thể sử dụng Vagrant làm lớp trừu tượng cho Docker. Tôi khuyên bạn nên chống lại điều này vì hai lý do:

  • Đầu tiên, Vagrant không phải là một bản tóm tắt tốt cho Docker. Vagrant được thiết kế để quản lý các máy ảo. Docker được thiết kế để quản lý thời gian chạy ứng dụng. Điều này có nghĩa là Docker, theo thiết kế, có thể tương tác với một ứng dụng theo những cách phong phú hơn và có nhiều thông tin hơn về thời gian chạy ứng dụng. Các nguyên thủy trong Docker là các quy trình, luồng nhật ký, biến môi trường và liên kết mạng giữa các thành phần. Các nguyên thủy trong Vagrant là máy móc, thiết bị khối và phím ssh. Vagrant chỉ đơn giản là ngồi thấp hơn trong ngăn xếp và cách duy nhất nó có thể tương tác với một container là giả vờ nó chỉ là một loại máy khác, mà bạn có thể "khởi động" và "đăng nhập". Vì vậy, chắc chắn, bạn có thể gõ "vagrant up" với plugin Docker và một cái gì đó đẹp sẽ xảy ra. Đây có phải là sự thay thế cho toàn bộ bề rộng của những gì Docker có thể làm không? Hãy thử Docker bản địa trong một vài ngày và tự mình xem :)

  • Thứ hai, đối số khóa. "Nếu bạn sử dụng Vagrant như một bản tóm tắt, bạn sẽ không bị khóa trong Docker!". Từ quan điểm của Vagrant, được thiết kế để quản lý máy móc, điều này có ý nghĩa hoàn hảo: không phải container chỉ là một loại máy khác? Giống như Amazon EC2 và VMware, chúng tôi phải cẩn thận không ràng buộc các công cụ cung cấp của chúng tôi với bất kỳ nhà cung cấp cụ thể nào! Điều này sẽ tạo ra khóa - tốt hơn là trừu tượng hóa tất cả với Vagrant. Ngoại trừ điều này bỏ lỡ quan điểm của Docker hoàn toàn. Docker không cung cấp máy móc; nó kết thúc ứng dụng của bạn trong một thời gian chạy di động nhẹ có thể bỏ ở bất cứ đâu.

Thời gian chạy nào bạn chọn cho ứng dụng của mình không liên quan gì đến cách bạn cung cấp máy của mình! Ví dụ: khá thường xuyên để triển khai các ứng dụng cho các máy do người khác cung cấp (ví dụ: phiên bản EC2 do quản trị viên hệ thống của bạn triển khai, có thể sử dụng Vagrant) hoặc cho các máy kim loại trần mà Vagrant không thể cung cấp. Ngược lại, bạn có thể sử dụng Vagrant để cung cấp các máy không liên quan gì đến việc phát triển ứng dụng của bạn - ví dụ như hộp IIS Windows sẵn sàng sử dụng hoặc một cái gì đó. Hoặc bạn có thể sử dụng Vagrant để cung cấp máy cho các dự án không sử dụng Docker - có lẽ họ sử dụng kết hợp rubygems và rvm để quản lý phụ thuộc và hộp cát chẳng hạn.

Tóm lại: Vagrant dành cho việc quản lý máy móc và Docker dành cho việc xây dựng và chạy các môi trường ứng dụng.


396
Chỉ muốn lưu ý rằng các khía cạnh Vagrant của câu trả lời này là không chính xác. Vagrant không dành cho việc quản lý máy móc, Vagrant dành cho việc quản lý môi trường phát triển. Thực tế Vagrant quay máy lên chủ yếu là lịch sử. Phiên bản tiếp theo của Vagrant có hỗ trợ hạng nhất để cải thiện môi trường phát triển bằng cách sử dụng Docker làm nhà cung cấp trực tiếp trên máy chủ hoặc bất kỳ VM (Mac, Win) nào. Nó cũng có thể quay LXC thô nếu đó là những gì ai đó muốn (một lần nữa, trên máy chủ hoặc VM). Vagrant quan tâm đến việc làm những gì tốt nhất để tạo môi trường phát triển di động, cho dù điều đó có nghĩa là tạo VM hay không.
Mitchell

7
@Davide Điều này bao gồm nó chi tiết hơn: vagrantup.com/blog/ từ
Mitchell

48
"Đó là một quan niệm sai lầm phổ biến rằng bạn chỉ có thể sử dụng Docker trên Linux" Mặc dù điều đó là đúng, nhưng chính xác là bạn chỉ có thể sử dụng Linux trên Docker. Nếu tôi muốn thiết lập một trình chạy thử nghiệm thực hiện ứng dụng của mình trong nhiều cấu hình envionment khác nhau (cơ sở dữ liệu khác nhau, phiên bản php, bộ đệm phụ, v.v.), thì tôi có thể dễ dàng làm điều đó với các thùng chứa docker. Nhưng tôi không thể xem liệu ứng dụng của mình sẽ chạy đúng trong Windows env hay trên BSD hay OSX.
Mixologic

10
Điểm đầu tiên của bạn đã lỗi thời vì Vagrant đã hỗ trợ nhà cung cấp tích hợp cho docker
Alp

19
Bài viết đã lỗi thời. Vagrant hỗ trợ Docker như một nhà cung cấp ngay bây giờ. Và có một số video minh họa cách bạn có thể sử dụng Vagrant và Docker cùng nhau trên blog của họ .
sargas

86

Tôi mở đầu câu trả lời của mình bằng cách thừa nhận tôi không có kinh nghiệm với Docker, ngoài việc là một người quan sát nhiệt tình về những gì có vẻ là một giải pháp thực sự gọn gàng mà có được nhiều lực kéo.

Tôi có rất nhiều kinh nghiệm với Vagrant và rất có thể giới thiệu nó. Đây chắc chắn là một giải pháp nặng hơn về mặt dựa trên VM thay vì dựa trên LXC. Tuy nhiên, tôi đã tìm thấy một máy tính xách tay khá (RAM 8 GB, CPU i5 / i7) không gặp vấn đề gì khi chạy VM bằng Vagrant / VirtualBox cùng với công cụ phát triển.

Một trong những điều thực sự tuyệt vời với Vagrant là sự tích hợp với các kịch bản Puppet / Chef / shell để tự động hóa cấu hình. Nếu bạn đang sử dụng một trong các tùy chọn này để định cấu hình môi trường sản xuất của mình, bạn có thể tạo môi trường phát triển gần giống như bạn sẽ nhận được và đây chính xác là những gì bạn muốn.

Một điều tuyệt vời khác với Vagrant là bạn có thể phiên bản Vagrantfile cùng với mã ứng dụng của bạn. Điều này có nghĩa là mọi người khác trong nhóm của bạn có thể chia sẻ tệp này và bạn được đảm bảo rằng mọi người đều làm việc với cùng một cấu hình môi trường.

Thật thú vị, Vagrant và Docker thực sự có thể là miễn phí. Vagrant có thể được mở rộng để hỗ trợ các nhà cung cấp ảo hóa khác nhau và có thể Docker là một trong những nhà cung cấp như vậy sẽ nhận được hỗ trợ trong tương lai gần. Xem https://github.com/dotcloud/docker/issues/404 để biết cuộc thảo luận gần đây về chủ đề này.


7
Các bạn, tôi đã phát hành một nhà cung cấp thử nghiệm mơ hồ cho docker: github.com/fgrehm/docker-provider .
fgrehm

2
Docker không phải là ảo hóa, mà là một hệ điều hành chạy trong bộ chứa riêng của nó, sử dụng cùng một kernel host, nó không phải là nhà cung cấp giống như các VM khác, vì vậy docker đã được Vagrant hỗ trợ.
Aftab đã ghi vào

1
Docker là ảo hóa chính hệ điều hành, hoàn toàn sử dụng lại phần cứng bên dưới. Nó là ảo hóa khi nó trừu tượng hóa và cô lập hệ thống tập tin, mạng và các quy trình đang chạy trong một container.
jose.angel.jimenez

63

Họ rất bổ sung.

Tôi đã sử dụng kết hợp VirtualBox, Vagrant và Docker cho tất cả các dự án của mình trong vài tháng và đã cảm nhận được những lợi ích sau đây.

Trong Vagrant, bạn hoàn toàn có thể loại bỏ bất kỳ việc cung cấp solo Chef nào và tất cả những gì bạn cần với tệp vagrant cần làm là chuẩn bị một máy chạy một tập lệnh shell nhỏ duy nhất cài đặt docker. Điều này có nghĩa là Vagrantfiles của tôi cho mọi dự án gần như giống hệt nhau và rất đơn giản.

Đây là một Vagrantfile điển hình

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

Tệp Bootstrap cài đặt docker trông như thế này

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

Bây giờ để có được tất cả các dịch vụ tôi cần chạy, tôi có một tập lệnh docker_start trông giống như thế này

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

Trong ví dụ này tôi đang chạy MongoDB, Elastisearch, RabbitMQ và Memcached

Một cấu hình solo Chef-docker sẽ phức tạp hơn đáng kể.

Một điểm cộng lớn cuối cùng đạt được khi bạn chuyển sang sản xuất, chuyển môi trường phát triển sang cơ sở hạ tầng của các máy chủ hoàn toàn giống nhau ở chỗ chúng chỉ có đủ cấu hình để chạy docker có nghĩa là rất ít công việc thực sự.

Nếu bạn quan tâm tôi có một bài viết chi tiết hơn về môi trường phát triển trên trang web của riêng tôi tại

Thực hiện môi trường phát triển Vagrant / Docker


2
Bạn đã thực hiện tất cả điều phối docker_start đó nhưng không bận tâm liên kết các container với nhau. Bạn chỉ đang đi với số cổng được mã hóa cứng bởi vì bạn đang chạy nó dưới Vagrant?
WineSoakes

6
Xin chào WineSoaken, ví dụ trên không hiển thị vùng chứa thực sự sử dụng tất cả các dịch vụ đó. Nếu bạn nhìn vào bài đăng trên blog được đề cập, có một tập lệnh script / vagrant / docker_web khác sẽ kích hoạt vùng chứa phát triển cho dự án. Điều này thực sự sử dụng --link trên lệnh chạy docker và dự án Rails sử dụng các biến môi trường được chèn vào docker để kết nối với các dịch vụ.
Mark Stratmann

1
Tôi có thể thấy tiềm năng hợp nhất cả hai sản phẩm. Vagrant như kiểm tra môi trường và docker cho trình bao bọc ứng dụng. Hợp nhất cả hai bạn có thể kiểm tra một ứng dụng hoặc kiểm tra đơn vị trên nhiều escenario. Tôi nghĩ rằng nhiều "dịch vụ nền tảng thử nghiệm" đang sử dụng Vagrant + Docker.
m3nda

8
"Họ rất nhiều miễn phí." - Cả hai đều miễn phí sử dụng, thực sự.
Underyx

2
Xin chào @koppor Tôi đã sử dụng máy docker lần cuối cách đây khoảng ba tháng và vẫn chưa quay lại với nó. Vấn đề tôi gặp phải là nó có lỗi trong việc chia sẻ các thư mục từ máy chủ lưu trữ MAC của tôi sang VM đang chạy docker khi sử dụng trình điều khiển VMWare. Điều này có nghĩa là tôi không thể chỉnh sửa mã cục bộ trên máy Mac và có các thay đổi được phản ánh trong bộ chứa docker. Tôi không biết họ đã sửa nó chưa, khi họ thực sự sẽ chuyển sang dùng nó. Tuy nhiên, tôi đã chuyển tất cả việc phối hợp container của mình sang soạn thảo docker kể từ khi viết câu trả lời này
Mark Stratmann

53

Vagrant-lxc là một plugin cho Vagrant cho phép bạn sử dụng LXC để cung cấp Vagrant. Nó không có tất cả các tính năng mà VM (VirtualBox) mặc định có nhưng nó sẽ cho phép bạn linh hoạt hơn các container docker. Có một video trong liên kết cho thấy khả năng của nó đáng xem.


5
Và đây là liên kết trực tiếp đến dự án github.com/fgrehm/vagrant-lxc
gertas

46

Với Vagrant bây giờ bạn có thể có Docker là nhà cung cấp. http://docs.vagrantup.com/v2/docker/ . Nhà cung cấp Docker có thể được sử dụng thay vì VirtualBox hoặc VMware.

Xin lưu ý rằng bạn cũng có thể sử dụng Docker để cung cấp với Vagrant. Điều này rất khác so với sử dụng Docker làm nhà cung cấp. http://docs.vagrantup.com/v2/provisioning/docker.html

Điều này có nghĩa là bạn có thể thay thế Chef hoặc Puppet bằng Docker. Bạn có thể sử dụng các kết hợp như Docker làm nhà cung cấp (VM) với Chef làm nhà cung cấp. Hoặc bạn có thể sử dụng VirtualBox làm nhà cung cấp và Docker làm nhà cung cấp.


23
thế giới trở nên điên rồ;) chúng ta có thể chạy vagrant bằng cách sử dụng nhà cung cấp
docker

@zainengineer, nhà cung cấp Docker cho Vagrant trên Windows vẫn sử dụng boot2docker hay nó sử dụng một số biến thể của Docker Toolbox?
Derek Mahar

@zainengineer Bạn có một số liên kết đến các ví dụ minh họa (không phải tài liệu mơ hồ) không?
Wlad

16

Sử dụng cả hai là một phần quan trọng của thử nghiệm phân phối ứng dụng. Tôi chỉ bắt đầu tham gia với Docker và suy nghĩ rất kỹ về một nhóm ứng dụng có độ phức tạp khủng khiếp trong việc xây dựng và phân phối phần mềm của nó. Hãy nghĩ về một dự án Phoenix cổ điển / Tình huống giao hàng liên tục.

Suy nghĩ diễn ra như thế này:

  • Lấy một thành phần ứng dụng Java / Go và xây dựng nó như một thùng chứa (lưu ý, không chắc ứng dụng nên được xây dựng trong vùng chứa hay được xây dựng sau đó được cài đặt vào vùng chứa)
  • Cung cấp container cho VM Vagrant.
  • Lặp lại điều này cho tất cả các thành phần ứng dụng.
  • Lặp lại trên (các) thành phần để mã chống lại.
  • Liên tục kiểm tra cơ chế phân phối đến (các) VM do Vagrant quản lý
  • Ngủ ngon khi biết rằng đã đến lúc triển khai container, thử nghiệm tích hợp đó đã xảy ra trên cơ sở liên tục hơn nhiều so với trước Docker.

Đây dường như là phần mở rộng hợp lý của tuyên bố của Mitchell rằng Vagrant dành cho phát triển kết hợp với suy nghĩ của Farley / Humble trong Giao hàng liên tục. Nếu tôi, với tư cách là nhà phát triển, có thể thu nhỏ vòng phản hồi về thử nghiệm tích hợp và phân phối ứng dụng, chất lượng cao hơn và môi trường làm việc tốt hơn sẽ tuân theo.

Thực tế là với tư cách là một nhà phát triển, tôi liên tục và liên tục cung cấp các container cho VM và thử nghiệm ứng dụng một cách toàn diện hơn có nghĩa là các bản phát hành sản xuất sẽ được đơn giản hóa hơn nữa.

Vì vậy, tôi thấy Vagrant đang phát triển như một cách tận dụng một số hậu quả tuyệt vời mà Docker sẽ gây ra cho việc triển khai ứng dụng.


Bạn có cơ hội có một bài viết về blog này không? Đã gần hai năm rồi, mọi chuyện thế nào? vẫn sử dụng vagrant với docker hoặc chỉ docker và docker-fleat / machine?
Andrzej Rehmann 30/03/2016

Công ty tôi đang làm việc đã được mua lại và họ đã gỡ bỏ tất cả nội dung của tôi @Hoto. Câu trả lời ngắn gọn là tôi sử dụng docker-machine tại nhà cho các dự án thú cưng của tôi. Trong công việc, tôi là <gulp> manager </ gulp> và không làm nhiều công nghệ. Chúng tôi không có kế hoạch sử dụng Docker nên công cụ của chúng tôi nói chung là Vagrant.
Boyd Hemphill

10

Docker chắc chắn cho chiến thắng!

Như bạn có thể biết Vagrant dành cho quản lý máy ảo trong khi Docker dành cho quản lý vùng chứa phần mềm. Nếu bạn không biết về sự khác biệt, thì đây là: Một thùng chứa phần mềm có thể chia sẻ cùng một máy và kernel với các thùng chứa phần mềm khác. Sử dụng các thùng chứa bạn tiết kiệm tiền vì bạn không lãng phí tài nguyên trên nhiều hệ điều hành (hạt nhân), bạn có thể đóng gói nhiều phần mềm hơn trên mỗi máy chủ để giữ mức độ cách ly tốt.

Tất nhiên là một kỷ luật mới để quan tâm với những thách thức và thách thức riêng của nó.

Đi tới Docker Swarm nếu yêu cầu của bạn vượt qua giới hạn tài nguyên máy đơn.


8

Có một bài viết thực sự nhiều thông tin trên tạp chí Oracle Java thực tế về việc sử dụng Docker kết hợp với Vagrant (và Puppet):

Phần kết luận

Các thùng chứa nhẹ của Docker nhanh hơn so với các máy ảo cổ điển và đã trở nên phổ biến trong các nhà phát triển và là một phần của các sáng kiến ​​CD và DevOps. Nếu mục đích của bạn là sự cô lập, Docker là một lựa chọn tuyệt vời. Vagrant là trình quản lý VM cho phép bạn cấu hình tập lệnh của từng máy ảo cũng như thực hiện việc cung cấp. Tuy nhiên, nó là một VM phụ thuộc vào VirtualBox (hoặc một trình quản lý VM khác) với chi phí tương đối lớn. Nó đòi hỏi bạn phải có một ổ cứng nhàn rỗi có thể rất lớn, cần rất nhiều RAM và hiệu suất có thể là tối ưu. Docker sử dụng các nhóm nhân và cách ly không gian tên thông qua LXC. Điều này có nghĩa là bạn đang sử dụng cùng kernel với máy chủ và cùng hệ thống ile. Vagrant là một cấp trên Docker về độ trừu tượng, vì vậy chúng không thực sự có thể so sánh được. Các công cụ quản lý cấu hình như Puppet được sử dụng rộng rãi để cung cấp môi trường đích. Việc sử dụng lại các giải pháp dựa trên rối hiện có rất dễ dàng với Docker. Bạn cũng có thể cắt giải pháp của mình, vì vậy cơ sở hạ tầng được cung cấp với Puppet; phần mềm trung gian, bản thân ứng dụng kinh doanh hoặc cả hai đều được cung cấp với Docker; và Docker được bọc bởi Vagrant. Với loạt công cụ này, bạn có thể làm những gì tốt nhất cho kịch bản của mình.

Cách xây dựng, sử dụng và sắp xếp các bộ chứa Docker trong DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageset=34&page=0


1
Rất nhiều người đã mất tích
Paul Verest
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.