Docker Compose: od razvoja do proizvodnje

Prijevod transkripcije podcasta pripremljenog u iščekivanju početka kursa "Linux administrator"

Docker Compose: od razvoja do proizvodnje

Docker Compose je neverovatan alat za kreiranje desktopa
okruženje za stek koji se koristi u vašoj aplikaciji. Omogućava vam da definišete
svaku komponentu vaše aplikacije, prateći jasnu i jednostavnu sintaksu YAML-
datoteke
.

Sa pojavom docker compose v3 ove YAML datoteke se mogu koristiti direktno u proizvodnom okruženju, kada se radi sa njima
klaster Docker roj.

Ali da li to znači da možete koristiti isti docker-compose fajl u
razvojni proces i proizvodno okruženje? Ili koristite isti fajl za
inscenacija? Pa, općenito, da, ali za takvu funkcionalnost nam je potrebno sljedeće:

  • Interpolacija varijable: korištenje varijabli okruženja za neke
    vrijednosti koje se mijenjaju u svakoj sredini.
  • Nadjačavanje konfiguracije: mogućnost definiranja sekunde (ili bilo kojeg
    još jedan nastavak) docker-compose fajl koji će promijeniti nešto u vezi
    prvi, a docker compose će se pobrinuti za spajanje oba fajla.

Razlike između razvojnih i proizvodnih datoteka

Tokom razvoja, najvjerovatnije ćete htjeti provjeriti promjene koda
režim u realnom vremenu. Da biste to učinili, obično se u njega montira volumen s izvornim kodom
kontejner koji sadrži runtime za vašu aplikaciju. Ali za proizvodno okruženje
ovaj način nije prikladan.

U proizvodnji imate klaster s više čvorova i volumen je lokalni
u odnosu na host na kojem vaš kontejner (ili usluga) radi, tako da ne radite
možete montirati izvorni kod bez složenih operacija, koje uključuju
sinhronizacija koda, signali itd.

Umjesto toga, obično želimo da kreiramo sliku sa određenom verzijom vašeg koda.
Uobičajeno je da ga označite odgovarajućom oznakom (možete koristiti semantički
verzijama ili neki drugi sistem po vašem izboru).

Nadjačavanje konfiguracije

S obzirom na razlike i da se vaše ovisnosti mogu razlikovati u scenarijima
razvoja i proizvodnje, jasno je da će nam trebati različite konfiguracijske datoteke.

Docker compose podržava spajanje različitih datoteka za sastavljanje
dobiti konačnu konfiguraciju. Kako to funkcionira može se vidjeti na primjeru:

$ cat docker-compose.yml
version: "3.2"

services:
  whale:
    image: docker/whalesay
    command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ________
whale_1  | < hello! >
whale_1  |  --------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Kao što je rečeno, docker compose podržava spajanje više komponenata-
datoteke, ovo vam omogućava da nadjačate različite opcije u drugoj datoteci. Na primjer:

$ cat docker-compose.second.yml
version: "3.2"
services:
  whale:
    command: ["cowsay", "bye!"]

$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Ova sintaksa nije baš zgodna u procesu razvoja, kada je komanda
potrebno uraditi više puta.

Srećom, docker compose automatski traži posebnu datoteku pod nazivom
docker-compose.override.yml za nadjačavanje vrijednosti docker-compose.yml. Ako
preimenujte drugu datoteku, dobit ćete isti rezultat, samo koristeći originalnu naredbu:

$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

U redu, to je lakše zapamtiti.

Interpolacija varijable

Podrška za konfiguracijske datoteke interpolacija
varijable
i zadane vrijednosti. Odnosno, možete učiniti sljedeće:

services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...

I ako to uradite docker-compose build (ili push) bez varijable okruženja
$MY_SERVICE_VERSION, vrijednost će se koristiti najnovijiali ako postavite
vrijednost varijable okruženja prije izgradnje, ona će se koristiti prilikom izgradnje ili guranja
registrirati private.registry.mine.

Moji principi

Pristupi koji su meni zgodni mogu biti korisni za vas. Pratim ovo
jednostavna pravila:

  • Svi moji stekovi za proizvodnju, razvoj (ili druga okruženja) su definisani kroz
    docker-compose fajlovi.
  • Konfiguracijski fajlovi potrebni za pokrivanje svih mojih okruženja, maks.
    izbegavajte dupliranje.
  • Potrebna mi je jedna jednostavna komanda za rad u svakom okruženju.
  • Glavna konfiguracija je definirana u datoteci docker-compose.yml.
  • Varijable okruženja se koriste za definiranje oznaka slike ili drugog
    varijable koje se mogu mijenjati od okruženja do okruženja (staging, integracija,
    proizvodnja).
  • Vrijednosti varijabli za proizvodnju koriste se kao vrijednosti od strane
    po defaultu, ovo minimizira rizike ako pokrenete stek u proizvodnji bez
    postaviti varijablu okruženja.
  • Da biste pokrenuli uslugu u proizvodnom okruženju, koristite naredbu docker stack deploy - compose-file docker-compose.yml - with-registry-auth my-stack-name.
  • Radno okruženje se pokreće komandom docker-compose up -d.

Pogledajmo jednostavan primjer.

# docker-compose.yml
...
services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
    environment:
      API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...

И

# docker-compose.override.yml
...
services:
  my-service:
    ports: # This is needed for development!
      - 80:80
    environment:
      API_ENDPOINT: https://devel.my-api.com
    volumes:
      - ./:/project/src
...

Mogu koristiti docker-compose (docker-compose up)za pokretanje steka
razvojni način sa ugrađenim izvornim kodom /projekt/src.

Mogu koristiti iste datoteke u produkciji! I mogao bih koristiti tačno
isti fajl docker-compose.yml za inscenaciju. Da proširim ovo na
produkciju, samo treba da napravim i pošaljem sliku sa unapred definisanom oznakom
u CI fazi:

export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push

U proizvodnji, ovo se može pokrenuti sa sljedećim naredbama:

export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

A ako želite da uradite isto na sceni, samo treba da definišete
potrebne varijable okruženja za rad u scenskom okruženju:

export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

Kao rezultat toga, koristili smo dva različita docker-compose fajla, bez
duple konfiguracije se mogu koristiti za bilo koje vaše okruženje!

Saznajte više o kursu "Linux administrator"

izvor: www.habr.com

Dodajte komentar