Concepte atinse:
Puteti accesa inregistrarea video si slide-urile teoretice aici
Asa cum am propus in workshopurile trecute, vom avea 3 medii de lucru:
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.
Vom folosi conceptul de monorepo bazat pe soft links (submodule), foarte des intalnit in lucrul cu microserviciile.
Pentru a crea un monorepo trebuie sa urmati urmatorii pasi:
git submodule add LINK_REPOSITORY
[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
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
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:
# 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
# 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
### 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
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