This is an old revision of the document!
În contextul Docker Swarm, nu mai există o singură gazdă, ci multiple noduri conectate în rețea. Acest lucru face ca folosirea volumelor locale să nu fie recomandată, deoarce orchestrarea unui task pe un nod care nu are volumul cerut de container va rezulta în respingerea acelui task.
Există două posibilități principale de rezolvare a acestei probleme. Prima variantă presupune constrângerea unor servicii astfel încât să ruleze doar pe noduri manager, astfel:
services: example: deploy: placement: constraints: [node.role == manager]
Această practică este utilă doar atunci când există un singur nod manager și astfel suntem siguri că taskurile ale căror containere au nevoie de volumele definite în configurație vor rula doar pe managerul unde exista volumele.
În cazul în care există mai multe noduri manager și dorim, de exemplu, să rulăm o bază de date într-un serviciu, dacă aceasta va fi orchestrată să ruleze pe alt nod față de cel pe care a fost prima oară orchestrată, nu va mai avea acces la volumul unde a stocat date inițial. În acest caz, va crea un volum nou pe noul nod, ajungându-se astfel la inconsistență.
Cea de-a doua variantă pentru a rezolva problema descrisă mai sus este configurarea volumelor astfel încât să folosească
In acest laborator vom discuta despre utilizarea volumelor NFS (network file system) la nivel de Docker Swarm si despre folosirea uneltei declarative Kong pentru crearea de API Gateway-uri mult mai eficient.
Laboratorul se va desfasura, din nou, pe Play With Docker si va avea suport de cod repo-ul din laboratorul precedent, peste care am mai adaugat 2 fisiere .yml in plus (stack-nfs.yml si stack-kong.yml).
Un server NFS poate fi rulat, fie nativ, fie folosind Docker. Exista multiple solutii de rulare a unui server NFS folosind Docker, insa noi va recomandam aceasta solutie populara bazata pe Alpine Linux.
Solutia de mai sus reprezinta un container care ruleaza in mod privilegiat, avand acces la resursele gazdei. Inainte sa rulati containerul, trebuie sa va creati un folder ce va fi partajat in retea.
Dupa ce ati creat folderul ce va retine datele partajate in retea, executati comanda
docker run -d --name nfs --privileged -v /cale/catre/folderul/creat:/nfsshare -e SHARED_DIRECTORY=/nfsshare itsthenetwork/nfs-server-alpine:latest
Pentru a utiliza volumele partajate, este nevoie sa faceti modificari in configuratia volumelor din cadrul fisierelor .yml. Ca si exemplu, vom folosi o baza de date care are nevoie de volum pentru scriptul de configuratie si pentru persistenta datelor.
services: db: image: postgres:12 volumes: - db-data-nfs:/var/lib/postgresql/data - db-config-nfs:/docker-entrypoint-initdb.d volumes: db-data-nfs: driver: local driver_opts: type: nfs4 o: "addr=IP_NFS,rw" device: ":/database/data" db-config-nfs: driver: local driver_opts: type: nfs4 o: "addr=IP_NFS,rw" device: ":/database/config"