Docker Swarm pentru Container Orchestration
Publicat: 2019-08-08Totul despre Docker Swarm și despre modul în care gestionează și orchestrează toate containerele dintr-un cluster.
Ce este Docker Swarm?
Docker swarm este un mod de manipulare a unui grup de motoare Docker, de unde și numele Swarm. Clusterul de gazde Docker rulează în modul roi format din manageri și lucrători. Instanțele docker-engine care participă la roi sunt numite noduri.
O implementare de roi la nivel de producție constă din noduri docker răspândite pe mai multe servere.
De ce să-l folosești? – Container Orchestration
Când lucrați într-un mediu de producție, 100 de containere docker vor rula mai multe aplicații în el. Gestionarea tuturor acestor containere poate fi o mare durere pentru toți inginerii DevOps; aici te ajută Docker Swarm. Gestionează și orchestrează clusterul care rulează mai multe containere docker cu ușurință.
Mai jos sunt câteva dintre caracteristicile sale:
- Disponibilitate ridicată – își propune să nu ofere timpi de nefuncționare sau întreruperi.
- Load Balancing – alocați automat resursele și cererile pe alte noduri din cluster dacă vreun nod eșuează.
- Descentralizat – mai multe noduri de manager rulează într-un mediu de producție; prin urmare, clusterul nu este niciodată dependent de un singur nod manager.
- Scalabilitate – folosind o singură comandă docker swarm, puteți mări sau reduce cu ușurință containerele din cluster.
Orchestrați containerele Docker
Acum că cunoașteți elementele de bază ale Docker Swarm, să ne uităm la un exemplu de implementare a acestuia.
În acest exemplu, am trei mașini care rulează într-un cluster cu detaliile de mai jos:
manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102
Pentru a inițializa modul roi în docker, executați comanda de mai jos pe nodul manager. Steagul --advertise-addr
este folosit pentru a se face reclamă către nodurile care se pot alătura clusterului.
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.
Comanda de mai sus va genera un token care va fi folosit de alte noduri pentru a se alătura acestui cluster. Copiați comanda cu tokenul generat și rulați-o pe nodurile de lucru.
Rularea jetonului pe nodul worker1.
geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
Rularea jetonului pe nodul worker2.
geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
Acum, pe nodul manager, puteți verifica ce noduri rulează în cluster.
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
Să construim imaginea geekflare_mongodb
pe care am folosit-o în Tutorialul Dockerfile.
docker build -t geekflare_mongodb .
Rulați un container al imaginii docker MongoDB creând un serviciu roi. 27017 este numărul portului pe care este expus 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
Verificați dacă serviciul docker roi a pornit. MODE replicat înseamnă că containerul a fost replicat pe toate nodurile din cluster, iar REPLICARE 1/1 înseamnă că un singur serviciu swarm rulează în prezent.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp
Să verificăm pe ce nod din cluster rulează acest singur serviciu. Se rulează pe nodul 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
Rulați comanda docker ps pentru a obține mai multe detalii despre containerul care rulează acest serviciu roi.
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
Puteți rula serviciul roi în modul „global” și în loc de modul implicit „replicat”. Modul global rulează o sarcină a serviciului roi pe toate nodurile din cluster.
Înainte de a rula serviciul în modul global, permiteți-mi să elimin containerul care rulează existent.
geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
Porniți serviciul roi în interiorul unui container docker în modul global folosind flag –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
Verificați dacă serviciul roi a pornit în modul global. Deoarece trei noduri (1 manager, 2 lucrători) rulează în cluster, de aceea numărul de replici este de 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 servicii rulează acum pe 3 noduri, verificați-l rulând comanda de mai jos.

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
În continuare, permiteți-mi să vă arăt cum puteți defini numărul de replici. Înainte de asta, voi elimina containerul actual, care rulează.
geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
Folosiți flagul –replicas în comandă și menționați numărul de replici pe care doriți să îl utilizați pentru serviciul roi. De exemplu, vreau să am două replici ale serviciului roi:
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
Verificați serviciile roii care rulează în prezent. Puteți vedea că o replică rulează pe nodul manager1 și cealaltă pe nodul lucrător1.
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
Accesați nodul worker1 și verificați dacă containerul docker rulează serviciul roi.
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
Pentru a opri acest container, executați comanda de mai jos.
geekflare@worker1:~$ docker stop 5042b7f161cb 5042b7f161cb
Acum, de la nodul manager1, dacă verificați care toate nodurile rulează serviciul, veți vedea că acesta rulează pe nodul manager1 și nodul lucrător2. STAREA CURENTĂ a nodului worker1 este Shutdown (deoarece am oprit containerul care rulează serviciul). Dar, deoarece două replici trebuie să ruleze ale acestui serviciu, un alt serviciu a fost pornit pe worker 2.
Acesta este modul în care obțineți o disponibilitate ridicată folosind 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
Este foarte ușor să măriți sau să reduceți containerele docker. Comanda de mai jos va mări containerul mongo la 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
Verificați câte replici ale containerului mongo rulează acum, trebuie să fie 5.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp
Verificați unde rulează aceste 5 replici în cluster. 1 replică rulează pe nodul manager1 și 2 replici pe ambele noduri de lucru fiecare.
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
În clusterul dvs., dacă nu doriți ca serviciile dvs. să ruleze pe nodurile managerului și doriți să le păstrați numai pentru gestionarea nodurilor, puteți elimina nodul manager.
geekflare@manager1:~$ docker node update --availability drain manager1 manager1
Verificați disponibilitatea nodului manager.
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
Veți vedea că serviciile nu mai rulează pe nodul manager; acestea sunt răspândite în nodurile de lucru din cluster.
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
Acesta a fost totul despre Docker Swarm și despre cum să orchestrați containerele în modul Docker Swarm. Încercați acestea în mediul dvs. non-producție pentru a vă face o idee despre cum funcționează.