Differences

This shows you the differences between two versions of the page.

Link to this comparison view

moby:backend:07 [2020/05/31 20:08]
alexandru.hogea
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 ​=====
  
-Vom rula docker ​swarm local si vom crea o stiva de servicii. Vom folosi ​concepte noiprecum secreteretele overlay ​si tooluri ​de administrareprecum Portainer.+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-urifara 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 aibala 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 modifica serviciile noastre sa stie sa preia informatii din variabile de mediu, sau din secrete docker, in functie de mediul de rulare. 
moby/backend/07.1590944920.txt.gz · Last modified: 2020/05/31 20:08 by alexandru.hogea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0