Docker Compose: soti nan devlopman rive nan pwodiksyon an

Tradiksyon transkripsyon podcast a te prepare ann atandan kòmansman kou a "Administratè Linux"

Docker Compose: soti nan devlopman rive nan pwodiksyon an

Docker Compose se yon zouti etonan pou kreye yon travay
anviwònman pou chemine yo itilize nan aplikasyon w lan. Li pèmèt ou defini
chak eleman nan aplikasyon w lan, apre yon sentaks klè ak senp nan YAML-
dosye
.

Avèk avenman nan docker compose v3 dosye YAML sa yo ka itilize dirèkteman nan anviwònman pwodiksyon an lè w ap travay avèk yo
grap Docker swarm.

Men, èske sa vle di ke ou ka itilize menm fichye docker-compose nan
pwosesis devlopman ak nan anviwònman pwodiksyon an? Oswa sèvi ak menm dosye a pou
montan? Oke, an jeneral, wi, men pou fonksyonalite sa a nou bezwen bagay sa yo:

  • Entèpolasyon varyab: itilize varyab anviwònman pou kèk
    valè ki chanje nan chak anviwònman.
  • Konfigirasyon override: kapasite pou defini yon dezyèm (oswa nenpòt
    yon lòt dosye ki vin apre) docker-compose ki pral chanje yon bagay konsènan
    premyèman, ak Docker konpoze pral pran swen nan fusion tou de dosye.

Diferans ant devlopman ak dosye pwodiksyon

Pandan devlopman, ou pral gen plis chans vle tcheke chanjman kòd nan
tan reyèl. Pou fè sa, anjeneral volim ak kòd sous la monte nan
veso ki gen tan pou aplikasyon w lan. Men, pou yon anviwònman pwodiksyon
Metòd sa a pa apwopriye.

Nan pwodiksyon, ou gen yon gwoup ki gen anpil nœuds, ak volim nan lokal yo
parapò ak ne kote veso ou a (oswa sèvis) ap kouri, kidonk ou pa fè sa
ou ka monte kòd sous la san operasyon konplèks ki enkli ladan li
senkronizasyon kòd, siyal, elatriye.

Olye de sa, anjeneral nou vle kreye yon imaj ak yon vèsyon espesifik nan kòd ou a.
Li abitye make li ak tag ki apwopriye a (ou ka itilize semantik
vèsyon oswa yon lòt sistèm nan diskresyon ou).

Konfigirasyon override

Bay diferans ki genyen ak ke depandans ou yo ka diferan nan senaryo
devlopman ak pwodiksyon, li klè ke nou pral bezwen dosye konfigirasyon diferan.

Docker compose sipòte fusion diferan fichye konpoze pou
jwenn konfigirasyon final la. Ki jan sa a fonksyone ka wè nan egzanp lan:

$ 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

Kòm te di, Docker compose sipòte konbine plizyè konpoze -
dosye, sa a pèmèt ou pase sou plas divès paramèt nan dezyèm dosye a. Pa egzanp:

$ 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

Sentaks sa a pa trè pratik pandan devlopman, lè kòmandman an
pral bezwen fè anpil fwa.

Erezman, Docker compose otomatikman gade pou yon dosye espesyal yo rele
docker-compose.override.yml pou pase sou valè yo docker-compose.yml. Si
chanje non dezyèm fichye a, ou jwenn menm rezilta a, sèlman lè l sèvi avèk kòmand orijinal la:

$ 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

Oke, li pi fasil pou w sonje.

Entèpolasyon varyab yo

Konfigirasyon dosye sipò entèpolasyon
varyab yo
ak valè default. Sa vle di, ou ka fè bagay sa yo:

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

Men, si ou fè sa docker-compose bati (oswa pouse) san anviwònman varyab
$MY_SERVICE_VERSION, valè a pral itilize dènyemen si ou mete
valè varyab anviwònman an anvan bati a, li pral itilize lè bati oswa pouse
nan rejis la prive.rejis.min.

Prensip mwen yo

Apwòch ki travay pou mwen yo ka travay pou ou tou. Mwen swiv sa yo
règ senp:

  • Tout pil mwen yo pou pwodiksyon, devlopman (oswa lòt anviwònman) yo defini nan
    docker-compose fichye yo
  • Fichye konfigirasyon ki nesesè pou kouvri tout anviwònman mwen yo, otank posib
    evite repetisyon.
  • Mwen bezwen yon kòmand senp pou travay nan chak anviwònman.
  • Konfigirasyon prensipal la defini nan dosye a docker-compose.yml.
  • Varyab anviwònman yo itilize pou defini imaj imaj oswa lòt
    varyab ki ka varye de yon anviwonman an yon lòt (sèn nan, entegrasyon,
    pwodiksyon).
  • Valè yo nan varyab pwodiksyon yo itilize kòm valè pou
    pa default, sa a minimize risk yo si chemine a te lanse nan pwodiksyon san yo pa
    mete varyab anviwònman an.
  • Pou kòmanse yon sèvis nan yon anviwònman pwodiksyon, sèvi ak lòd la docker stack deploy - compose-file docker-compose.yml -with-registry-auth my-stack-name.
  • Anviwònman k ap travay la kòmanse itilize kòmandman an docker-compose up -d.

Ann gade yon egzanp senp.

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

Mwen ka itilize docker-compose (docker-konpoze moute)pou kouri pil la nan
mòd devlopman ak kòd sous monte nan /projè/src.

Mwen ka itilize menm dosye sa yo nan pwodiksyon! Apre sa, mwen te kapab definitivman itilize
menm dosye docker-compose.yml pou sèn nan. Pou elaji sa a
pwodiksyon, mwen jis bezwen bati epi voye imaj la ak yon tag predefini
nan etap CI:

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

Nan pwodiksyon, sa a ka kouri lè l sèvi avèk kòmandman sa yo:

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

Men, si ou vle fè menm bagay la sou sèn, ou jis bezwen defini
varyab anviwònman ki nesesè pou travay nan anviwònman an sèn nan:

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

Kòm yon rezilta, nou te itilize de diferan Docker-konpoze dosye, ki san yo pa
Konfigirasyon kopi yo ka itilize pou nenpòt anviwònman ou genyen!

Aprann plis sou kou a "Administratè Linux"

Sous: www.habr.com

Add nouvo kòmantè