Docker Swarm สำหรับคอนเทนเนอร์ Orchestration

เผยแพร่แล้ว: 2019-08-08

ทั้งหมดเกี่ยวกับ Docker Swarm และวิธีจัดการและจัดการคอนเทนเนอร์ทั้งหมดในคลัสเตอร์

Docker Swarm คืออะไร?

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

การปรับใช้ Swarm ระดับการผลิตประกอบด้วยโหนดนักเทียบท่าที่กระจายไปทั่วเซิร์ฟเวอร์หลายเครื่อง

ทำไมต้องใช้มัน? – การจัดตู้คอนเทนเนอร์

เมื่อคุณทำงานในสภาพแวดล้อมที่ใช้งานจริง คอนเทนเนอร์นักเทียบท่า 100 ตัวจะใช้งานหลายแอพพลิเคชั่นในนั้น การจัดการคอนเทนเนอร์เหล่านี้อาจเป็นปัญหาใหญ่สำหรับวิศวกร DevOps ทุกคน นี่คือที่ที่ Docker Swarm ช่วยคุณได้ มันจัดการและประสานคลัสเตอร์ที่รันคอนเทนเนอร์นักเทียบท่าหลายตัวได้อย่างง่ายดาย

ด้านล่างนี้เป็นคุณสมบัติบางอย่าง:

  • ความพร้อมใช้งานสูง – มีวัตถุประสงค์เพื่อไม่ให้หยุดทำงานหรือหยุดทำงาน
  • Load Balancing – จัดสรรทรัพยากรและการร้องขอบนโหนดอื่น ๆ ในคลัสเตอร์โดยอัตโนมัติหากโหนดใดล้มเหลว
  • De-centralized – โหนดตัวจัดการหลายตัวทำงานในสภาพแวดล้อมที่ใช้งานจริง ดังนั้นคลัสเตอร์จะไม่ขึ้นอยู่กับโหนดตัวจัดการเดียว
  • ความสามารถใน การปรับขนาด – ด้วยการใช้คำสั่ง Docker Swarm เดียว คุณสามารถปรับขนาดหรือลดขนาดคอนเทนเนอร์ในคลัสเตอร์ได้อย่างง่ายดาย

จัดการคอนเทนเนอร์ Docker

เมื่อคุณทราบพื้นฐานของ Docker Swarm แล้ว เรามาดูตัวอย่างการใช้งานกัน

ในตัวอย่างนี้ ฉันมีเครื่องสามเครื่องที่ทำงานอยู่ในคลัสเตอร์โดยมีรายละเอียดด้านล่าง:

 manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102

ในการเริ่มต้นโหมด swarm ใน docker ให้รันคำสั่งด้านล่างบน manager node แฟ --advertise-addr ใช้สำหรับโฆษณาตัวเองไปยังโหนดที่สามารถเข้าร่วมคลัสเตอร์ได้

 geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104 Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

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

การรันโทเค็นบนโหนด worker1

 geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.

การรันโทเค็นบนโหนด worker2

 geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.

ตอนนี้ บนโหนดตัวจัดการ คุณสามารถตรวจสอบว่าโหนดใดกำลังทำงานอยู่ในคลัสเตอร์

 geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6

มาสร้างอิมเมจนักเทียบท่า geekflare_mongodb ที่เราใช้ในการสอน Dockerfile

 docker build -t geekflare_mongodb .

เรียกใช้คอนเทนเนอร์ของอิมเมจนักเทียบท่า MongoDB โดยสร้างบริการกลุ่ม 27017 คือหมายเลขพอร์ตที่ MongoDB เปิดเผย

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. kok58xa4zi05psh3uy6s5x9e6 overall progress: 1 out of 1 tasks 1/1: running verify: Service converged

ตรวจสอบว่าบริการ Docker Swarm เริ่มต้นขึ้นหรือไม่ MODE จำลองแบบ หมายถึงคอนเทนเนอร์ถูกจำลองบนโหนดทั้งหมดในคลัสเตอร์ และ REPLICAS 1/1 หมายถึงบริการ Swarm เดียวเท่านั้นที่กำลังทำงานอยู่

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp

ให้เราตรวจสอบว่าโหนดใดในคลัสเตอร์ที่บริการเดียวนี้ทำงานอยู่ มันทำงานบนโหนด manager1

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running about a minute ago

เรียกใช้คำสั่ง docker ps เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับคอนเทนเนอร์ที่กำลังเรียกใช้บริการฝูงนี้

 geekflare@manager1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/…" 2 minutes ago Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx

คุณสามารถเรียกใช้บริการฝูงในโหมด "ทั่วโลก" แทนโหมด "จำลองแบบ" ที่เป็นค่าเริ่มต้น โหมดโกลบอลรันหนึ่งงานของบริการ swarm บนโหนดทั้งหมดในคลัสเตอร์

ก่อนที่ฉันจะเรียกใช้บริการในโหมดโกลบอล ให้ฉันลบคอนเทนเนอร์ที่ทำงานอยู่ที่มีอยู่ก่อน

 geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container

เริ่มบริการฝูงภายในคอนเทนเนอร์นักเทียบท่าในโหมดโกลบอลโดยใช้แฟล็ก –mode

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. mfw8dp0zylffppkllkcjl8391 overall progress: 3 out of 3 tasks utdr3dnngqf1: running lssbyfzuiuh3: running xs6jqp95lw4c: running verify: Service converged

ตรวจสอบว่าบริการ swarm เริ่มต้นในโหมดโกลบอลหรือไม่ เนื่องจาก มีสามโหนด (ผู้จัดการ 1 คน 2 คน) กำลังทำงานอยู่ในคลัสเตอร์ นั่นเป็นสาเหตุที่จำนวนการจำลองคือ 3

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp

ขณะนี้ 3 บริการกำลังทำงานใน 3 โหนด ตรวจสอบโดยใช้คำสั่งด้านล่าง

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running about a minute ago 3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 Running Running about a minute ago yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago

ต่อไป ให้ฉันแสดงวิธีการกำหนดจำนวนแบบจำลอง ก่อนหน้านั้นฉันจะลบคอนเทนเนอร์ปัจจุบันซึ่งกำลังทำงานอยู่

 geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container

ใช้แฟล็ก –replicas ในคำสั่งและระบุจำนวนเรพลิกาที่คุณต้องการสำหรับบริการฝูง ตัวอย่างเช่น ฉันต้องการให้บริการฝูงจำลองสองชุด:

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. 4yfl41n7sfak65p6zqwwjq82c overall progress: 2 out of 2 tasks 1/2: running 2/2: running verify: Service converged

ตรวจสอบบริการ Swarm ที่กำลังทำงานอยู่ คุณสามารถดูเรพลิกาหนึ่งรันบนโหนด manager1 และอีกอันหนึ่งบนโหนด worker1

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago

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

 geekflare@worker1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/…" About a minute ago Up About a minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv

หากต้องการหยุดคอนเทนเนอร์นี้ ให้เรียกใช้คำสั่งด้านล่าง

 geekflare@worker1:~$ docker stop 5042b7f161cb 5042b7f161cb

จากนี้ไปจากโหนด manager1 หากคุณตรวจสอบว่าโหนดทั้งหมดกำลังเรียกใช้บริการใดอยู่ คุณจะเห็นว่าทำงานอยู่บนโหนด manager1 และโหนด worker2 สถานะปัจจุบันของโหนด worker1 คือ Shutdown (เมื่อเราหยุดคอนเทนเนอร์ที่เรียกใช้บริการ) แต่เนื่องจากตัวจำลองสองตัวต้องเรียกใช้บริการนี้ บริการอื่นจึงเริ่มทำงานในผู้ปฏิบัติงาน 2

นี่คือวิธีที่คุณบรรลุความพร้อมใช้งานสูงโดยใช้ docker swarm

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 30 seconds ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 38 seconds ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 3 minutes ago

เป็นเรื่องง่ายมากที่จะปรับขนาดขึ้นหรือลงคอนเทนเนอร์นักเทียบท่า คำสั่งด้านล่างจะขยายขนาดคอนเทนเนอร์ mongo เป็น 5

 geekflare@manager1:~$ docker service scale Mongo-Container=5 Mongo-Container scaled to 5 overall progress: 5 out of 5 tasks 1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged

ตรวจสอบจำนวนจำลองของคอนเทนเนอร์ mongo ที่ทำงานอยู่ในขณะนี้ ต้องเป็น 5

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp

ตรวจสอบว่าเรพลิกาทั้ง 5 ตัวนี้ทำงานอยู่ที่ใดในคลัสเตอร์ เรพลิกา 1 ตัวรันบนโหนด manager1 และเรพพลิกา 2 ตัวบนทั้งโหนดของผู้ปฏิบัติงานแต่ละตัว

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 5 minutes ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 47 seconds ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 46 seconds ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 44 seconds ago

ในคลัสเตอร์ของคุณ ถ้าคุณไม่ต้องการให้บริการของคุณทำงานบนโหนดตัวจัดการ และต้องการเก็บไว้เพื่อจัดการโหนดเท่านั้น คุณสามารถระบายโหนดตัวจัดการออกได้

 geekflare@manager1:~$ docker node update --availability drain manager1 manager1

ตรวจสอบความพร้อมใช้งานของโหนดผู้จัดการ

 geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6

คุณจะเห็นว่าบริการไม่ได้ทำงานบนโหนดผู้จัดการอีกต่อไป พวกมันกระจายไปทั่วโหนดของผู้ปฏิบัติงานในคลัสเตอร์

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 5 minutes ago "task: non-zero exit (137)" qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running 41 seconds ago e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown 44 seconds ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 3 minutes ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 3 minutes ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 3 minutes ago

นั่นคือทั้งหมดที่เกี่ยวกับ Docker Swarm และวิธีจัดการคอนเทนเนอร์ในโหมด Docker Swarm ลองใช้สิ่งเหล่านี้ในสภาพแวดล้อมที่ไม่ใช่การผลิตเพื่อรับทราบวิธีการทำงาน