Computer >> คอมพิวเตอร์ >  >> ซอฟต์แวร์ >> เครื่องเสมือน

โหมดฝูง Docker Engine - บทช่วยสอนเบื้องต้น

ฟังดูเหมือนวงพังก์ร็อก แต่มันเป็นกลไกการประสานเสียงใหม่ล่าสุด หรือมากกว่านั้นคือการปรับปรุงการประสานเสียงที่มีอยู่ใน Docker เพื่อให้สั้นและกระชับ หากคุณใช้ Docker เวอร์ชันเก่า คุณจะต้องตั้งค่า Swarm ด้วยตนเองเพื่อสร้างคลัสเตอร์ Docker เริ่มตั้งแต่เวอร์ชัน 1.12 เอ็นจิ้น Docker มาพร้อมกับการใช้งานแบบเนทีฟที่ช่วยให้ตั้งค่าคลัสเตอร์ได้อย่างราบรื่น เหตุผลที่เรามาอยู่ที่นี่

ในบทช่วยสอนนี้ ฉันจะพยายามให้คุณได้ลิ้มรสว่านักเทียบท่าสามารถทำอะไรได้บ้างเมื่อพูดถึงการประสานเสียง บทความนี้ไม่ได้รวมทุกอย่าง (ที่พักพร้อมอาหารเช้า) หรือรอบรู้ทั้งหมด แต่มีสิ่งที่จะช่วยให้คุณเริ่มต้นการเดินทางแบบคลัสเตอร์ได้ หลังจากฉัน.

ภาพรวมเทคโนโลยี

เป็นเรื่องน่าเสียดายสำหรับฉันที่จะปรับปรุงบทความเอกสารประกอบ Docker ที่มีรายละเอียดมากและมีประโยชน์อย่างมาก ดังนั้นฉันจะสรุปภาพรวมโดยย่อของเทคโนโลยี เรามี Docker ใช่ไหม ตอนนี้ คุณต้องการใช้เซิร์ฟเวอร์มากกว่าหนึ่งเซิร์ฟเวอร์เป็นโฮสต์ Docker แต่คุณต้องการให้เซิร์ฟเวอร์เหล่านั้นอยู่ในเอนทิตีแบบลอจิคัลเดียวกัน ดังนั้นการจัดกลุ่ม

เริ่มจากกลุ่มหนึ่ง เมื่อคุณเริ่มต้นฝูงบนโฮสต์ มันจะกลายเป็นผู้จัดการของคลัสเตอร์ ในทางเทคนิคแล้วมันจะกลายเป็นกลุ่มที่สอดคล้องกันของโหนดเดียว ตรรกะทางคณิตศาสตร์เบื้องหลังขึ้นอยู่กับอัลกอริทึมแพ ผู้จัดการมีหน้าที่รับผิดชอบในการจัดตารางงาน งานจะถูกมอบหมายให้กับโหนดผู้ปฏิบัติงาน หนึ่งครั้งและหากพวกเขาเข้าร่วมกลุ่ม สิ่งนี้อยู่ภายใต้การควบคุมของ Node API ฉันเกลียดคำว่า API แต่ฉันต้องใช้มันที่นี่

Service API เป็นองค์ประกอบที่สองของการใช้งานนี้ ช่วยให้โหนดผู้จัดการสร้างบริการแบบกระจายบนโหนดทั้งหมดในกลุ่ม บริการสามารถทำซ้ำได้ หมายความว่าบริการเหล่านี้กระจายไปทั่วคลัสเตอร์โดยใช้กลไกการปรับสมดุล หรืออาจเป็นส่วนกลาง หมายความว่าอินสแตนซ์ของบริการจะทำงานในแต่ละโหนด

มีงานอีกมากมายที่นี่ แต่นี่ดีพอที่จะทำให้คุณเตรียมพร้อมและสูบฉีด ทีนี้ มาทำสิ่งที่ต้องทำจริงกัน แพลตฟอร์มเป้าหมายของเราคือ CentOS 7.2 ซึ่งค่อนข้างน่าสนใจ เพราะตอนที่ฉันเขียนบทช่วยสอนนี้ มีเพียง Docker 1.10 ใน repos และฉันต้องอัปเกรดเฟรมเวิร์กด้วยตนเองเพื่อใช้ swarm เราจะพูดถึงเรื่องนี้ในบทช่วยสอนแยกต่างหาก จากนั้น เราจะมีคำแนะนำติดตามผล ซึ่งเราจะรวมโหนดใหม่เข้ากับคลัสเตอร์ของเรา และเราจะลองตั้งค่าแบบไม่สมมาตรกับ Fedora ณ จุดนี้ โปรดถือว่ามีการตั้งค่าที่ถูกต้องแล้ว และเริ่มให้บริการคลัสเตอร์และทำงาน

ตั้งค่าอิมเมจและบริการ

ฉันจะพยายามตั้งค่าบริการ Apache ที่มีโหลดบาลานซ์ โดยมีหลายอินสแตนซ์ที่ให้บริการเนื้อหาผ่านที่อยู่ IP เดียว มาตรฐานสวย นอกจากนี้ยังเน้นถึงเหตุผลทั่วไปว่าทำไมคุณจึงต้องใช้การกำหนดค่าคลัสเตอร์ - ความพร้อมใช้งาน ความซ้ำซ้อน การปรับขนาดแนวนอน และประสิทธิภาพ แน่นอน คุณต้องคำนึงถึงชิ้นส่วนเครือข่าย เช่นเดียวกับพื้นที่เก็บข้อมูล แต่นั่นเป็นสิ่งที่อยู่นอกเหนือขอบเขตของคู่มือนี้

เทมเพลต Dockerfile จริงมีอยู่ในที่เก็บอย่างเป็นทางการภายใต้ httpd คุณจะต้องตั้งค่าเล็กน้อยเพื่อดำเนินการ รายละเอียดเกี่ยวกับวิธีดาวน์โหลดรูปภาพ วิธีสร้างรูปภาพของคุณเอง และอื่นๆ มีอยู่ในคู่มือแนะนำของฉัน ซึ่งลิงก์อยู่ที่ตอนต้นของบทช่วยสอนนี้

นักเทียบท่า build -t my-apache2
กำลังส่งบริบทบิลด์ไปยัง Docker daemon 2.048 kB
ขั้นตอนที่ 1 :จาก httpd:2.4
กำลังพยายามดึง repository docker.io/library/httpd ...
2.4:ดึงจาก docker.io/library/httpd

8ad8b3f87b37:ดึงเสร็จสมบูรณ์
c95e1f92326d:ดึงเสร็จสมบูรณ์
96e8046a7a4e:การดึงเสร็จสมบูรณ์
00a0d292c371:ดึงเสร็จสมบูรณ์
3f7586acab34:ดึงเสร็จสมบูรณ์
สรุป:sha256:3ad4d7c4f1815bd1c16788a57f81b413...a915e50a0d3a4
สถานะ:ดาวน์โหลดอิมเมจที่ใหม่กว่าสำหรับ docker.io/httpd:2.4
---> fe3336dd034d
ขั้นตอนที่ 2:คัดลอก ../public-html/ /usr/local/apache2/htdocs/
...

ก่อนที่คุณจะดำเนินการต่อไป คุณควรเริ่มต้นอินสแตนซ์เดียวและดูว่าคอนเทนเนอร์ของคุณถูกสร้างขึ้นโดยไม่มีข้อผิดพลาดใดๆ และคุณสามารถเชื่อมต่อกับเว็บเซิร์ฟเวอร์ได้ เราจะสร้างบริการแบบกระจาย

นักเทียบท่าเรียกใช้ -dit --name my-running-app my-apache2

ตรวจสอบที่อยู่ IP เจาะเบราว์เซอร์ดูว่าให้อะไร

การเริ่มต้นและการตั้งค่าฝูง

ขั้นตอนต่อไปคือการไปฝูง ต่อไปนี้เป็นคำสั่งพื้นฐานที่สุดที่จะช่วยให้คุณดำเนินการได้ และคล้ายกับตัวอย่างที่ใช้ในบล็อก Docker มาก:

บริการนักเทียบท่าสร้าง --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest

เรามีอะไรที่นี่? เรากำลังสร้างบริการที่เรียกว่าส่วนหน้า โดยมีคอนเทนเนอร์ห้าอินสแตนซ์ นอกจากนี้ เรายังผูก hostPort 80 ของเรากับ containerPort 80 และเรากำลังใช้อิมเมจ Apache ที่เพิ่งสร้างใหม่สำหรับสิ่งนี้ อย่างไรก็ตาม เมื่อคุณทำเช่นนี้ คุณจะได้รับข้อผิดพลาดต่อไปนี้:

บริการนักเทียบท่าสร้าง --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
การตอบสนองข้อผิดพลาดจาก daemon:โหนดนี้ไม่ใช่ตัวจัดการฝูง ใช้ "docker swarm init" หรือ "docker swarm join" เพื่อเชื่อมต่อโหนดนี้กับ swarm แล้วลองอีกครั้ง

ซึ่งหมายความว่าคุณไม่ได้ตั้งค่าโฮสต์ปัจจุบัน (โหนด) ให้เป็นผู้จัดการฝูง คุณต้องเริ่มฝูงหรือเข้าร่วมฝูงที่มีอยู่ เนื่องจากเรายังไม่มี เราจะเริ่มต้นใหม่:

นักเทียบท่าฝูงเริ่มต้น
Swarm เริ่มต้นแล้ว:โหนดปัจจุบัน (dm58mmsczqemiikazbfyfwqpd) เป็นผู้จัดการแล้ว

หากต้องการเพิ่มผู้ปฏิบัติงานในกลุ่มนี้ ให้รันคำสั่งต่อไปนี้:

ฝูงนักเทียบท่าเข้าร่วม \
--โทเค็น SWMTKN-1-4ofd46a2nfyvrqwu8w5oeetukrbylyznxla
9srf9vxkxysj4p8-eu5d68pu5f1ci66s7w4wjps1u \
10.0.2.15:2377

หากต้องการเพิ่มผู้จัดการในกลุ่มนี้ ให้รัน 'docker swarm join-token manager' และทำตามคำแนะนำ

ผลลัพธ์ค่อนข้างอธิบายได้ด้วยตนเอง เราได้สร้างฝูง โหนดใหม่จะต้องใช้โทเค็นที่ถูกต้องเพื่อเข้าร่วมฝูง คุณยังได้ระบุที่อยู่ IP และพอร์ต ถ้าคุณต้องการกฎไฟร์วอลล์ ยิ่งไปกว่านั้น คุณสามารถเพิ่มผู้จัดการในกลุ่มได้เช่นกัน ตอนนี้ ให้รันคำสั่งสร้างบริการอีกครั้ง:

บริการนักเทียบท่าสร้าง --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
6lrx1vhxsar2i50is8arh4ud1

ทดสอบการเชื่อมต่อ

ตอนนี้มาตรวจสอบว่าบริการของเราใช้งานได้จริง สิ่งนี้คล้ายกับที่เราทำกับ Vagrant และ coreOS ท้ายที่สุดแล้วแนวคิดเกือบจะเหมือนกัน เป็นเพียงการนำแนวคิดเดียวกันไปใช้ที่แตกต่างกัน ก่อนอื่น docker ps ควรแสดงผลลัพธ์ที่ถูกต้อง คุณควรมีตัวจำลองหลายตัวสำหรับบริการที่สร้างขึ้น

นักเทียบท่า PS
รหัสคอนเทนเนอร์        IMAGE               คำสั่ง              สร้างแล้ว              สถานะ              พอร์ต
ชื่อ
cda532f67d55        my-apache2:latest   "httpd-foreground"
2 นาทีที่แล้ว       เพิ่มขึ้น 2 นาที        80/tcp              frontend.1.2sobjfchdyucschtu2xw6ms9a
75fe6e0aa77b        my-apache2:latest   "httpd-foreground"
2 นาทีที่แล้ว       เพิ่มขึ้น 2 นาที        80/tcp              frontend.4.ag77qtdeby9fyvif5v6c4zcpc
3ce824d3151f        my-apache2:latest   "httpd-foreground"
2 นาทีที่แล้ว       เพิ่มขึ้น 2 นาที        80/tcp              frontend.2.b6fqg6sf4hkeqs86ps4zjyq65
eda01569181d        my-apache2:latest   "httpd-foreground"
2 นาทีที่แล้ว       เพิ่มขึ้น 2 นาที        80/tcp              frontend.5.0rmei3zeeh8usagg7fn3olsp4
497ef904e381        my-apache2:latest   "httpd-foreground"
2 นาทีที่แล้ว       เพิ่มขึ้น 2 นาที        80/tcp              frontend.3.7m83qsilli5dk8rncw3u10g5a

ฉันยังทดสอบกับพอร์ตอื่นที่ไม่ใช่พอร์ตเริ่มต้น และใช้งานได้ดี คุณมีเวลาเหลือเฟือในการเชื่อมต่อกับเซิร์ฟเวอร์และรับการตอบกลับ คุณสามารถใช้ localhost หรือที่อยู่ IP ของอินเทอร์เฟซนักเทียบท่ากับพอร์ตที่ถูกต้อง ตัวอย่างด้านล่างแสดงพอร์ต 1080:

นี่เป็นการเริ่มต้นที่หยาบและเรียบง่ายมาก ความท้าทายที่แท้จริงคือการสร้างบริการที่เหมาะสมและปรับขนาดได้ แต่จำเป็นต้องมีกรณีการใช้งานทางเทคนิคที่เหมาะสม นอกจากนี้ คุณควรใช้คำสั่ง docker info และ docker service (inspect|ps) เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการทำงานของคลัสเตอร์

ปัญหาที่อาจเกิดขึ้น

คุณอาจพบปัญหาเล็กน้อย (หรือไม่เล็กน้อย) ในขณะที่เล่นกับ Docker และ swarm ตัวอย่างเช่น SELinux อาจบ่นว่าคุณกำลังพยายามทำสิ่งผิดกฎหมาย อย่างไรก็ตาม ข้อผิดพลาดและคำเตือนไม่ควรขัดขวางคุณมากเกินไป

บริการนักเทียบท่าไม่ใช่คำสั่งนักเทียบท่า

เมื่อคุณพยายามเรียกใช้คำสั่งที่จำเป็นเพื่อเริ่มบริการที่จำลองแบบ คุณจะได้รับข้อผิดพลาดที่ระบุว่า docker:'service' is not a docker command ซึ่งหมายความว่าคุณไม่มี Docker เวอร์ชันที่ถูกต้อง (ตรวจสอบด้วย -v) เราจะแก้ไขปัญหานี้ในบทช่วยสอนติดตามผล

บริการนักเทียบท่าสร้าง --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
นักเทียบท่า:'บริการ' ไม่ใช่คำสั่งนักเทียบท่า

ไม่รู้จักแท็กนักเทียบท่า

นอกจากนี้ คุณอาจเห็นข้อผิดพลาดต่อไปนี้:

บริการนักเทียบท่าสร้าง -name frontend -replicas 5 -p 80:80/tcp my-apache2:latest
การตอบสนองข้อผิดพลาดจาก daemon:ข้อผิดพลาด rpc:code =3 desc =ContainerSpec:"-name" ไม่ใช่ที่เก็บ/แท็กที่ถูกต้อง

มีหัวข้อสนทนามากมายเกี่ยวกับเรื่องนี้ ข้อผิดพลาดอาจค่อนข้างไร้เดียงสา คุณอาจคัดลอกคำสั่งจากเบราว์เซอร์ และยัติภังค์อาจแยกวิเคราะห์ไม่ถูกต้อง ง่ายๆอย่างนั้น

อ่านเพิ่มเติม

หัวข้อนี้ยังมีอีกมากที่ต้องพูด รวมถึงการใช้งาน Swarm ก่อน Docker 1.12 ตลอดจนเวอร์ชันปัจจุบันของกลไก Docker โปรดอย่าขี้เกียจและใช้เวลาอ่าน:

ภาพรวม Docker Swarm (สำหรับการติดตั้ง Swarm แบบสแตนด์อโลน)

สร้างคลัสเตอร์ Swarm สำหรับการผลิต (การตั้งค่าแบบสแตนด์อโลน)

ติดตั้งและสร้าง Docker Swarm (การตั้งค่าแบบสแตนด์อโลน)

ภาพรวมของ Docker engine swarm (สำหรับเวอร์ชัน 1.12)

เริ่มต้นใช้งานโหมดฝูง (สำหรับเวอร์ชัน 1.12)

สรุป

ไปแล้ว ในตอนนี้ยังไม่มีอะไรยิ่งใหญ่เกินไป แต่ฉันเชื่อว่าคุณจะพบว่าบทความนี้มีประโยชน์ It covers several key concepts, there's an overview of how the swarm mode works and what it does, and we successfully managed to download and create our own Web server image and then run several clustered instances of it. We did this on a single node for now, but we will expand in the future. Also, we tackled some common problems.

I hope you find this guide interesting. Combined with my previous work on Docker, this should give you a decent understand of how to work with images, the networking stack, storage, and now clusters. Warming up. Indeed, enjoy and see you soon with fresh new tutorials on Docker. I just can't contain [sic] myself.

ไชโย