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 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.

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.

Pentru a crea un monorepo trebuie sa urmati urmatorii pasi:

  1. creati-va un repository nou
  2. clonati repository-ul local
  3. adaugati, folosind urmatoarea comanda, referinte catre fiecare repository ce contine codul serviciilor voastre:
git submodule add LINK_REPOSITORY

Daca operatia a decurs cu succes, o sa observati un fisier .gitmodules in monorepo

[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

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

# 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

Exemplu de comenzi Docker Compose

# 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 

Proprietati in cadrul unui fisier docker-compose.yml

### 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

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)

Exemplu de docker-compose.yml pentru serviciul "Library"

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

Exercitii

  1. Creati-va monorepo-ul
  2. Creati-va folderul de Deployment
  3. Adaugati-va repo-urile ca si submodule in monorepo
  4. Scrieti-va fisierul docker-compose.yml care sa tina intreaga configuratie a serviciilor (si a bazelor de date)
  5. Rulati intreg clusterul folosind docker-compose up –build
moby/backend/07.txt · Last modified: 2020/08/12 15:24 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