سرب Docker Swarm لتنظيم الحاويات

نشرت: 2019-08-08

كل شيء عن Docker Swarm وكيف يدير وينظم جميع الحاويات في مجموعة.

ما هو Docker Swarm؟

سرب Docker هو طريقة للتعامل مع مجموعة من Docker Engines ، ومن هنا جاء اسم Swarm. تعمل مجموعة مضيفي Docker في وضع السرب الذي يتكون من المديرين والعاملين. تسمى مثيلات محرك الرصيف التي تشارك في السرب بالعقد.

يتكون نشر سرب مستوى الإنتاج من عقد عامل ميناء موزعة عبر خوادم متعددة.

لماذا نستخدمه؟ - تنظيم الحاويات

عندما تعمل في بيئة إنتاج ، فإن مئات من حاويات الرصيف ستشغل تطبيقات متعددة فيها. يمكن أن تكون إدارة كل هذه الحاويات معاناة كبيرة لجميع مهندسي DevOps ؛ هذا هو المكان الذي يساعدك فيه Docker Swarm. إنه يدير وينظم المجموعة التي تشغل حاويات رصيف متعددة بسهولة.

فيما يلي بعض ميزاته:

  • التوفر العالي - يهدف إلى عدم تقديم أي توقف أو انقطاع.
  • موازنة التحميل - تخصيص الموارد والطلبات على العقد الأخرى في الكتلة تلقائيًا في حالة فشل أي عقدة.
  • اللامركزية - يتم تشغيل عدة عقد إدارية في بيئة إنتاج ؛ ومن ثم فإن الكتلة لا تعتمد أبدًا على عقدة إدارة واحدة.
  • قابلية التوسع - باستخدام أمر سرب عامل إرساء واحد ، يمكنك بسهولة توسيع نطاق الحاويات أو تصغيرها في المجموعة.

تنظيم حاويات Docker

الآن بعد أن تعرفت على أساسيات Docker Swarm ، دعنا نلقي نظرة على مثال على تنفيذها.

في هذا المثال ، لدي ثلاث آلات تعمل في مجموعة بالتفاصيل التالية:

 manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102

لتهيئة وضع السرب في عامل الإرساء ، قم بتشغيل الأمر أدناه في عقدة المدير. تُستخدم العلامة --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 Tutorial.

 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

تحقق مما إذا كانت خدمة سرب الرصيف قد بدأت. MODE منسوخ يعني أن الحاوية قد تم نسخها على جميع العقد في المجموعة و REPLICAS 1/1 يعني أن خدمة سرب واحدة فقط قيد التشغيل حاليًا.

 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

يمكنك تشغيل خدمة السرب في الوضع " العام" أيضًا بدلاً من وضع "النسخ المتماثل" الافتراضي. يقوم الوضع العالمي بتشغيل مهمة واحدة لخدمة السرب على جميع العقد في الكتلة.

قبل أن أقوم بتشغيل الخدمة في الوضع العام ، دعني أزيل الحاوية قيد التشغيل الحالية.

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

ابدأ خدمة السرب داخل حاوية عامل إرساء في الوضع العام باستخدام علم الوضع.

 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

تحقق مما إذا كانت خدمة السرب قد بدأت في الوضع العام. نظرًا لأن ثلاث عقد (مدير واحد ، عاملان) تعمل في المجموعة ، فإن هذا هو السبب في أن عدد النسخ المتماثلة هو 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

استخدم علامة النسخ المتماثلة في الأمر واذكر عدد النسخ المتماثلة التي تريدها من خدمة السرب. على سبيل المثال ، أرغب في الحصول على نسختين متماثلتين من خدمة السرب:

 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

تحقق من خدمات السرب التي تعمل حاليًا. يمكنك مشاهدة نسخة متماثلة واحدة تعمل على عقدة 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 هي إيقاف التشغيل (حيث أوقفنا تشغيل الحاوية للخدمة). ولكن نظرًا لأنه يجب تشغيل نسختين متماثلتين لهذه الخدمة ، فقد بدأت خدمة أخرى على العامل 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 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

تحقق من مكان تشغيل هذه النسخ المتماثلة الخمس في الكتلة. يتم تشغيل نسخة متماثلة واحدة على عقدة manager1 ونسختان متماثلتان على كلا العقدتين العاملتين في كل منهما.

 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. جرب هذه في بيئتك غير الإنتاجية للحصول على فكرة عن كيفية عملها.