Docker Compose: ืžืคื™ืชื•ื— ืœื™ื™ืฆื•ืจ

ืชืจื’ื•ื ืชืžืœื•ืœ ื”ืคื•ื“ืงืืกื˜ ืฉื”ื•ื›ืŸ ืœืงืจืืช ืชื—ื™ืœืช ื”ืงื•ืจืก "ืžื ื”ืœ ืœื™ื ื•ืงืก"

Docker Compose: ืžืคื™ืชื•ื— ืœื™ื™ืฆื•ืจ

Docker Compose ื”ื•ื ื›ืœื™ ืžื“ื”ื™ื ืœื™ืฆื™ืจืช ืขื‘ื•ื“ื”
ืกื‘ื™ื‘ื” ืขื‘ื•ืจ ื”ืžื—ืกื ื™ืช ื”ืžืฉืžืฉืช ื‘ื™ื™ืฉื•ื ืฉืœืš. ื–ื” ืžืืคืฉืจ ืœืš ืœื”ื’ื“ื™ืจ
ื›ืœ ืจื›ื™ื‘ ืฉืœ ื”ื™ื™ืฉื•ื ืฉืœืš, ื‘ืขืงื‘ื•ืช ืชื—ื‘ื™ืจ ื‘ืจื•ืจ ื•ืคืฉื•ื˜ ื‘ YAML-
ืงื‘ืฆื™ื
.

ืขื ื›ื ื™ืกืชื• ืฉืœ docker compose v3 ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืงื‘ืฆื™ YAML ืืœื” ื™ืฉื™ืจื•ืช ื‘ืกื‘ื™ื‘ืช ื”ื™ื™ืฆื•ืจ ื‘ืขืช ืขื‘ื•ื“ื” ืขื
ืึถืฉืื›ึผื•ึนืœ ื ื—ื™ืœ ื“ื•ืงืจ.

ืื‘ืœ ื”ืื ื–ื” ืื•ืžืจ ืฉืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืื•ืชื• ืงื•ื‘ืฅ docker-compose ื‘
ืชื”ืœื™ืš ื”ืคื™ืชื•ื— ื•ื‘ืกื‘ื™ื‘ืช ื”ื™ื™ืฆื•ืจ? ืื• ื”ืฉืชืžืฉ ื‘ืื•ืชื• ืงื•ื‘ืฅ ืขื‘ื•ืจ
ื”ึทืฆึธื’ึธื”? ื•ื‘ื›ืŸ, ื‘ืื•ืคืŸ ื›ืœืœื™, ื›ืŸ, ืื‘ืœ ืขื‘ื•ืจ ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ื–ื• ืื ื—ื ื• ืฆืจื™ื›ื™ื ืืช ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื:

  • ืื™ื ื˜ืจืคื•ืœืฆื™ื” ืžืฉืชื ื™ื: ืฉื™ืžื•ืฉ ื‘ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ืขื‘ื•ืจ ื—ืœืง
    ืขืจื›ื™ื ื”ืžืฉืชื ื™ื ื‘ื›ืœ ืกื‘ื™ื‘ื”.
  • ืขืงื™ืคื” ืฉืœ ืชืฆื•ืจื”: ื™ื›ื•ืœืช ืœื”ื’ื“ื™ืจ ืฉื ื™ื™ื” (ืื• ื›ืœ
    ืงื•ื‘ืฅ ื ื•ืกืฃ ืขื•ืงื‘) docker-compose ืฉื™ืฉื ื” ืžืฉื”ื• ืœื’ื‘ื™
    ืจืืฉื™ืช, ื•-docker compose ื™ื“ืื’ ืœืžื™ื–ื•ื’ ืฉื ื™ ื”ืงื‘ืฆื™ื.

ื”ื‘ื“ืœื™ื ื‘ื™ืŸ ืงื‘ืฆื™ ืคื™ืชื•ื— ืœื™ื™ืฆื•ืจ

ื‘ืžื”ืœืš ื”ืคื™ืชื•ื—, ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉืชืจืฆื” ืœื‘ื“ื•ืง ืฉื™ื ื•ื™ื™ื ื‘ืงื•ื“
ื–ืžืŸ ืืžืช. ืœืฉื ื›ืš, ื‘ื“ืจืš ื›ืœืœ ื ืคื— ื”ืื—ืกื•ืŸ ืขื ืงื•ื“ ื”ืžืงื•ืจ ืžื•ืชืงืŸ
ืžื™ื›ืœ ื”ืžื›ื™ืœ ื–ืžืŸ ืจื™ืฆื” ืขื‘ื•ืจ ื”ื™ื™ืฉื•ื ืฉืœืš. ืื‘ืœ ืœืกื‘ื™ื‘ืช ื™ื™ืฆื•ืจ
ืฉื™ื˜ื” ื–ื• ืื™ื ื” ืžืชืื™ืžื”.

ื‘ื™ื™ืฆื•ืจ, ื™ืฉ ืœืš ืืฉื›ื•ืœ ืขื ืฆืžืชื™ื ืจื‘ื™ื, ื•ื”ื ืคื— ื”ื•ื ืžืงื•ืžื™
ื‘ื™ื—ืก ืœืฆื•ืžืช ืฉืขืœื™ื• ืคื•ืขืœ ื”ืžื›ื•ืœื” (ืื• ื”ืฉื™ืจื•ืช) ืฉืœืš, ืื– ืืชื” ืœื ืขื•ืฉื” ื–ืืช
ืืชื” ื™ื›ื•ืœ ืœื”ืขืœื•ืช ืืช ืงื•ื“ ื”ืžืงื•ืจ ืœืœื ืคืขื•ืœื•ืช ืžื•ืจื›ื‘ื•ืช ื”ื›ื•ืœืœื•ืช
ืกื ื›ืจื•ืŸ ืงื•ื“, ืื•ืชื•ืช ื•ื›ื•'.

ื‘ืžืงื•ื ื–ืืช, ืื ื• ื‘ื“ืจืš ื›ืœืœ ืจื•ืฆื™ื ืœื™ืฆื•ืจ ืชืžื•ื ื” ืขื ื’ืจืกื” ืกืคืฆื™ืคื™ืช ืฉืœ ื”ืงื•ื“ ืฉืœืš.
ื ื”ื•ื’ ืœืกืžืŸ ื‘ืชื’ ื”ืžืชืื™ื (ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืกืžื ื˜ื™ืงื”
ื ื™ื”ื•ืœ ื’ืจืกืื•ืช ืื• ืžืขืจื›ืช ืื—ืจืช ืœืคื™ ืฉื™ืงื•ืœ ื“ืขืชืš).

ื‘ื™ื˜ื•ืœ ืชืฆื•ืจื”

ื‘ื”ืชื—ืฉื‘ ื‘ื”ื‘ื“ืœื™ื ื•ืฉื”ืชืœื•ืช ืฉืœืš ืขืฉื•ื™ื” ืœื”ื™ื•ืช ืฉื•ื ื” ื‘ืชืจื—ื™ืฉื™ื
ืคื™ืชื•ื— ื•ื™ื™ืฆื•ืจ, ื‘ืจื•ืจ ืฉื ืฆื˜ืจืš ืงื‘ืฆื™ ืชืฆื•ืจื” ืฉื•ื ื™ื.

Docker compose ืชื•ืžืš ื‘ืžื™ื–ื•ื’ ืงื‘ืฆื™ ื—ื™ื‘ื•ืจ ืฉื•ื ื™ื
ืœื”ืฉื™ื’ ืืช ื”ืชืฆื•ืจื” ื”ืกื•ืคื™ืช. ืื™ืš ื–ื” ืขื•ื‘ื“ ื ื™ืชืŸ ืœืจืื•ืช ื‘ื“ื•ื’ืžื”:

$ 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

ื›ืืžื•ืจ, docker compose ืชื•ืžืš ื‘ืฉื™ืœื•ื‘ ื—ื™ื‘ื•ืจื™ื ืžืจื•ื‘ื™ื -
ืงื‘ืฆื™ื, ื–ื” ืžืืคืฉืจ ืœืš ืœืขืงื•ืฃ ืคืจืžื˜ืจื™ื ืฉื•ื ื™ื ื‘ืงื•ื‘ืฅ ื”ืฉื ื™. ืœื“ื•ื’ืžื”:

$ 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

ืชื—ื‘ื™ืจ ื–ื” ืื™ื ื• ื ื•ื— ื‘ืžื™ื•ื—ื“ ื‘ืžื”ืœืš ื”ืคื™ืชื•ื—, ื›ืืฉืจ ื”ืคืงื•ื“ื”
ื™ืฆื˜ืจืš ืœื”ื™ืขืฉื•ืช ืคืขืžื™ื ืจื‘ื•ืช.

ืœืžืจื‘ื” ื”ืžื–ืœ, docker compose ืžื—ืคืฉ ืื•ื˜ื•ืžื˜ื™ืช ืงื•ื‘ืฅ ืžื™ื•ื—ื“ ื‘ืฉื
docker-compose.override.yml ืœืขืงื•ืฃ ืขืจื›ื™ื docker-compose.ym. ืื
ืฉื ื” ืืช ืฉื ื”ืงื•ื‘ืฅ ื”ืฉื ื™, ืืชื” ืžืงื‘ืœ ืืช ืื•ืชื” ืชื•ืฆืื”, ืจืง ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” ื”ืžืงื•ืจื™ืช:

$ 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

ืื•ืงื™ื™, ืงืœ ื™ื•ืชืจ ืœื–ื›ื•ืจ ืืช ื–ื”.

ืื™ื ื˜ืจืคื•ืœืฆื™ื” ืฉืœ ืžืฉืชื ื™ื

ืชืžื™ื›ื” ื‘ืงื‘ืฆื™ ืชืฆื•ืจื” ืฉืึดืจื‘ึผื•ึผื‘
ืžืฉืชื ื™ื
ื•ืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ. ื›ืœื•ืžืจ, ืืชื” ื™ื›ื•ืœ ืœืขืฉื•ืช ืืช ื”ืคืขื•ืœื•ืช ื”ื‘ืื•ืช:

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

ื•ืื ื›ืŸ ื‘ื ื™ื™ืช docker-compose (ืื• ื“ื—ื™ืคื”) ืœืœื ืžืฉืชื ื” ืกื‘ื™ื‘ื”
$MY_SERVICE_VERSION, ื”ืขืจืš ื™ืฉืžืฉ ื”ืื—ืจื•ืŸืื‘ืœ ืื ืชื’ื“ื™ืจ
ื”ืขืจืš ืฉืœ ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” ืœืคื ื™ ื”ื‘ื ื™ื™ื”, ื”ื•ื ื™ืฉืžืฉ ื‘ืขืช ื‘ื ื™ื™ื” ืื• ื“ื—ื™ืคื”
ืœืคื ืงืก private.registry.mine.

ื”ืขืงืจื•ื ื•ืช ืฉืœื™

ื”ื’ื™ืฉื•ืช ืฉืขื•ื‘ื“ื•ืช ื‘ืฉื‘ื™ืœื™ ืขืฉื•ื™ื•ืช ืœืขื‘ื•ื“ ื’ื ื‘ืฉื‘ื™ืœืš. ืื ื™ ืขื•ืงื‘ ืื—ืจ ืืœื”
ื›ืœืœื™ื ืคืฉื•ื˜ื™ื:

  • ื›ืœ ื”ืขืจื™ืžื•ืช ืฉืœื™ ืœื™ื™ืฆื•ืจ, ืคื™ืชื•ื— (ืื• ืกื‘ื™ื‘ื•ืช ืื—ืจื•ืช) ืžื•ื’ื“ืจื•ืช ื“ืจืš
    ืงื‘ืฆื™ docker-compose
  • ืงื‘ืฆื™ ืชืฆื•ืจื” ื”ื“ืจื•ืฉื™ื ื›ื“ื™ ืœื›ืกื•ืช ืืช ื›ืœ ื”ืกื‘ื™ื‘ื•ืช ืฉืœื™, ื›ื›ืœ ื”ืืคืฉืจ
    ืœืžื ื•ืข ื›ืคื™ืœื•ืช.
  • ืื ื™ ืฆืจื™ืš ืคืงื•ื“ื” ืื—ืช ืคืฉื•ื˜ื” ื›ื“ื™ ืœืขื‘ื•ื“ ื‘ื›ืœ ืกื‘ื™ื‘ื”.
  • ื”ืชืฆื•ืจื” ื”ืจืืฉื™ืช ืžื•ื’ื“ืจืช ื‘ืงื•ื‘ืฅ docker-compose.ym.
  • ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ืžืฉืžืฉื™ื ืœื”ื’ื“ืจืช ืชื’ื™ ืชืžื•ื ื” ืื• ืื—ืจื™ื
    ืžืฉืชื ื™ื ืฉืขืฉื•ื™ื™ื ืœื”ืฉืชื ื•ืช ืžืกื‘ื™ื‘ื” ืœืกื‘ื™ื‘ื” (ื‘ื™ื™ืžื”, ืื™ื ื˜ื’ืจืฆื™ื”,
    ื”ืคืงื”).
  • ื”ืขืจื›ื™ื ืฉืœ ืžืฉืชื ื™ ื™ื™ืฆื•ืจ ืžืฉืžืฉื™ื ื›ืขืจื›ื™ื ืขื‘ื•ืจ
    ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ื–ื” ืžืžื–ืขืจ ืืช ื”ืกื™ื›ื•ื ื™ื ืื ื”ืขืจื™ืžื” ืžื•ืฉืงืช ื‘ื™ื™ืฆื•ืจ ืœืœื
    ื”ื’ื“ืจ ืžืฉืชื ื” ืกื‘ื™ื‘ื”.
  • ื›ื“ื™ ืœื”ืคืขื™ืœ ืฉื™ืจื•ืช ื‘ืกื‘ื™ื‘ืช ื™ื™ืฆื•ืจ, ื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื” docker stack deploy - ื—ื™ื‘ื•ืจ-ืงื•ื‘ืฅ docker-compose.yml -with-registry-auth-my-stack-name.
  • ืกื‘ื™ื‘ืช ื”ืขื‘ื•ื“ื” ืžืชื—ื™ืœื” ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” docker-compose ืœืžืขืœื”.

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžื” ืคืฉื•ื˜ื”.

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

ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ docker-compose (docker-compose up)ืœื”ืคืขื™ืœ ืืช ื”ืขืจื™ืžื” ืคื ื™ืžื”
ืžืฆื‘ ืคื™ืชื•ื— ืขื ืงื•ื“ ืžืงื•ืจ ืžื•ืชืงืŸ /project/src.

ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืื•ืชื ืงื‘ืฆื™ื ื‘ื™ื™ืฆื•ืจ! ื•ืื ื™ ื‘ื”ื—ืœื˜ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ
ืื•ืชื• ืงื•ื‘ืฅ docker-compose.ym ืœื‘ื™ืžื•ื™. ื›ื“ื™ ืœื”ืจื—ื™ื‘ ืืช ื–ื” ืœ
ื™ื™ืฆื•ืจ, ืื ื™ ืจืง ืฆืจื™ืš ืœื‘ื ื•ืช ื•ืœืฉืœื•ื— ืืช ื”ืชืžื•ื ื” ืขื ืชื’ ืžื•ื’ื“ืจ ืžืจืืฉ
ื‘ืฉืœื‘ CI:

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

ื‘ื™ื™ืฆื•ืจ, ื ื™ืชืŸ ืœื”ืคืขื™ืœ ืืช ื–ื” ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื•ืช ื”ื‘ืื•ืช:

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

ื•ืื ืืชื” ืจื•ืฆื” ืœืขืฉื•ืช ืืช ืื•ืชื• ื”ื“ื‘ืจ ืขืœ ื”ื‘ืžื”, ืืชื” ืจืง ืฆืจื™ืš ืœื”ื’ื“ื™ืจ
ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ื ื—ื•ืฆื™ื ืœืขื‘ื•ื“ื” ื‘ืกื‘ื™ื‘ืช ื”ื‘ืžื”:

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

ื›ืชื•ืฆืื” ืžื›ืš, ื”ืฉืชืžืฉื ื• ื‘ืฉื ื™ ืงื‘ืฆื™ docker-compose ืฉื•ื ื™ื, ืืฉืจ ืœืœื
ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืชืฆื•ืจื•ืช ื›ืคื•ืœื•ืช ืขื‘ื•ืจ ื›ืœ ืกื‘ื™ื‘ื” ืฉื™ืฉ ืœืš!

ืœืžื™ื“ืข ื ื•ืกืฃ ืขืœ ื”ืงื•ืจืก "ืžื ื”ืœ ืœื™ื ื•ืงืก"

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”