ฉันใช้ Ubuntu เพื่อการพัฒนาและการปรับใช้และมีความต้องการในการสร้างสภาพแวดล้อมแบบแยก
ฉันกำลังพิจารณา Vagrant หรือ Docker สำหรับวัตถุประสงค์นี้ ข้อดีและข้อเสียคืออะไรหรือเปรียบเทียบโซลูชั่นเหล่านี้อย่างไร
ฉันใช้ Ubuntu เพื่อการพัฒนาและการปรับใช้และมีความต้องการในการสร้างสภาพแวดล้อมแบบแยก
ฉันกำลังพิจารณา Vagrant หรือ Docker สำหรับวัตถุประสงค์นี้ ข้อดีและข้อเสียคืออะไรหรือเปรียบเทียบโซลูชั่นเหล่านี้อย่างไร
คำตอบ:
ถ้าจุดประสงค์ของคุณคือการแยกฉันคิดว่านักเทียบท่าคือสิ่งที่คุณต้องการ
Vagrant เป็นผู้จัดการเครื่องเสมือน ช่วยให้คุณสคริปต์การกำหนดค่าเครื่องเสมือนเช่นเดียวกับการจัดเตรียม อย่างไรก็ตามมันยังคงเป็นเครื่องเสมือนขึ้นอยู่กับVirtualBox (หรืออื่น ๆ ) ที่มีค่าใช้จ่ายมาก มันต้องการให้คุณมีไฟล์ฮาร์ดไดรฟ์ที่มีขนาดใหญ่มากต้องใช้ RAM จำนวนมากและประสิทธิภาพอาจไม่ดีนัก
เทียบท่าในการใช้มืออื่น ๆ Kernel cgroup และ namespacing ผ่านLXC หมายความว่าคุณใช้เคอร์เนลเดียวกันกับโฮสต์และระบบไฟล์เดียวกัน คุณสามารถใช้ Dockerfile กับdocker build
คำสั่งเพื่อจัดการกับการเตรียมและกำหนดค่าคอนเทนเนอร์ของคุณ คุณมีตัวอย่างที่docs.docker.comเกี่ยวกับวิธีสร้าง Dockerfile ของคุณ มันใช้งานง่ายมาก
เหตุผลเดียวที่คุณต้องการใช้ Vagrant คือถ้าคุณต้องทำ BSD, Windows หรือการพัฒนาอื่น ๆ ที่ไม่ใช่ Linux บนกล่อง Ubuntu ของคุณ มิฉะนั้นไปหานักเทียบท่า
คำเตือน: ฉันเขียน Vagrant! แต่เนื่องจากฉันเขียน Vagrant ฉันใช้เวลาส่วนใหญ่อยู่ในโลก DevOps ซึ่งมีซอฟต์แวร์เช่น Docker ฉันทำงานกับ บริษัท จำนวนมากที่ใช้ Vagrant และหลายคนใช้ Docker และฉันเห็นว่าทั้งสองมีอิทธิพลกันอย่างไร
ก่อนที่ฉันจะพูดมากเกินไปคำตอบโดยตรง:ในสถานการณ์เฉพาะของคุณ (ตัวคุณเองทำงานคนเดียวทำงานบน Linux ใช้งาน Docker ในการผลิต) คุณสามารถติดกับ Docker เพียงอย่างเดียวและทำให้สิ่งต่าง ๆ ง่ายขึ้น ในสถานการณ์อื่น ๆ (ฉันพูดคุยเพิ่มเติม) มันไม่ง่ายเลย
การเปรียบเทียบ Vagrant กับ Docker โดยตรงไม่ถูกต้อง ในบางสถานการณ์พวกเขาจะทับซ้อนกันและส่วนใหญ่พวกเขาทำไม่ได้ ที่จริงแล้วการเปรียบเทียบที่ฉลาดกว่าจะเป็น Vagrant เทียบกับบางอย่างเช่น Boot2Docker (ระบบปฏิบัติการขั้นต่ำที่สามารถเรียกใช้ Docker ได้) Vagrant เป็นระดับเหนือ Docker ในแง่ของ abstractions ดังนั้นจึงไม่ใช่การเปรียบเทียบที่ยุติธรรมในกรณีส่วนใหญ่
Vagrant เปิดตัวสิ่งต่าง ๆ เพื่อเรียกใช้แอพ / บริการเพื่อการพัฒนา สามารถอยู่บน VirtualBox, VMware มันสามารถอยู่ในระยะไกลเช่น AWS, OpenStack ภายในนั้นหากคุณใช้ตู้คอนเทนเนอร์ Vagrant จะไม่สนใจและยอมรับว่า: สามารถติดตั้งดึงลงสร้างและเรียกใช้คอนเทนเนอร์ Docker โดยอัตโนมัติ ด้วย Vagrant 1.6 ทำให้ Vagrant มีสภาพแวดล้อมการพัฒนาที่อิงตามนักเทียบท่าและสนับสนุนการใช้ Docker ที่มีเวิร์กโฟลว์เดียวกับ Vagrant ใน Linux, Mac และ Windows Vagrant ไม่ได้พยายามแทนที่นักเทียบท่าที่นี่ แต่เป็นแนวทางปฏิบัติของนักเทียบท่า
นักเทียบท่าเรียกใช้คอนเทนเนอร์นักเทียบท่าโดยเฉพาะ หากคุณกำลังเปรียบเทียบโดยตรงกับ Vagrant: มันเป็นโซลูชันเฉพาะเจาะจงมากขึ้น (สามารถเรียกใช้คอนเทนเนอร์ของนักเทียบท่าเท่านั้น) โซลูชันที่ยืดหยุ่นน้อยกว่า (ต้องใช้ Linux หรือ Linux โฮสต์ที่ไหนสักแห่ง) แน่นอนถ้าคุณกำลังพูดถึงการผลิตหรือ CI ไม่มีการเปรียบเทียบกับ Vagrant! Vagrant ไม่ได้อยู่ในสภาพแวดล้อมเหล่านี้ดังนั้นควรใช้ Docker
หากองค์กรของคุณทำงานเฉพาะคอนเทนเนอร์ Docker สำหรับทุกโครงการและมีผู้พัฒนาที่ทำงานบน Linux เท่านั้นก็ไม่เป็นไร Docker สามารถทำงานให้คุณได้อย่างแน่นอน!
ไม่เช่นนั้นฉันไม่เห็นประโยชน์ที่จะพยายามใช้ Docker เพียงอย่างเดียวเนื่องจากคุณสูญเสียสิ่งที่ Vagrant มอบให้ซึ่งมีผลประโยชน์ทางธุรกิจ / ผลผลิตจริง:
Vagrant สามารถเปิดตัว VirtualBox, VMware, AWS, OpenStack และอื่น ๆ ไม่สำคัญว่าคุณต้องการอะไร Vagrant สามารถเปิดตัวได้ หากคุณกำลังใช้ Docker, Vagrant สามารถติดตั้ง Docker ลงบนสิ่งเหล่านี้เพื่อให้คุณสามารถใช้พวกมันสำหรับวัตถุประสงค์นั้นได้
Vagrant เป็นกระบวนการทำงานเดียวสำหรับทุกโครงการของคุณ หรือวิธีอื่นก็เป็นเพียงสิ่งหนึ่งที่ผู้คนต้องเรียนรู้ที่จะทำโครงการไม่ว่าจะเป็นใน Docker container หรือไม่ ยกตัวอย่างเช่นหากในอนาคตผู้เข้าแข่งขันจะแข่งขันโดยตรงกับนักเทียบท่าก็จะสามารถใช้ Vagrant ได้เช่นกัน
Vagrant ทำงานบน Windows (กลับไปที่ XP), Mac (ย้อนกลับไปที่ 10.5) และ Linux (กลับไปที่เคอร์เนล 2.6) ในทั้งสามกรณีเวิร์กโฟลว์จะเหมือนกัน หากคุณใช้ Docker, Vagrant สามารถเปิดเครื่อง (VM หรือระยะไกล) ที่สามารถเรียกใช้ Docker บนทั้งสามระบบเหล่านี้
Vagrant รู้วิธีกำหนดค่าบางสิ่งขั้นสูงหรือไม่สำคัญเช่นเครือข่ายและโฟลเดอร์ที่ซิงค์ ตัวอย่างเช่น: Vagrant รู้วิธีแนบ IP แบบคงที่กับเครื่องหรือพอร์ตไปข้างหน้าและการกำหนดค่าจะเหมือนกันไม่ว่าคุณจะใช้ระบบใด (VirtualBox, VMware ฯลฯ ) สำหรับโฟลเดอร์ที่ซิงค์ Vagrant มีกลไกหลายอย่างเพื่อให้เครื่องของคุณ ไฟล์ไปยังเครื่องระยะไกล (โฟลเดอร์ที่ใช้ร่วมกัน VirtualBox, NFS, rsync, Samba [ปลั๊กอิน], ฯลฯ ) หากคุณใช้ Docker หรือแม้แต่ Docker ที่มี VM โดยไม่ต้องใช้ Vagrant คุณต้องทำสิ่งนี้ด้วยตนเอง
คนจรจัด 1.6 มีการสนับสนุนชั้นแรกสำหรับสภาพแวดล้อมการพัฒนานักเทียบท่าตาม สิ่งนี้จะไม่เปิดเครื่องเสมือนบน Linux และจะเปิดเครื่องเสมือนบน Mac และ Windows โดยอัตโนมัติ ผลลัพธ์ที่ได้คือการทำงานกับ Docker นั้นเหมือนกันในทุกแพลตฟอร์มในขณะที่ Vagrant ยังคงจัดการรายละเอียดที่น่าเบื่อของสิ่งต่าง ๆ เช่นเครือข่ายโฟลเดอร์ที่ซิงค์เป็นต้น
ในการจัดการกับข้อโต้แย้งที่เฉพาะเจาะจงที่ฉันเคยได้ยินเกี่ยวกับการใช้ Docker แทน Vagrant:
"มันเป็นชิ้นส่วนที่เคลื่อนไหวน้อยกว่า" - สามารถเป็นไปได้ถ้าคุณใช้ Docker โดยเฉพาะสำหรับทุกโครงการ ถึงอย่างนั้นมันยังคงมีความยืดหยุ่นสำหรับล็อคเกอร์ใน Docker หากคุณตัดสินใจที่จะไม่ใช้ Docker สำหรับโครงการใด ๆ ในอดีตปัจจุบันหรืออนาคตคุณจะมีชิ้นส่วนที่เคลื่อนไหวได้มากขึ้น หากคุณใช้ Vagrant คุณมีส่วนที่เคลื่อนไหวหนึ่งที่รองรับส่วนที่เหลือ
"มันเร็วกว่า!" - เมื่อคุณมีโฮสต์ที่สามารถใช้งานคอนเทนเนอร์ Linux ได้ Docker จะเร็วกว่าในการใช้งานคอนเทนเนอร์มากกว่าเครื่องเสมือนใด ๆ ที่จะเปิดตัว แต่การเปิดตัวเครื่องเสมือน (หรือเครื่องระยะไกล) เป็นค่าใช้จ่ายครั้งเดียว ตลอดทั้งวันผู้ใช้ Vagrant ส่วนใหญ่ไม่เคยทำลาย VM ของพวกเขา เป็นการเพิ่มประสิทธิภาพที่แปลกสำหรับสภาพแวดล้อมการพัฒนา ในการผลิตที่นักเทียบท่าส่องแสงจริง ๆ ฉันเข้าใจถึงความต้องการหมุนภาชนะบรรจุขึ้น / ลงอย่างรวดเร็ว
ฉันหวังว่าตอนนี้มันชัดเจนที่จะเห็นว่ามันเป็นเรื่องยากมากและฉันเชื่อว่าไม่ถูกต้องเพื่อเปรียบเทียบนักเทียบท่ากับคนจรจัด สำหรับสภาพแวดล้อมการพัฒนา Vagrant นั้นมีความเป็นนามธรรมมากกว่าทั่วไป นักเทียบท่า (และวิธีการต่าง ๆ ที่คุณสามารถทำให้มันเป็นเหมือน Vagrant ได้) เป็นกรณีการใช้งานเฉพาะของ Vagrant โดยไม่สนใจทุกสิ่งที่ Vagrant นำเสนอ
โดยสรุป: ในกรณีที่มีการใช้งานเฉพาะอย่างสูง Docker ย่อมเป็นสิ่งทดแทนที่เป็นไปได้สำหรับ Vagrant ในกรณีส่วนใหญ่จะใช้ไม่ได้ Vagrant ไม่ขัดขวางการใช้ Docker ของคุณ มันทำในสิ่งที่ทำได้เพื่อทำให้ประสบการณ์นั้นราบรื่นขึ้น หากคุณพบว่าสิ่งนี้ไม่เป็นความจริงฉันยินดีที่จะรับข้อเสนอแนะเพื่อปรับปรุงสิ่งต่าง ๆ เนื่องจากเป้าหมายของ Vagrant คือการทำงานได้ดีกับระบบใด ๆ
หวังว่านี่จะช่วยล้างสิ่งต่างๆ!
vagrant provision
)
ฉันเป็นนักเขียน Docker
คำตอบสั้น ๆ คือถ้าคุณต้องการจัดการเครื่องคุณควรใช้ Vagrant และถ้าคุณต้องการสร้างและเรียกใช้สภาพแวดล้อมของแอปพลิเคชันคุณควรใช้ Docker
Vagrant เป็นเครื่องมือสำหรับจัดการเครื่องเสมือน นักเทียบท่าเป็นเครื่องมือสำหรับการสร้างและปรับใช้แอปพลิเคชันโดยการบรรจุลงในคอนเทนเนอร์น้ำหนักเบา คอนเทนเนอร์สามารถเก็บส่วนประกอบซอฟต์แวร์ใด ๆ ไว้พร้อมกับการพึ่งพา (executables, ไลบรารี, ไฟล์กำหนดค่า, ฯลฯ ) และดำเนินการในสภาพแวดล้อมรันไทม์ที่รับประกันและทำซ้ำได้ สิ่งนี้ทำให้การสร้างแอปของคุณนั้นง่ายมากและใช้งานได้ทุกที่ - บนแล็ปท็อปของคุณเพื่อทำการทดสอบแล้วบนเซิร์ฟเวอร์ที่แตกต่างกันสำหรับการปรับใช้แบบสดเป็นต้น
เป็นความเข้าใจผิดที่คุณสามารถใช้ Docker บน Linux ได้เท่านั้น มันไม่ถูกต้อง คุณยังสามารถติดตั้ง Docker บน Mac และ Windows เมื่อติดตั้งบน Mac Docker จะรวม Linux VM ขนาดเล็ก (25 MB บนดิสก์!) ซึ่งทำหน้าที่เป็น wrapper สำหรับคอนเทนเนอร์ของคุณ เมื่อติดตั้งแล้วนี่จะโปร่งใสอย่างสมบูรณ์ คุณสามารถใช้บรรทัดคำสั่ง Docker ได้ในวิธีเดียวกัน สิ่งนี้ให้สิ่งที่ดีที่สุดสำหรับคุณทั้งสองโลก: คุณสามารถทดสอบและพัฒนาแอปพลิเคชันของคุณโดยใช้คอนเทนเนอร์ซึ่งมีน้ำหนักเบามากง่ายต่อการทดสอบและเคลื่อนย้ายได้ง่าย (ดูตัวอย่างhttps://hub.docker.comสำหรับแชร์คอนเทนเนอร์ที่ใช้ซ้ำได้ด้วย ชุมชนนักเทียบท่า) และคุณไม่จำเป็นต้องกังวลเกี่ยวกับรายละเอียดเล็ก ๆ น้อย ๆ ของการจัดการเครื่องเสมือนซึ่งเป็นวิธีการสิ้นสุด
ในทางทฤษฎีมันเป็นไปได้ที่จะใช้ Vagrant เป็นเลเยอร์นามธรรมสำหรับนักเทียบท่า ฉันขอแนะนำสิ่งนี้ด้วยเหตุผลสองประการ:
อันดับแรก Vagrant ไม่ใช่สิ่งที่ดีสำหรับนักเทียบท่า Vagrant ถูกออกแบบมาเพื่อจัดการเครื่องเสมือน นักเทียบท่าถูกออกแบบมาเพื่อจัดการรันไทม์ของแอปพลิเคชัน ซึ่งหมายความว่านักออกแบบสามารถโต้ตอบกับแอปพลิเคชันได้หลากหลายยิ่งขึ้นและมีข้อมูลเพิ่มเติมเกี่ยวกับแอปพลิเคชันรันไทม์ สิ่งพื้นฐานใน Docker คือกระบวนการสตรีมล็อกตัวแปรสภาพแวดล้อมและลิงก์เครือข่ายระหว่างส่วนประกอบ ดั้งเดิมใน Vagrant คือเครื่องจักรอุปกรณ์บล็อกและปุ่ม ssh Vagrant ตั้งอยู่ในสแต็กที่ต่ำกว่าและวิธีเดียวที่มันสามารถโต้ตอบกับคอนเทนเนอร์ได้คือการแกล้งมันเป็นเพียงเครื่องจักรชนิดอื่นที่คุณสามารถ "บู๊ต" และ "ล็อคอิน" ดังนั้นคุณสามารถพิมพ์ "vagrant up" ด้วยปลั๊กอิน Docker และสิ่งที่จะเกิดขึ้น มันเป็นสิ่งที่ทดแทนความกว้างทั้งหมดของสิ่งที่นักเทียบท่าสามารถทำได้หรือไม่? ลองนักเทียบท่าพื้นเมืองสักสองสามวันแล้วดูเอง :)
ประการที่สองการโต้แย้งในการล็อค "ถ้าคุณใช้ Vagrant เป็นนามธรรมคุณจะไม่ถูกล็อคใน Docker!" จากมุมมองของ Vagrant ที่ออกแบบมาเพื่อจัดการเครื่องจักรสิ่งนี้เหมาะสมอย่างยิ่ง: ไม่ได้เป็นเพียงเครื่องจักรชนิดอื่นใช่ไหม เช่นเดียวกับ Amazon EC2 และ VMware เราต้องระวังไม่ผูกเครื่องมือการจัดเตรียมของเรากับผู้ขายรายใดรายหนึ่ง! สิ่งนี้จะสร้างการล็อคอิน - ดีกว่าที่จะสรุปได้ทั้งหมดกับ Vagrant ยกเว้นสิ่งนี้จะพลาดจุดเชื่อมต่อทั้งหมด นักเทียบท่าไม่ได้จัดเตรียมเครื่อง มันห่อใบสมัครของคุณใน runtime แบบพกพาน้ำหนักเบาซึ่งสามารถทิ้งได้ทุกที่
รันไทม์ใดที่คุณเลือกสำหรับแอปพลิเคชันของคุณไม่เกี่ยวกับวิธีการจัดเตรียมเครื่องของคุณ! ตัวอย่างเช่นมันค่อนข้างบ่อยในการปรับใช้แอพพลิเคชั่นให้กับเครื่องที่มีคนอื่นจัดเตรียมไว้ (เช่นอินสแตนซ์ EC2 ที่ปรับใช้โดยผู้ดูแลระบบของคุณอาจใช้ Vagrant) หรือกับเครื่องโลหะเปลือย ในทางกลับกันคุณอาจใช้ Vagrant ในการจัดหาเครื่องที่ไม่มีส่วนเกี่ยวข้องกับการพัฒนาแอปพลิเคชันของคุณตัวอย่างเช่นกล่อง Windows IIS ที่พร้อมใช้งานหรือบางอย่าง หรือคุณอาจใช้ Vagrant เพื่อจัดหาเครื่องจักรสำหรับโครงการที่ไม่ได้ใช้ Docker - บางทีพวกเขาอาจใช้ rubygems และ rvm ร่วมกันสำหรับการจัดการการพึ่งพาและการทดลองแบบ sandbox
โดยสรุป: Vagrant ใช้สำหรับจัดการเครื่องและ Docker ใช้สำหรับสร้างและเรียกใช้สภาพแวดล้อมของแอปพลิเคชัน
ฉันนำหน้าคำตอบของฉันโดยยอมรับว่าฉันไม่มีประสบการณ์กับนักเทียบท่านอกจากผู้สังเกตการณ์ตัวยงของสิ่งที่ดูเหมือนว่าจะเป็นทางออกที่เรียบร้อยจริงๆที่ดึงดูดมาก
ฉันมีประสบการณ์จำนวนมากกับ Vagrant และสามารถแนะนำได้อย่างมาก แน่นอนว่ามันเป็นโซลูชั่นเฮฟวี่เวทมากขึ้นในแง่ของการเป็น VM ที่ใช้แทน LXC อย่างไรก็ตามฉันพบแล็ปท็อปที่เหมาะสม (RAM 8 GB, i5 / i7 CPU) ไม่มีปัญหาในการใช้ VM โดยใช้ Vagrant / VirtualBox ควบคู่ไปกับการพัฒนาเครื่องมือ
หนึ่งในสิ่งที่ยอดเยี่ยมที่สุดกับ Vagrant คือการรวมกับPuppet / Chef / shell script สำหรับการกำหนดค่าอัตโนมัติ หากคุณใช้หนึ่งในตัวเลือกเหล่านี้เพื่อกำหนดค่าสภาพแวดล้อมการผลิตของคุณคุณสามารถสร้างสภาพแวดล้อมการพัฒนาที่ใกล้เคียงกับที่คุณจะได้รับและนี่คือสิ่งที่คุณต้องการ
ข้อดีอีกอย่างของ Vagrant ก็คือคุณสามารถเวอร์ชั่น Vagrantfile ของคุณพร้อมกับรหัสแอปพลิเคชันของคุณ ซึ่งหมายความว่าทุกคนในทีมของคุณสามารถแชร์ไฟล์นี้และคุณรับประกันได้ว่าทุกคนทำงานกับการกำหนดค่าสภาพแวดล้อมเดียวกัน
ที่น่าสนใจ Vagrant และ Docker อาจให้บริการฟรี Vagrant สามารถขยายเพื่อรองรับผู้ให้บริการเวอร์ชวลไลเซชันต่าง ๆ และอาจเป็นไปได้ว่านักเทียบท่าเป็นหนึ่งในผู้ให้บริการดังกล่าวซึ่งจะได้รับการสนับสนุนในอนาคตอันใกล้ ดูhttps://github.com/dotcloud/docker/issues/404สำหรับการสนทนาล่าสุดในหัวข้อ
พวกเขาเสริมมาก
ฉันได้ใช้การผสมผสานของ VirtualBox, Vagrant และ Docker สำหรับทุกโครงการของฉันเป็นเวลาหลายเดือนและรู้สึกถึงประโยชน์ดังต่อไปนี้
ใน Vagrant คุณสามารถทำได้อย่างสมบูรณ์ด้วยการจัดเตรียมแบบเดี่ยวของ Chef และสิ่งที่คุณต้องการในไฟล์ Vagrant ของคุณคือเตรียมเครื่องที่ใช้งานเชลล์สคริปต์ตัวเล็ก ๆ ตัวเดียวที่ติดตั้ง Docker ซึ่งหมายความว่าไฟล์ Vagrant ของฉันสำหรับทุกโครงการเกือบจะเหมือนกันและเรียบง่ายมาก
นี่คือไฟล์ 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
ไฟล์ Bootstrap ที่ติดตั้ง docker มีลักษณะดังนี้
#!/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
การกำหนดค่าโซโลที่ไม่ใช่นักเทียบท่าเชฟจะมีความซับซ้อนมากขึ้น
บวกใหญ่สุดท้ายจะได้รับเมื่อคุณกำลังย้ายเข้าสู่การผลิตแปลสภาพแวดล้อมการพัฒนาไปยังโครงสร้างพื้นฐานของโฮสต์ที่เหมือนกันทั้งหมดที่พวกเขามี config เพียงพอที่จะเรียกใช้นักเทียบท่าหมายความว่างานน้อยมากแน่นอน
หากคุณสนใจฉันมีบทความรายละเอียดเพิ่มเติมเกี่ยวกับสภาพแวดล้อมการพัฒนาบนเว็บไซต์ของฉันเองที่
Vagrant-lxcเป็นปลั๊กอินสำหรับ Vagrant ที่ให้คุณใช้ LXC เพื่อจัดเตรียม Vagrant มันไม่ได้มีคุณสมบัติทั้งหมดที่คนจรจัดเริ่มต้น VM (VirtualBox) มี แต่มันจะช่วยให้คุณมีความยืดหยุ่นมากขึ้นกว่าคอนเทนเนอร์นักเทียบท่า มีวิดีโอในลิงค์แสดงความสามารถที่คุ้มค่าแก่การดู
ด้วย Vagrant ตอนนี้คุณสามารถมี Docker ในฐานะผู้ให้บริการได้แล้ว http://docs.vagrantup.com/v2/docker/ ผู้ให้บริการ Docker สามารถใช้แทน VirtualBox หรือ VMware
โปรดทราบว่าคุณยังสามารถใช้นักเทียบท่าสำหรับการจัดเตรียมกับ Vagrant สิ่งนี้แตกต่างจากการใช้ Docker เป็นผู้ให้บริการ http://docs.vagrantup.com/v2/provisioning/docker.html
ซึ่งหมายความว่าคุณสามารถแทนที่ChefหรือPuppetด้วย Docker คุณสามารถใช้ชุดค่าผสมเช่น Docker เป็น Provider (VM) กับ Chef เป็นตัวจัดเตรียม หรือคุณสามารถใช้ VirtualBox เป็นผู้ให้บริการและนักเทียบท่าเป็นผู้จัดสรร
การใช้ทั้งสองอย่างเป็นส่วนสำคัญของการทดสอบการส่งมอบแอปพลิเคชัน ฉันเพิ่งเริ่มมีส่วนร่วมกับนักเทียบท่าและคิดอย่างหนักเกี่ยวกับทีมแอปพลิเคชันที่มีความซับซ้อนอย่างยิ่งในการสร้างและส่งมอบซอฟต์แวร์ นึกถึงโครงการฟีนิกซ์คลาสสิก / สถานการณ์การจัดส่งอย่างต่อเนื่อง
ความคิดเป็นไปดังนี้:
นี่น่าจะเป็นส่วนขยายเชิงตรรกะของคำแถลงของมิตเชลล์ที่ว่า Vagrant นั้นมีไว้สำหรับการพัฒนาร่วมกับฟาร์ลี่ย์ / ฮับเบิลส์ที่คิดในการจัดส่งต่อเนื่อง ถ้าฉันในฐานะนักพัฒนาซอฟต์แวร์สามารถย่อความคิดเห็นย้อนกลับในการทดสอบการรวมและการส่งแอปพลิเคชันคุณภาพที่สูงขึ้นและสภาพแวดล้อมการทำงานที่ดีขึ้นจะตามมา
ความจริงที่ว่าในฐานะนักพัฒนาฉันส่งมอบคอนเทนเนอร์ไปยัง VM อย่างต่อเนื่องและสม่ำเสมอและทดสอบแอพพลิเคชั่นแบบองค์รวมมากขึ้นนั่นหมายความว่าการเผยแพร่การผลิตจะง่ายขึ้นอีก
ดังนั้นฉันจึงเห็นว่า Vagrant กำลังพัฒนาเพื่อใช้ประโยชน์จากผลลัพธ์ที่ยอดเยี่ยมบางส่วนที่นักเทียบท่าจะต้องมีสำหรับการปรับใช้แอป
นักเทียบท่าแน่นอนสำหรับผู้ชนะ!
ดังที่คุณอาจทราบว่า Vagrant ใช้สำหรับการจัดการเครื่องเสมือนในขณะที่ Docker ใช้สำหรับการจัดการคอนเทนเนอร์ซอฟต์แวร์ หากคุณไม่ทราบถึงความแตกต่างนี่คือ: คอนเทนเนอร์ซอฟต์แวร์สามารถแชร์เครื่องและเคอร์เนลเดียวกันกับคอนเทนเนอร์ซอฟต์แวร์อื่น การใช้ภาชนะบรรจุที่คุณประหยัดเงินเพราะคุณไม่ต้องเสียทรัพยากรในระบบปฏิบัติการหลายระบบ (เมล็ด) คุณสามารถบรรจุซอฟต์แวร์ได้มากขึ้นต่อเซิร์ฟเวอร์โดยรักษาระดับการแยกที่ดี
แน่นอนว่าเป็นวินัยใหม่ในการดูแลกับ pitfals และความท้าทายของตัวเอง
ไปที่ Docker Swarm หากความต้องการของคุณข้ามขีด จำกัด ของทรัพยากรเครื่องเดียว
มีบทความให้ข้อมูลจริงๆในนิตยสาร Oracle Java จริงเกี่ยวกับการใช้ Docker ร่วมกับ Vagrant (และ Puppet):
ข้อสรุป
คอนเทนเนอร์น้ำหนักเบาของนักเทียบท่านั้นเร็วกว่าเมื่อเทียบกับ VMs แบบคลาสสิกและได้รับความนิยมในหมู่นักพัฒนาและเป็นส่วนหนึ่งของโครงการ CD และ DevOps หากวัตถุประสงค์ของคุณคือการแยก Docker เป็นตัวเลือกที่ยอดเยี่ยม Vagrant เป็นผู้จัดการ VM ที่ช่วยให้คุณสามารถกำหนดค่าสคริปต์ของแต่ละ VMs รวมถึงการจัดเตรียม อย่างไรก็ตามมันเป็นเพียงการพึ่งพา VM ขึ้นอยู่กับ VirtualBox (หรือผู้จัดการ VM อื่น) ที่มีค่าใช้จ่ายที่ค่อนข้างใหญ่ มันต้องการให้คุณมีฮาร์ดไดรฟ์ที่ไม่ได้ใช้งานซึ่งอาจมีขนาดใหญ่ใช้ RAM มากและประสิทธิภาพอาจไม่ดีพอ นักเทียบท่าใช้กลุ่มเคอร์เนลและการแยกเนมสเปซผ่าน LXC ซึ่งหมายความว่าคุณกำลังใช้เคอร์เนลเดียวกันกับโฮสต์และระบบ ile เดียวกัน คนเร่ร่อนเป็นระดับเหนือนักเทียบท่าในแง่ของความเป็นนามธรรมดังนั้นพวกมันจึงไม่สามารถเทียบเคียงได้ เครื่องมือการจัดการการกำหนดค่าเช่น Puppet ใช้กันอย่างแพร่หลายสำหรับการจัดเตรียมสภาพแวดล้อมเป้าหมาย การนำโซลูชั่นที่ใช้หุ่นกระบอกกลับมาใช้ใหม่ได้ง่ายด้วยนักเทียบท่า คุณยังสามารถแบ่งโซลูชันของคุณได้ดังนั้นโครงสร้างพื้นฐานจะถูกจัดเตรียมด้วย Puppet มิดเดิลแวร์, แอพพลิเคชั่นทางธุรกิจ, หรือทั้งคู่ได้รับการจัดเตรียมด้วย Docker; และนักเทียบท่าถูกห่อโดย Vagrant ด้วยเครื่องมือที่หลากหลายนี้คุณสามารถทำสิ่งที่ดีที่สุดสำหรับสถานการณ์ของคุณ
วิธีการสร้างใช้งานและดัดแปลงคอนเทนเนอร์ Docker ใน DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0