This is an old revision of the document!


Laboratorul 03. Docker Compose

Introducere

Docker Compose este un creat de catre Docker, folosit pentru centralizarea configurarii de rulare a containerelor in maniera declarativa.

In mod clasic, pentru rularea unor containere, este nevoie sa rulati comanda aferenta de rulare (docker run) si sa dati toti parametri necesari. Acest proces poate deveni anevoios daca este repetat pentru pornirea mai multor containere.

Un mod primitiv de a “salva” configuratia de rulare este sa va creati scripturi. Problema in rularea mai multor scripturi este pierderea consistentei in configurare (Ce container la ce retea se conecteaza, cu cine comunica, etc…).

Utilizand fisiere de configurare .yml, Docker Compose centralizeaza procesul de configurare intr-o maniera naturala, declarativa.

Mai mult de atat, formatul pentru fisiere compose este utilizat si in cadrul Docker Swarm, orchestratorul creat de Docker pentru gestiunea serviciilor Docker. Despre Swarm vom discuta la laboratorul urmator.

O sa observati de mai multe ori ca folosim terminologia servicii/containere. Asta pentru ca Docker Swarm lucreaza cu servicii, in timp ce Docker Compose cu containere. Ne referim la amandoua in acelasi context deoarece configuratia, este, in proportie de 90%, identica, indiferent de utilizarea Swarm sau Compose

Elemente Cheie

Formatul unui fisier YAML

Fisierele YAML (Yet Another Markup Language), de obicei, sunt folosite pentru a scrie configurari declarativ. Formatul este unul foarte usor de inteles si folosit:

  • elemente de tip cheie:valoare
  • aliniatele identate reprezinta proprietati copii ale pargrafelor anterioare
  • listele se delimiteaza prin -

Exemplu Fisier docker-compose.yml

# docker-compose.yml
version: '3.8'
services:
  api:
    build: . # construieste imaginea dintr-un Dockerfile
    image: nume-imagine-registru:versiune # foloseste o imagine de pe registrul curent
    environment:
      NODE_ENV: development
      VARIABILA_DE_MEDIU: valoare
    ports:
     - "5000:80"
    networks:
     - network-laborator-3
  postgres:
    image: postgres:12
    environment:
      PGPASSWORD_FILE: /run/secrets/parola-mea-ultra-secreta
    volumes:
      - volum-laborator-3:/var/lib/postgresql/data
      - ./scripturi-initializare/init-db.sql:/docker-entrypoint-init.d/init-db.sql
    networks:
     - network-laborator-3

volumes:
  volum-laborator-3:

networks:
  network-laborator-3:

secrets:
  parola-mea-ultra-secreta:
    file: './parola-mea-nu-atat-de-secreta.txt'

Version

Version descrie ce set de functionalitati va fi incarcat la rularea utilitarului Docker Compose

Este obligatoriu sa treceti versiunea in orice fisier docker-compose.yml

Services

Services descrie serviciile/containerele ce vor rula dupa ce configuratia este pornita de catre compose. Fiecare serviciu reprezinta un container care va avea numele si configuratia serviciului. In exemplul de mai sus, containerele se vor numi api si postgres.

  • build - mentioneaza folderul unde se afla Dockerfile-ul de la care se va efectua construirea containerului
  • image - mentioneaza numele imaginii folosit pentru rularea containerului

build si image sunt optiuni disjuncte

  • ports - lista de intrari de tipul PORT_HOST:PORT_SERVICIU unde este realizata maparea de porturi
  • volumes - lista de intrari de tipul VOLUM_HOST:CALE_SERVICIU unde sunt precizate maparile de volume. Aceleasi reguli care se aplica la rularea clasica sunt mentinute si aici. VOLUM_HOST poate fi named volume sau bind mount.
  • networks - lista de retele din care face parte serviciul/containerul
  • secrets - lista de secrete ce vor fi folosite in cadrul serviciului/containerului

Secretele trebuie trecute si in cadrul variabilelor de mediu, conform documentatiei. De exemplu, in configuratia Postgres trebuie trecute in variabile de mediu speciale, sufixate cu _FILE, impreuna cu calea lor completa (adica /run/secrets/NUME_SECRET)

  • environment - obiect de intrari de tipul VARIABILA_MEDIU_SERVICIU:valoare care injecteaza variabilele de mediu specificate la rularea serviciului/containerului

Volumes

Volumes descrie NAMED VOLUMES utilizate in cadrul configuratiei.

Observati ca volumes, ca si proprietate top level, este scrisa pe acelasi nivel de identatie ca services. Nu trebuie confundata cu proprietatea copil volumes din interiorul configuratiei serviciilor

Volumele se trec sub forma de obiecte. Daca nu se doreste schimbarea configuratiei default, valoarea este un camp gol. In laboratorul urmator vom lucra cu volume NFS, unde va trebui oferita o configuratie custom.

Networks

Networks descrie retelele utilizate in cadrul configuratiei.

Observati ca networks, ca si proprietate top level, este scrisa pe acelasi nivel de identatie ca services. Nu trebuie confundata cu proprietatea copil networks din interiorul configuratiei serviciilor

Retelele se trec sub forma de obiecte. Daca nu se doreste schimbarea configuratiei default, valoarea este un camp gol. Un exemplu de configuratie de retea este atunci cand se foloseste o retea care deja exista, de exemplu:

networks:
  reteaua-mea-care-de-fapt-exista:
    external: true
    name: reteaua-originala-care-deja-exista

In cazul de mai sus, reteaua-mea-care-de-fapt-exista este doar o “redenumire” a unei retele deja existente.

Secrets

Secrets descrie secretele utilizate in cadrul configuratiei.

Observati ca secrets, ca si proprietate top level, este scrisa pe acelasi nivel de identatie ca services. Nu trebuie confundata cu proprietatea copil secrets din interiorul configuratiei serviciilor

Secretele retin informatii sensibile intr-o maniera securizata, criptata, in cadrul Swarm, despre care vom vorbi la laboratorul urmator. In compose nu sunt securizate, insa au fost introduse pentru a usura tranzitia catre Swarm.

In cadrul compose, secretele pot proveni doar din fisiere externe. Fisierele externe sunt mentionate pentru fiecare secret in parte.

Comenzi Docker Compose

Comenzile pentru interactiunea cu docker-compose seamana, ca si sintaxa, cu cele clasice de docker. Mai jos va oferim cele mai utilizate comenzi.

# 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 
cc/laboratoare/03.1603649953.txt.gz · Last modified: 2020/10/25 20:19 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