This shows you the differences between two versions of the page.
moby:backend:07 [2020/05/31 20:02] alexandru.hogea created |
moby:backend:07 [2020/08/12 15:24] (current) alexandru.hogea [Exercitii] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Sesiuna 7 - Introducere Docker Swarm ===== | + | ===== Sesiuna 7 - Docker Compose ===== |
+ | |||
+ | Concepte atinse: | ||
+ | * Organizarea containerelor folosind Docker Compose | ||
+ | * Intelegerea formatului YAML | ||
+ | * Intelegerea continutului unui fisier docker-compose.yml | ||
+ | * Configurarea unui cluster de containere utilizand docker-compose.yml | ||
+ | |||
+ | ==== Resurse teoretice: ==== | ||
+ | |||
+ | Puteti accesa inregistrarea video si slide-urile teoretice [[https://drive.google.com/drive/folders/1ehbuntLRnBBP73KEwJ4MxcKNx_5rumUJ?usp=sharing|aici]] | ||
+ | |||
+ | |||
+ | ==== Structura de foldere ==== | ||
+ | |||
+ | === Strategie de Deployment === | ||
+ | |||
+ | Asa cum am propus in workshopurile trecute, vom avea 3 medii de lucru: | ||
+ | * local | ||
+ | * testing | ||
+ | * production | ||
+ | |||
+ | Deoarece lucram cu microservicii care vor fi deployate utilizand tehnologii Docker (Docker Compose pentru local si Docker Swarm in rest) este util sa pastram configuratia de deployment centralizat, sub forma fisierlor **.yml** de configurare. | ||
+ | |||
+ | === Monorepo === | ||
+ | |||
+ | Vom folosi conceptul de **monorepo bazat pe soft links (submodule)**, foarte des intalnit in lucrul cu microserviciile. | ||
+ | |||
+ | <note tip>Un monorepo pe baza de submodule tine referinta altor repository-uri, fara acces direct asupra lor. Actiunile din interiorul repository-ulor adiacente se realizeaza la nivel invidiual. Un monorepo este util pentru a tine configuratii centralizate legate de deployment si pentru a tine referinta celoralte servicii din cadrul unei aplicatii mai mare.</note> | ||
+ | |||
+ | Pentru a crea un monorepo trebuie sa urmati urmatorii pasi: | ||
+ | - creati-va un repository nou | ||
+ | - clonati repository-ul local | ||
+ | - adaugati, folosind urmatoarea comanda, referinte catre fiecare repository ce contine codul serviciilor voastre: | ||
+ | <code bash> | ||
+ | git submodule add LINK_REPOSITORY | ||
+ | </code> | ||
+ | |||
+ | <note tip>Daca operatia a decurs cu succes, o sa observati un fisier **.gitmodules** in monorepo</note> | ||
+ | <code text> | ||
+ | [submodule "library-microservice"] | ||
+ | path = library-microservice | ||
+ | url = https://gitlab.com/mobyworkshop/library-microservice.git | ||
+ | [submodule "notification-service"] | ||
+ | path = notification-service | ||
+ | url = https://gitlab.com/mobyworkshop/notification-service.git | ||
+ | [submodule "auth-microservice"] | ||
+ | path = auth-microservice | ||
+ | url = https://gitlab.com/mobyworkshop/auth-microservice.git | ||
+ | [submodule "mailing-service"] | ||
+ | path = mailing-service | ||
+ | url = https://gitlab.com/mobyworkshop/mailing-service.git | ||
+ | </code> | ||
+ | |||
+ | === Configuratia Deployment === | ||
+ | |||
+ | In monorepo, pe langa legatura catre celelalte servicii, vom tine si configuratia clusterului, pentru fiecare mediu. Asadar, va fi nevoie de un folder **Deployment** care sa aiba, la randul lui, 3 foldere (Local, Testing, Production). | ||
+ | |||
+ | In Local va fi configuratia folosind **Docker Compose** | ||
+ | In Testing si Production va fi configuratia folosind **Docker Swarm** | ||
+ | |||
+ | ==== Docker Compose ==== | ||
+ | |||
+ | Desi Docker Compose, ca orice alta componenta a Docker, este complexa si va recomandam sa consultati mereu [[https://docs.docker.com/compose/ | ||
+ | documentatia]], mai jos aveti un minim de informatii care va pot ajuta sa incepeti sa utilizati Docker Compose: | ||
+ | |||
+ | === Exemplu de fisier docker-compose.yml === | ||
+ | <code yaml> | ||
+ | |||
+ | # docker-compose.yml | ||
+ | version: '3.8' | ||
+ | services: | ||
+ | web: | ||
+ | # construieste imaginea dintr-un Dockerfile | ||
+ | build: . | ||
+ | context: ./Path (optional) | ||
+ | dockerfile: Dockerfile (optional) | ||
+ | ports: | ||
+ | - "5000:80" | ||
+ | redis: | ||
+ | image: postgres | ||
+ | </code> | ||
+ | |||
+ | === Exemplu de comenzi Docker Compose === | ||
+ | <code bash> | ||
+ | # Porneste containerele | ||
+ | docker-compose start | ||
+ | # Opreste containerele | ||
+ | docker-compose stop | ||
+ | # Pune in stare de pauza conainerele unui serviciu. Diferenta fata de stop e ca la procesul din container se trimite SIGPAUSE | ||
+ | docker-compose pause | ||
+ | # Scoate din stare de pauza containerele | ||
+ | docker-compose unpause | ||
+ | # Listeaza containerele active | ||
+ | docker-compose ps | ||
+ | # Face build, recreaza, porneste si ataseaza containere la un serviciu | ||
+ | docker-compose up | ||
+ | # Serviciile ruleaza in background detasat de terminalul care le-a initializat | ||
+ | docker-compose up -d | ||
+ | # Creaza imaginile inainte de pornire unde a fost declarata calea pentru un Dockerfile pentru un container | ||
+ | docker-compose up --build | ||
+ | # Se foloseste fisierul de docker-compose specificat in loc de cel implicit | ||
+ | docker-compose -f my-docker-compose.yml up | ||
+ | # Opreste containerele si le sterge pe acestea impreuna cu retelele, volumele si imagine create la up. | ||
+ | docker-compose down | ||
+ | # Sterge toate containerele oprite (se poate specifica la sfarsit si numele containerului care trebuie sters) | ||
+ | docker-compose rm | ||
+ | # Cu -s se opresc toate containerele si cu -v se sterg si volumele anonime atasate | ||
+ | docker-compose rm -s -v | ||
+ | </code> | ||
+ | === Proprietati in cadrul unui fisier docker-compose.yml === | ||
+ | <code yaml> | ||
+ | ### Exemple de build pentru imagini | ||
+ | web: | ||
+ | # Build de la un Dockerfile in folderul curent | ||
+ | build: . | ||
+ | # Build de la un Dockerfile specific din subdirectorul 'dir' | ||
+ | build: | ||
+ | context: ./dir | ||
+ | dockerfile: Dockerfile.dev | ||
+ | # Pornire de la o image | ||
+ | image: example-registry:4000/postgresql | ||
+ | |||
+ | ### Asignare de porturi | ||
+ | |||
+ | ports: | ||
+ | - "3000" # se specifica portul intern expus, portul extern (din sistemul gazda) este fie acesta fie in caz de conflic unul alocat aleator | ||
+ | - "8000:80" # port gazda : port container | ||
+ | |||
+ | ### Comenzi de pornire | ||
+ | # Specificarea comenzii de pornire | ||
+ | command: my_exec arg_1 arg_2 | ||
+ | command: [my_exec arg_1 arg_2] | ||
+ | # sau | ||
+ | entrypoint: my_exec arg_1 arg_2 | ||
+ | entrypoint: [my_exec arg_1 arg_2] | ||
+ | |||
+ | ### Variabile de mediu | ||
+ | # Variabilele pot fi declarate direct | ||
+ | environment: | ||
+ | WORK_ENVIRONMENT: development | ||
+ | environment: | ||
+ | - WORK_ENVIRONMENT=development | ||
+ | env_file: .env | ||
+ | env_file: [.env, .development.env] | ||
+ | |||
+ | ### Dependente | ||
+ | # Serviciul respectiv sa fie mapat la un alt hostname (implica depends_on) | ||
+ | links: | ||
+ | - db:database | ||
+ | - redis | ||
+ | # se asteapta pornirea acelui container inainte | ||
+ | depends_on: | ||
+ | - db | ||
+ | |||
+ | ### Declarere de volume | ||
+ | volumes: | ||
+ | - ./data:/var/lib/mysql # Se mapeaza fisierul sau folderul local la ce din container | ||
+ | - named_volume:/var/lib/mysql | ||
+ | |||
+ | ### Network | ||
+ | # Se creaza o noua retea | ||
+ | networks: | ||
+ | - frontend | ||
+ | |||
+ | ### Secrets | ||
+ | secrets: | ||
+ | - my_awesome_secret | ||
+ | </code> | ||
+ | <note important>Cand introduceti un **named volume**, **o retea** sau **un secret**, nu uitati sa le declarati si la finalul fisierului .yml in sectiunile speciale (volumes, networks, secrets)</note> | ||
+ | |||
+ | === Exemplu de docker-compose.yml pentru serviciul "Library" === | ||
+ | <code yaml> | ||
+ | version: "3.8" | ||
+ | |||
+ | services: | ||
+ | library-service: | ||
+ | build: '../' | ||
+ | environment: | ||
+ | NODE_ENV: staging | ||
+ | PGHOST: localhost | ||
+ | PGUSER_FILE: workshop-library-pguser-secret | ||
+ | PGPASSWORD_FILE: workshop-library-pgpassword-secret | ||
+ | PGPORT: 5432 | ||
+ | PGDATABASE: ${PGDATABASE} | ||
+ | AUTH_SERVICE: ${AUTH_SERVICE} | ||
+ | NOTIFICATION_SERVICE: ${NOTIFICATION_SERVICE} | ||
+ | ADMIN_ROLE: ${ADMIN_ROLE} | ||
+ | READER_ROLE: ${READER_ROLE} | ||
+ | volumes: | ||
+ | - ../:/usr/src/app | ||
+ | command: ["npm", "run", "start-dev-docker"] | ||
+ | networks: | ||
+ | - library_internal | ||
+ | - cluster | ||
+ | secrets: | ||
+ | - workshop-library-pguser-secret | ||
+ | - workshop-library-pgpassword-secret | ||
+ | |||
+ | db: | ||
+ | image: postgres | ||
+ | environment: | ||
+ | POSTGRES_USER_FILE: /run/secrets/workshop-library-pguser-secret | ||
+ | POSTGRES_PASSWORD: /run/secrets/workshop-library-pgpassword-secret | ||
+ | POSTGRES_DB: ${PGDATABASE} | ||
+ | TZ: Europe/Bucharest | ||
+ | PGTZ: Europe/Bucharest | ||
+ | volumes: | ||
+ | - workshop-library:/var/lib/postgresql/data | ||
+ | - ./init.sql:/docker-entrypoint-initdb.d/init.sql | ||
+ | networks: | ||
+ | - library_internal | ||
+ | secrets: | ||
+ | - workshop-library-pguser-secret | ||
+ | - workshop-library-pgpassword-secret | ||
+ | |||
+ | pgadmin: | ||
+ | image: dpage/pgadmin4 | ||
+ | ports: | ||
+ | - "30001:80" | ||
+ | environment: | ||
+ | PGADMIN_DEFAULT_EMAIL: test | ||
+ | PGADMIN_DEFAULT_PASSWORD: test | ||
+ | logging: | ||
+ | driver: none | ||
+ | networks: | ||
+ | - library_internal | ||
+ | |||
+ | volumes: | ||
+ | workshop-library: | ||
+ | |||
+ | networks: | ||
+ | library_internal: | ||
+ | cluster: | ||
+ | external: true | ||
+ | name: moby-workshop-cluster | ||
+ | |||
+ | secrets: | ||
+ | workshop-library-pguser-secret: | ||
+ | file: ./secrets/pguser_secret.txt | ||
+ | workshop-library-pgpassword-secret: | ||
+ | file: ./secrets/pgpassword_secret.txt | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==== Exercitii ==== | ||
+ | - Creati-va monorepo-ul | ||
+ | - Creati-va folderul de Deployment | ||
+ | - Adaugati-va repo-urile ca si submodule in monorepo | ||
+ | - Scrieti-va fisierul docker-compose.yml care sa tina **intreaga configuratie** a serviciilor (si a bazelor de date) | ||
+ | - Rulati intreg clusterul folosind //docker-compose up --build// | ||
- | Vom rula docker swarm local si vom crea o stiva de servicii. Vom folosi secrete. |