This is an old revision of the document!
Docker Compose este un utilitar creat de către Docker, folosit pentru centralizarea configurării de rulare a containerelor în manieră declarativă.
În mod clasic, pentru rularea unor containere, este nevoie să rulați comanda aferentă de rulare (docker run) și să dați toți parametrii necesari. Acest proces poate deveni anevoios dacă este repetat pentru pornirea mai multor containere.
Un mod muncitoresc de a „salva” configurația de rulare este să vă creați scripturi. Problema în rularea mai multor scripturi este pierderea uniformității în configurare (ce container la ce rețea se conectează, cu cine comunică, etc.).
Utilizând fișiere de configurare .yml, Docker Compose centralizează procesul de configurare într-o manieră naturală, declarativă.
Mai mult decât atât, formatul pentru fișierele Compose este utilizat și în cadrul Docker Swarm, orchestratorul creat de Docker pentru gestiunea serviciilor Docker, despre care vom discuta la laboratorul următor.
Fisierele YAML (Yet Another Markup Language), de obicei, sunt folosite pentru a scrie configurari declarativ. Formatul este unul foarte usor de inteles si folosit:
# 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 descrie ce set de functionalitati va fi incarcat la rularea utilitarului Docker Compose
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.
Volumes descrie NAMED VOLUMES utilizate in cadrul configuratiei.
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 descrie retelele utilizate in cadrul configuratiei.
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 descrie secretele utilizate in cadrul configuratiei.
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.
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
Docker Compose este recomandat sa fie utilizat doar in etapa de dezvoltare locala. Pentru medii de testare sau productie se foloseste Docker Swarm sau alte orchestratoare, precum Kubernetes.
Tocmai pentru ca este folosit in etapa de dezvoltare, acesta are un mecanism de a combina mai multe fisiere compose pentru a crea mai multe configuratii de rulare, fara a replica partile comune.
Pentru a rula o configuratie de compose bazata pe mai multe fisiere, este nevoie sa rulati
docker-compose -f fisier-compose-1.yml -f fisier-compose-2.yml up --build
Informatiile din fisier-compose-2.yml vor suprascrie/completa informatiile din fisier-compose-1.yml. Acest lucru este util pentru a testa diverse configuratii rapid.
Resursele practice pentru acest laborator le puteti accesa pe repo-ul oficial al materiei Cloud Computing
Exercitiile urmaresc intelegerea conceptelor de compose. Sunt optionale, insa va recomandam sa le lucrati pentru a dobandi deprindere de lucru.