Docker Compose: vun Entwécklung bis Produktioun

Iwwersetzung vun der Podcast Transkriptioun virbereet an Erwaardung vum Start vum Cours "Linux Administrator"

Docker Compose: vun Entwécklung bis Produktioun

Docker Compose ass en erstaunlech Tool fir eng Aarbecht ze kreéieren
Ëmfeld fir de Stack benotzt an Ärer Applikatioun. Et erlaabt Iech ze definéieren
all Komponent vun Ärer Applikatioun, no enger kloer an einfacher Syntax an JAML-
Fichieren
.

Mat dem Advent vun docker compose v3 dës YAML Dateien kënnen direkt an der Produktiounsëmfeld benotzt ginn wann Dir schafft
Stärekoup Docker Schwärm.

Awer heescht dat datt Dir déiselwecht Docker-Compose Datei benotze kënnt
Entwécklungsprozess an am Produktiounsëmfeld? Oder benotzt déi selwecht Datei fir
inszenéieren? Gutt, am Allgemengen, jo, awer fir dës Funktionalitéit brauche mir déi folgend:

  • Variabel Interpolatioun: benotzt Ëmweltvariablen fir e puer
    Wäerter déi an all Ëmfeld änneren.
  • Konfiguratioun Iwwerschreiden: d'Fäegkeet fir eng zweet (oder all
    eng aner spéider) docker-compose Datei déi eppes betreffend änneren
    als éischt, an Docker compose këmmert sech ëm béid Dateien ze fusionéieren.

Differenzen tëscht Entwécklung a Produktiounsdateien

Wärend der Entwécklung wëllt Dir héchstwahrscheinlech Code Ännerungen iwwerpréiwen
Echtzäit. Fir dëst ze maachen, ass normalerweis de Volume mam Quellcode montéiert
Container deen Runtime fir Är Applikatioun enthält. Mä fir eng Produktioun Ëmfeld
Dës Method ass net gëeegent.

An der Produktioun hutt Dir e Stärekoup mat ville Wirbelen, an de Volume ass lokal
relativ zum Node op deem Äre Container (oder Service) leeft, sou datt Dir net
Dir kënnt de Quellcode montéieren ouni komplex Operatiounen déi enthalen
Code Synchroniséierung, Signaler, etc.

Amplaz wëlle mir normalerweis e Bild mat enger spezifescher Versioun vun Ärem Code erstellen.
Et ass üblech et mat dem passenden Tag ze markéieren (Dir kënnt semantesch benotzen
Versioun oder en anere System no Ärem Diskretioun).

Configuratioun Iwwerschreiden

Gitt d'Ënnerscheeder an datt Är Ofhängegkeeten an Szenarien ënnerscheeden kënnen
Entwécklung a Produktioun, ass et kloer datt mir verschidde Konfiguratiounsdateien brauchen.

Docker compose ënnerstëtzt d'Fusioun vu verschiddene compose Dateien op
kréien déi lescht Konfiguratioun. Wéi dëst funktionnéiert kann am Beispill gesi ginn:

$ 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

Wéi gesot, Docker compose ënnerstëtzt d'Kombinatioun vu multiple composes -
Dateien, dëst erlaabt Iech verschidde Parameteren an der zweeter Datei ze iwwerschreiden. Zum Beispill:

$ 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

Dës Syntax ass net ganz bequem während der Entwécklung, wann de Kommando
muss vill Mol gemaach ginn.

Glécklecherweis sicht docker compose automatesch no enger spezieller Datei genannt
docker-compose.override.yml Wäerter ze iwwerschreiden docker-compose.yml. Wann
ëmbenennen déi zweet Datei, kritt Dir datselwecht Resultat, nëmmen d'Original Kommando benotzt:

$ 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

Okay, dat ass méi einfach ze erënneren.

Interpolatioun vu Variablen

Konfiguratiounsdateien Ënnerstëtzung Interpolatioun
Verännerlechen
an Default Wäerter. Dat ass, Dir kënnt déi folgend maachen:

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

A wann Dir maacht docker-compose bauen (oder drécken) ouni Ëmfeld Variabel
$MY_SERVICE_VERSION, gëtt de Wäert benotzt läschtmee wann Dir setzt
de Wäert vun der Ëmweltvariabel virum Bau, et gëtt benotzt wann Dir baut oder dréckt
an de Register private.registry.mine.

Meng Prinzipien

D'Approche déi fir mech funktionnéiere kënnen och fir Iech funktionnéieren. Ech verfollegen dës
einfach Regelen:

  • All meng Stacks fir Produktioun, Entwécklung (oder aner Ëmfeld) sinn duerch definéiert
    docker-compose Dateien
  • Konfiguratiounsdateien néideg fir all meng Ëmfeld sou vill wéi méiglech ze decken
    vermeiden Duplikatioun.
  • Ech brauch een einfache Kommando fir an all Ëmfeld ze schaffen.
  • D'Haaptkonfiguratioun ass an der Datei definéiert docker-compose.yml.
  • Ëmfeld Variablen gi benotzt fir Bildtags oder aner ze definéieren
    Variabelen déi vun Ëmfeld zu Ëmfeld variéiere kënnen (Staging, Integratioun,
    Produktioun).
  • D'Wäerter vun de Produktiounsvariablen ginn als Wäerter benotzt fir
    par défaut miniméiert dëst d'Risiken wann de Stack ouni Produktioun lancéiert gëtt
    setzen Ëmfeld Variabel.
  • Fir e Service an engem Produktiounsëmfeld ze starten, benotzt de Kommando docker stack deploy - compose-file docker-compose.yml -with-registry-auth my-stack-name.
  • D'Aarbechtsëmfeld gëtt mam Kommando gestart Docker-komponéiert op -d.

Loosst eis en einfacht Beispill kucken.

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

Ech kann benotzen docker-compose (docker-compose up)de Stack ze lafen an
Entwécklungsmodus mat Quellcode montéiert /project/src.

Ech kann déi selwecht Dateien an der Produktioun benotzen! An ech kéint definitiv benotzen
selwecht Fichier docker-compose.yml fir Inszenéierung. Fir dëst ze vergréisseren
Produktioun, Ech brauch just d'Bild mat engem virdefinéierten Tag ze bauen an ze schécken
an der CI Etapp:

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

An der Produktioun kann dëst mat de folgende Kommandoen lafen:

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

A wann Dir datselwecht op der Bühn wëllt maachen, musst Dir just definéieren
Noutwendeg Ëmfeldvariablen fir am Staging Ëmfeld ze schaffen:

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

Als Resultat hu mir zwee verschidde Docker-Compose Dateien benotzt, déi ouni
Duplikat Konfiguratiounen kënne benotzt ginn fir all Ëmfeld déi Dir hutt!

Léiert méi iwwer de Cours "Linux Administrator"

Source: will.com

Setzt e Commentaire