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 ลองใช้สิ่งเหล่านี้ในสภาพแวดล้อมที่ไม่ใช่การผลิตเพื่อรับทราบวิธีการทำงาน