Docker Swarm per l'orchestrazione di container

Pubblicato: 2019-08-08

Tutto su Docker Swarm e su come gestisce e orchestra tutti i contenitori in un cluster.

Cos'è Docker Swarm?

Docker swarm è una modalità di gestione di un cluster di Docker Engine, da cui il nome Swarm. Il cluster di host Docker viene eseguito in modalità swarm composto da manager e lavoratori. Le istanze del motore Docker che partecipano allo swarm sono chiamate nodi.

Una distribuzione swarm a livello di produzione è costituita da nodi docker distribuiti su più server.

Perché usarlo? – Orchestrazione di contenitori

Quando si lavora in un ambiente di produzione, centinaia di contenitori Docker eseguiranno più applicazioni al suo interno. La gestione di tutti questi container può essere un grosso problema per tutti gli ingegneri DevOps; è qui che Docker Swarm ti aiuta. Gestisce e orchestra facilmente il cluster che esegue più contenitori Docker.

Di seguito alcune delle sue caratteristiche:

  • Alta disponibilità: mira a non offrire tempi di inattività o interruzioni.
  • Bilanciamento del carico: alloca automaticamente le risorse e le richieste su altri nodi del cluster in caso di errore di un nodo.
  • Decentralizzato: più nodi manager vengono eseguiti in un ambiente di produzione; quindi il cluster non dipende mai da un singolo nodo manager.
  • Scalabilità: utilizzando un singolo comando swarm della finestra mobile, puoi facilmente aumentare o ridurre i contenitori nel cluster.

Orchestra contenitori Docker

Ora che conosci le basi di Docker Swarm, diamo un'occhiata a un esempio della sua implementazione.

In questo esempio, ho tre macchine in esecuzione in un cluster con i dettagli seguenti:

 manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102

Per inizializzare la modalità swarm nella finestra mobile, eseguire il comando seguente sul nodo manager. Il flag --advertise-addr viene utilizzato per pubblicizzare se stesso ai nodi che possono unirsi al cluster.

 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.

Il comando precedente genererà un token che verrà utilizzato da altri nodi per unirsi a questo cluster. Copia il comando con il token generato ed eseguilo sui nodi di lavoro.

Esecuzione del token sul nodo worker1.

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

Esecuzione del token sul nodo worker2.

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

Ora, sul nodo manager, puoi controllare quali nodi sono in esecuzione nel 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

Costruiamo l'immagine della finestra mobile geekflare_mongodb che abbiamo usato in Dockerfile Tutorial.

 docker build -t geekflare_mongodb .

Esegui un contenitore dell'immagine Docker MongoDB creando un servizio swarm. 27017 è il numero di porta su cui è esposto 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

Controlla se il servizio Docker swarm è stato avviato. MODALITÀ replicata significa che il contenitore è stato replicato su tutti i nodi del cluster e REPLICHE 1/1 significa che è attualmente in esecuzione un solo servizio swarm.

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

Verifichiamo su quale nodo del cluster è in esecuzione questo singolo servizio. È in esecuzione sul nodo 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

Esegui il comando docker ps per ottenere maggiori dettagli sul contenitore che esegue questo servizio swarm.

 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

È possibile eseguire il servizio swarm anche in modalità "globale" anziché in modalità "replicata" predefinita. La modalità globale esegue un'attività del servizio swarm su tutti i nodi del cluster.

Prima di eseguire il servizio in modalità globale, consentitemi di rimuovere il contenitore in esecuzione esistente.

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

Avvia il servizio swarm all'interno di un contenitore mobile in modalità globale usando il 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 se il servizio swarm è stato avviato in modalità globale. Poiché nel cluster sono in esecuzione tre nodi (1 manager, 2 worker), ecco perché il numero di repliche è 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 servizi sono ora in esecuzione su 3 nodi, verificalo eseguendo il comando seguente.

 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

Quindi, lascia che ti mostri come puoi definire il numero di repliche. Prima di ciò, rimuoverò il contenitore corrente, che è in esecuzione.

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

Usa il flag –replicas nel comando e menziona il numero di repliche che desideri per il servizio swarm. Ad esempio, voglio avere due repliche del servizio swarm:

 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

Controlla i servizi swarm attualmente in esecuzione. Puoi vedere una replica in esecuzione sul nodo manager1 e l'altra sul nodo 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

Vai al nodo worker1 e controlla se il contenitore Docker sta eseguendo il servizio swarm.

 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

Per arrestare questo contenitore, esegui il comando seguente.

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

Ora dal nodo manager1 se controlli quali tutti i nodi stanno eseguendo il servizio, vedrai che è in esecuzione sul nodo manager1 e sul nodo worker2. Lo STATO CORRENTE del nodo lavoratore1 è Arresto (poiché abbiamo interrotto il contenitore che esegue il servizio). Ma poiché è necessario eseguire due repliche di questo servizio, è stato avviato un altro servizio sul ruolo di lavoro 2.

Ecco come ottenere un'elevata disponibilità utilizzando 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

È molto facile aumentare o diminuire i contenitori Docker. Il comando seguente aumenterà il contenitore mongo a 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

Controlla quante repliche del contenitore mongo sono in esecuzione ora, devono essere 5.

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

Controlla dove sono in esecuzione queste 5 repliche nel cluster. 1 replica è in esecuzione sul nodo manager1 e 2 repliche su entrambi i nodi di lavoro ciascuno.

 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

Nel tuo cluster, se non desideri che i tuoi servizi vengano eseguiti sui nodi di gestione e desideri mantenerli solo per la gestione dei nodi, puoi svuotare il nodo di gestione.

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

Verificare la disponibilità del nodo gestore.

 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

Vedrai che i servizi non sono più in esecuzione sul nodo manager; sono distribuiti tra i nodi di lavoro nel 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

Era tutto su Docker Swarm e su come orchestrare i contenitori in modalità Docker Swarm. Provali nel tuo ambiente non di produzione per avere un'idea di come funziona.