Câu hỏi Tôi có nên sử dụng Vagrant hoặc Docker để tạo môi trường riêng biệt không? [đã đóng]


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

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


1888
2018-05-20 10:05


gốc


Cả hai đều có thể kết hợp ngay bây giờ: docs.vagrantup.com/v2/provisioning/docker.html - Alp
Liệu chúng ta có thể không xóa cái này, mọi người? Có lẽ nó không có chủ đề và có thể đóng cửa, nhưng với câu trả lời dài từ các tác giả của cả hai công cụ (và 90 nghìn lượt xem), điều này rất có giá trị và không đáng bị xóa. - Jeremy
Câu hỏi của bạn là đủ may mắn để có được câu trả lời của cả hai nhà văn về hai dịch vụ: Mitchell và Solomon Hykes - itsazzad


Các câu trả lời:


Nếu mục đích của bạn là cô lập, tôi nghĩ Docker là thứ 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 một chi phí rất lớn. Nó đòi hỏi bạn phải có một tập tin ổ đĩa cứng có thể rất lớn, phải mất rất nhiều ram, và hiệu suất có thể không phải là rất tốt.

Docker mặt khác sử dụng kernel cgroup và namespacing qua LXC. Nó có nghĩa là bạn đang sử dụng cùng một hạt nhân 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 build lệnh để xử lý việc cung cấp và cấu hình vùng 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 làm BSD, Windows hoặc phát triển không phải Linux khác trên hộp Ubuntu của bạn. Nếu không, đi cho Docker.


1044
2018-05-26 16:46



Không may rằng chưa xong. Nếu bạn đang ở trong một hệ thống 32 bit, bạn sẽ cần một máy ảo với một 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ẽ sớm hỗ trợ kiến ​​trúc 32 bit - creack
"Mac, Windows và một số bản phân phối Linux không thể chạy Docker tại thời điểm này vì vậy chúng tôi giúp bạn thiết lập một máy ảo Ubuntu và chạy Docker bên trong đó". Vì vậy, trừ khi bạn đang ở trên một bản phân phối Linux chính thống, ứng dụng của bạn sẽ chạy bên trong docker mà chính nó sẽ chạy bên trong một máy ảo. - aleemb
Điều này đúng với Mac và Windows, nhưng kể từ docker 0.7, mọi bản 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ó một máy Mac hoặc Windows stack (mà là không nhưng có thể xảy ra), bạn không muốn chạy Docker bất cứ nơi nào nhưng trên Linux. Ứng dụng 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
Trong trường hợp ai đó đọc những nhận xét này, bạn nên biết rằng Docker đã truy cập ver1.0 chỉ 12 ngày trước (blog.docker.com/2014/06/its-here-docker-1-0) và rất nhiều nền tảng khác nhau ổn định và được hỗ trợ ngay bây giờ (docs.docker.com/installation) - JorgeArtware
vagrant có LXC và docker provisioners. Tuy nhiên - Vagrant và docker về cơ bản là những thứ khác nhau. Vagrant là hoàn toàn cho môi trường phát triển, docker là khá cho sản xuất và Linux chỉ. - Dannyboy


Disclaimer: Tôi đã viết Vagrant! Nhưng bởi 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 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 tình huống khác (tôi thảo luận thêm), nó không phải là dễ dàng như vậy.

Không đúng khi so sánh trực tiếp Vagrant to Docker. Trong một số trường hợp, chúng trùng lặp, và trong phần lớn chúng không có. Trên thực tế, so sánh apt hơn sẽ Vagrant so với một cái gì đó giống 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 sự so sánh công bằng trong hầu hết các trường hợp.

Vagrant ra mắt mọi thứ để chạy các ứng dụng / dịch vụ với mục đích phát triển. Điều này có thể là trên VirtualBox, VMware. Nó có thể được điều khiển từ xa như AWS, OpenStack. Trong đó, nếu bạn sử dụng các thùng chứa, 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 thùng chứa Docker chẳng hạn. Với Vagrant 1.6, Vagrant có môi trường phát triển dựa trên dockervà hỗ trợ sử dụng Docker với cùng quy trình làm như Vagrant trên Linux, Mac và Windows. Vagrant không cố gắng thay thế Docker ở đây, nó bao gồm thực hành Docker.

Docker đặc biệt chạy các thùng chứa Docker. Nếu bạn so sánh trực tiếp với Vagrant: nó cụ thể hơn (chỉ có thể chạy các thùng chứa Docker), ít linh hoạt hơn (yêu cầu giải pháp lưu trữ 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 vùng chứa 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ì được rồi, Docker chắc chắn có thể làm việc cho bạn!

Nếu không, tôi không thấy một 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, trong đó có lợi ích kinh doanh / năng suất thực tế:

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

  • Vagrant là một luồng công việc duy nhất cho tất cả các dự án của bạn. Hoặc để đặt một cách khác, nó chỉ là một điều mọi người phải học để chạy một dự án cho dù đó là trong một container Docker 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 sẽ có thể chạy nó.

  • Vagrant hoạt động trên Windows (trở lại XP), Mac (quay lại 10.5) và Linux (quay lại hạt nhân 2.6). Trong cả ba trường hợp, quy trình làm việc giống nhau. Nếu bạn sử dụng Docker, Vagrant có thể khởi động một máy (VM hoặc từ xa) 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ư mạng và đồng bộ hóa thư mục. Ví dụ: Vagrant biết cách đính kèm IP tĩnh vào máy hoặc cổng chuyển tiếp và cấu hình giống nhau bất kể hệ thống bạn sử dụng (VirtualBox, VMware, v.v.) Đối với thư mục được đồng bộ hóa, Vagrant cung cấp nhiều cơ chế để nhận địa phương của bạn các tệp trên máy từ xa (các thư mục được chia sẻ của VirtualBox, NFS, rsync, Samba [plugin], v.v.). Nếu bạn đang sử dụng Docker, thậm chí Docker với một máy ảo mà không có Vagrant, bạn sẽ phải tự làm điều này hoặc họ sẽ phải tái tạo lại Vagrant trong trường hợp này.

  • Vagrant 1.6 có hỗ trợ hạng nhất cho môi trường phát triển dựa trên docker. Điều này sẽ không khởi động một máy ảo trên Linux, và sẽ tự động khởi động 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:

  • "Đó là các bộ phận ít chuyển động hơn" - Có, có thể, nếu bạn sử dụng Docker dành riêng cho mọi dự án. Thậm chí sau đó, nó hy sinh tính linh hoạt cho Docker lock-in. Nếu bạn quyết định không sử dụng Docker cho bất kỳ dự án nào, quá khứ, hiện tại hoặc tương lai, thì bạn sẽ có nhiều bộ phận chuyển động hơn. Nếu bạn đã sử dụng Vagrant, bạn có một phần di chuyển 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 chạy nhanh hơn một thùng chứa hơn bất kỳ máy ảo nào sẽ khởi chạy. Nhưng tung ra một máy ảo (hoặc máy từ xa) là một 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 sự tối ưu hóa 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 của nó để thấy rằng nó là rất khó khăn, và tôi tin rằng không chính xác, để so sánh Docker để 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ể làm cho nó hoạt động như Vagrant) là một trường hợp sử dụng cụ thể của Vagrant, bỏ qua mọi thứ khác mà Vagrant cung cấp.

Trong kết luận: trong trường hợp sử dụng rất cụ thể, Docker chắc chắn là một sự thay thế có thể 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 là không đúng, tôi rất vui khi đưa ra đề 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ứ!


2173
2018-01-23 16:55



@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
@ Mitchell Tôi chỉ muốn nói lời cảm ơn vì đã giải thích điều này chi tiết như vậy. Rõ ràng là bạn không thể hoàn toàn khách quan vì vậy tôi đánh giá cao việc 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ất nhiều sự nhầm lẫn xung quanh nhiều công cụ ngày nay là chúng trùng lặp rất nhiều, và rất nhiều người muốn có một giải pháp phù hợp với mọi người, nơi ai đó chỉ bảo họ phải làm gì và họ có thể thực hiện nó. Vẻ đẹp của câu trả lời của bạn là nó trả lời câu hỏi cơ bản: làm thế nào tôi có thể tạo ra một môi trường bị cô lập? (không phụ thuộc vào công cụ). - Jordan
@JaredMarkell Docker có API REST docs.docker.com/reference/api/docker_remote_api - Tarnay Kálmán
@ OğuzÇelikdemir Vagrant có thể làm được 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 thêm nhiều dịch vụ / daemon / 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). Hoàn toàn là cách tiếp cận VM sẽ yêu cầu bạn chuẩn bị một hình ảnh mới, với cài đặt và cấu hình RabbitMQ, và buộc các nhà phát triển phải thay đổi máy ảo của họ sang máy ảo mới này. Đối với Vagrant - Tôi đang thêm các dòng thích hợp vào sự confguration vagrant và tất cả các nhà phát triển có thể nâng cấp máy ảo của họ một cách dễ dàng (bằng cách sử dụng vagrant provision). - Tomasz Struczyński
(Bạn có nghĩa là "tiết lộ", tiết lộ một cái gì đó quan trọng, không phải "từ chối trách nhiệm", phủ nhận trách nhiệm: english.stackexchange.com/q/115850) - Jerry101


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 thành 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ụ thuộc của nó (các tệp thực thi, thư viện, tệp cấu hình, v.v.) và thực thi nó trong một môi trường thời gian chạy được bảo đảm và có thể lặp lại. Điều này làm cho nó rất dễ dàng để xây dựng ứng dụng của bạn một lần và triển khai nó ở mọi nơi - 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 mà 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 máy Mac và hỗ trợ Windows đang được tiến hành. Khi được cài đặt trên Mac, Docker bao gồm một máy ảo Linux nhỏ (25 MB trên đĩa!) Hoạt động như một trình bao bọc cho vùng chứa của bạn. Sau khi cài đặt, điều này hoàn toàn minh bạch; bạn có thể sử dụng dòng lệnh Docker theo cách tương tự. Điều này mang lại cho bạn 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 xung quanh (xem 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 nitty-gritty về quản lý các máy ảo, mà chỉ là một 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 sự trừu tượng 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 tiến trình, các luồng ghi, các biến môi trường và các liên kết mạng giữa các thành phần. Các nguyên thủy trong Vagrant là các máy, thiết bị khối và khóa ssh. Vagrant chỉ đơn giản là ngồi thấp hơn trong stack, và cách duy nhất nó có thể tương tác với một container là bằng cách giả vờ nó chỉ là một loại máy khác, bạn có thể "khởi động" và "đăng nhập". Vì vậy, chắc chắn, bạn có thể gõ "lang thang lên" với một plugin Docker và một cái gì đó khá sẽ xảy ra. Nó là một thay thế cho bề rộng đầy đủ của những gì Docker có thể làm gì? Hãy thử Docker gốc trong một vài ngày và xem cho chính mình :)

  • Thứ hai, đối số khóa. "Nếu bạn sử dụng Vagrant như là một trừu tượng, bạn sẽ không bị khóa vào Docker!". Từ quan điểm của Vagrant, được thiết kế để quản lý các máy móc, điều này làm cho cảm giác hoàn hảo: không phải là vật chứa chỉ là một loại máy khác? Giống như Amazon EC2 và VMware, chúng ta phải cẩn thận không gắn 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 khóa - tốt hơn để trừu tượng hóa nó với Vagrant. Ngoại trừ điều này bỏ lỡ điểm Docker hoàn toàn. Docker không cung cấp máy móc; nó kết thúc tốt đẹp ứng dụng của bạn trong một thời gian chạy xách tay gọn nhẹ có thể bị xóa ở bất cứ đâu.

Thời gian chạy mà bạn chọn cho ứng dụng của bạn không liên quan gì đến cách bạn cung cấp máy của mình! Ví dụ, việc triển khai ứng dụng cho các máy được cung cấp bởi người khác (ví dụ như một cá thể EC2 được 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ư một hộp Windows IIS 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 các máy cho các dự án không sử dụng Docker - có lẽ chúng sử dụng kết hợp rubygems và rvm để quản lý sự phụ thuộc và sandbox chẳng hạn.

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


1282
2018-03-13 06:16



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 là để quản lý môi trường phát triển. Thực tế Vagrant quay lên máy chủ yếu là lịch sử. Phiên bản tiếp theo của Vagrant có hỗ trợ lớp học đầu tiên để quay lên môi trường dev bằng cách sử dụng Docker như một nhà cung cấp trực tiếp trên máy chủ hoặc bất kỳ máy ảo (Mac, Win). Nó cũng có thể quay lên LXC thô nếu đó là những gì ai đó muốn (một lần nữa, trên máy chủ hoặc máy ảo). Vagrant quan tâm đến việc làm những gì tốt nhất để tạo ra một môi trường phát triển di động, cho dù đó có nghĩa là tạo ra một máy ảo hay không. - Mitchell
@ Mitchell - bạn có thể vui lòng chỉ ra một số tài liệu về betas mà xây dựng thêm về tuyên bố này? Tôi rất thích nó. - Davide
"Đó là một quan niệm sai lầm phổ biến mà bạn chỉ có thể sử dụng Docker trên Linux" Trong khi đó là sự thật, nó là chính xác để nói rằng bạn chỉ có thể sử dụng Linux trên Docker. Nếu tôi muốn thiết lập một Á hậu thử nghiệm thực hiện ứng dụng của tôi trong một loạt các cấu hình envionment (cơ sở dữ liệu khác nhau, phiên bản php, bộ nhớ đệm backends vv), sau đó tôi có thể dễ dàng làm điều đó với container docker. Nhưng tôi không thể nhìn thấy nếu ứng dụng của tôi sẽ chạy đúng trong một cửa sổ IIS env, hoặc trên BSD hoặc OSX. - Mixologic
Đ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: docs.vagrantup.com/v2/provisioning/docker.html - Alp
Bài đăng đã 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 trình bày cách bạn có thể sử dụng Vagrant và Docker đồng loạt trên Blog. - sargas


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

Tôi có một số lượng phong nha của kinh nghiệm với Vagrant và rất có thể khuyên bạn nên nó. Nó chắc chắn là một giải pháp nặng hơn về mặt nó 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 phong nha (8 GB RAM, i5 / i7 CPU) không có rắc rối khi chạy một máy ảo sử dụ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 Con rối/Đầu bếp/ shell script để tự động cấu hình. Nếu bạn đang sử dụng một trong các tùy chọn này để cấu hình môi trường sản xuất của mình, bạn có thể tạo một môi trường phát triển gần như giống hệt như bạn sẽ nhận được, và đây chính là điều bạn muốn.

Đ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 đang 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ể được 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 được hỗ trợ trong tương lai gần. Xem https://github.com/dotcloud/docker/issues/404 để thảo luận gần đây về chủ đề.


73
2018-06-25 21:33



Các bạn, tôi đã phát hành thử nghiệm nhà cung cấp lang thang cho docker: github.com/fgrehm/docker-provider. - fgrehm
Docker không phải là ảo hóa, nhưng chạy hệ điều hành bên trong thùng chứa riêng của nó, sử dụng cùng một hạt nhân chủ, nó không phải là nhà cung cấp giống như các máy ảo khác, vì vậy docker đã được hỗ trợ bởi Vagrant. - Aftab Naveed
Docker là ảo hóa của bản thân hệ điều hành, ngầm sử dụng lại phần cứng cơ bản. Nó là ảo hóa khi nó tóm tắt và cô lập hệ thống tập tin, mạng và các tiến trình đang chạy trong một thùng chứa. - jose.angel.jimenez


Chúng rất bổ sung.

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

Trong Vagrant bạn hoàn toàn có thể làm được với bất kỳ điều khoản độc quyền Chef nào và tất cả những gì bạn cần là tập tin mơ hồ của bạn là chuẩn bị một máy chạy một kịch bản shell nhỏ cài đặt docker. Điều này có nghĩa rằng 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 kịch bản 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

Cấu hình solo của đầu bếp không phải là docker sẽ phức tạp hơn nhiều.

Một lợi ích lớn cuối cùng đã đạt được khi bạn chuyển sang sản xuất, dịch môi trường phát triển sang cơ sở hạ tầng của các máy chủ giống nhau ở chỗ chúng chỉ có đủ cấu hình để chạy docker 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ột môi trường phát triển Vagrant / Docker


52
2017-08-20 20:42



Bạn đã làm tất cả các dàn nhạc docker_start nhưng không bận tâm liên kết các thùng chứa với nhau. Bạn chỉ cần đi với số cổng cứng mã hóa bởi vì bạn đang chạy nó dưới Vagrant? - WineSoaked
Xin chào WineSoaked, 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 / lang thang / 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 docker run 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 tới các dịch vụ. - Mark Stratmann
Tôi có thể thấy khả năng hợp nhất cả hai sản phẩm. Vagrant như kiểm tra môi trường và docker cho wrapper ứng dụng. Hợp nhất cả hai bạn có thể thử nghiệm một ứng dụng hoặc thử nghiệm đơn vị trên nhiều escenarios. Tôi nghĩ rằng nhiều "dịch vụ nền tảng thử nghiệm" đang sử dụng Vagrant + Docker vào thời điểm đó. - erm3nda
"Họ rất tự do." - Cả hai đều miễn phí để sử dụng, thực sự. - Underyx
Xin chào @koppor Tôi đã sử dụng máy docker gần đây nhất khoảng ba tháng trước và chưa quay lại. Vấn đề tôi đã có được rằng nó có một lỗi trong việc chia sẻ các thư mục từ máy chủ lưu trữ MAC của tôi để VM 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 vùng chứa docker. Tôi không biết nếu họ đã sửa nó chưa, khi họ thực sự tôi sẽ thực sự chuyển sang nó. Tuy nhiên tôi đã chuyển tất cả các dàn nhạc container của tôi thành docker sáng tác kể từ khi viết câu trả lời này - Mark Stratmann


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 ảo (VirtualBox) mặc định có nhưng nó sẽ cho phép bạn linh hoạt hơn so với các thùng chứa docker. Có một video trong liên kết thể hiện khả năng đáng xem của nó.


48
2017-08-01 18:44



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


Với Vagrant bây giờ bạn có thể có Docker như một nhà cung cấp. http://docs.vagrantup.com/v2/docker/. Nhà cung cấp Docker có thể được sử dụng thay cho 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 với việc 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ế Đầu bếp hoặc là Con rối với Docker. Bạn có thể sử dụng các kết hợp như Docker như nhà cung cấp (VM) với Đầu bếp làm người cung cấp. Hoặc bạn có thể sử dụng VirtualBox làm nhà cung cấp và Docker làm người cung cấp.


41
2018-05-30 16:10



thế giới chỉ phát điên lên), chúng ta có thể chạy lang thang bằng cách sử dụng nhà cung cấp docker để chạy container docker bên trong lang thang - Hoto
@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ồ)? - Tset Noitamotua


Sử dụng cả hai đều là một phần quan trọng trong thử nghiệm phân phối ứng dụng. Tôi chỉ mới bắt đầu tham gia với Docker và suy nghĩ rất nhiều về một nhóm ứng dụng có sự 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 suy nghĩ về một dự án Phoenix cổ điển / tình hình giao hàng liên tục.

Suy nghĩ diễn ra như sau:

  • 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 chắn ứng dụng có được tích hợp trong vùng chứa hay được xây dựng sau đó không được cài đặt vào vùng chứa)
  • Cung cấp vùng chứa cho máy ảo 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 (các) thành phần để chống lại.
  • Liên tục kiểm tra cơ chế phân phối cho (các) máy ảo được quản lý bởi Vagrant
  • Ngủ ngon khi biết thời điểm triển khai vùng chứa, 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.

Điều này có vẻ là phần mở rộng hợp lý của tuyên bố của Mitchell rằng Vagrant là để phát triển kết hợp với Farley / Humbles suy nghĩ trong giao hàng liên tục. Nếu tôi, là một nhà phát triển, có thể thu hẹp vòng phản hồi về kiểm tra 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à nhà phát triển, tôi liên tục cung cấp các thùng chứa đến máy ảo và kiểm tra ứ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 phẩm sẽ đơn giản hơn nữa.

Vì vậy, tôi thấy Vagrant 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ẽ có để triển khai ứng dụng.


11
2018-06-20 00:56



bạn có cơ hội nào có bài đăng trên blog về điều này không? đã gần hai năm rồi, nó sẽ như thế nào? vẫn còn sử dụng lang thang với docker hoặc chỉ docker và docker-fleat / máy? - Hoto
Công ty tôi đang làm việc đã được mua lại và họ đã gỡ tất cả nội dung của tôi xuống @Hoto. Câu trả lời ngắn gọn là tôi sử dụng docker-máy ở nhà cho các dự án thú cưng của tôi. Tại nơi làm việc, tôi <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 thường là Vagrant. - Boyd Hemphill


Có một bài báo thực sự mang tính thông tin trong 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 các máy ảo cổ điển   và trở nên phổ biến trong số các nhà phát triển và là một phần của CD và DevOps   khả năng phán đoán. Nếu mục đích của bạn là cách ly, Docker là một lựa chọn tuyệt vời.   Vagrant là một trình quản lý VM cho phép bạn cấu hình tập lệnh của   các máy ảo cá nhân cũng như thực hiện cấp phé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   chi phí lớn. Nó đòi hỏi bạn phải có một ổ đĩa cứng nhàn rỗi có thể được   rất lớn, phải mất rất nhiều RAM, và hiệu suất có thể được tối ưu. Docker   sử dụng các nhóm hạt nhân và cách ly không gian tên thông qua LXC. Điều này có nghĩa rằng   bạn đang sử dụng cùng hạt nhân 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ự so sánh được. Các công cụ quản lý cấu hình như Puppet là   được sử dụng rộng rãi để cung cấp môi trường đích. Đang sử dụng lại   Các giải pháp dựa trên con rối rất dễ dàng với Docker. Bạn cũng có thể cắt   giải pháp, vì vậy cơ sở hạ tầng được cấp phép với Puppet; các   middleware, bản thân ứng dụng nghiệp vụ, hoặc cả hai đều được cấp phép   với Docker; và Docker được gói bởi Vagrant. Với phạm vi này   công cụ, 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à dàn xếp vùng chứa Docker trong DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0


5
2017-08-20 13:04



Và trong trường hợp bạn không muốn điền vào các biểu mẫu ngu ngốc và dài và bạn có thiết bị iOS, vui lòng tải xuống ứng dụng và sự cố chỉ bằng một vài thao tác: itunes.apple.com/app/java-magazine/id530494326?mt=8 - Rafael Bugajewski
Vì vậy, nhiều t mất tích - Paul Verest


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

Như bạn có thể biết Vagrant là để quản lý máy ảo trong khi Docker dùng để quản lý các phần mềm. Nếu bạn không biết sự khác biệt, dưới đây là: Một thùng chứa phần mềm có thể chia sẻ cùng một máy và hạt nhân 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 bởi 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 cho mỗi máy chủ giữ mức độ cô lập tốt.

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

Đi cho 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.


5
2018-03-24 14:40