ืืืืขืจืืขืฆืื ื ืคืื ืื ืคึผืึธืืงืึทืกื ืืจืึทื ืกืงืจืืคึผืฆืืข ืฆืืืขืืจืืื ืืื ืึทื ืืืกืึทืคึผืืืฉืึทื ืคืื ืื ืึธื ืืืื ืคืื ืืขื ืงืืจืก
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
ืืื ืืขืืึธืื, ืืึธืงืขืจ ืงืึทืืคึผืึธืื ืฉืืืฆื ืงืึทืืืืื ืื ื ืงืืืคื ืงืึทืืคึผืึธืืืื -
ืืขืงืขืก, ืืึธืก ืึทืืึทืื ืืืจ ืฆื ืึธืืืืขืจืจืืื ืคืึทืจืฉืืื ืคึผืึทืจืึทืืขืืขืจืก ืืื ืื ืจืืข ืืขืงืข. ืืืฉื:
$ 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.override.yml ืฆื ืึธืืืืขืจืจืืื ืืืึทืืืขืก ืืึธืงืงืขืจ-ืงืึธืืคึผืึธืกืข.ืืื. ืืืื
ืจืขื ืึทืืข ืื ืจืืข ืืขืงืข, ืืืจ ืืึทืงืืืขื ืื ืืขืืืข ืจืขืืืืืึทื, ื ืึธืจ ื ืืฆื ืื ืึธืจืืืื ืขื ืืึทืคึฟืขื:
$ 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}
...
ืืื ืืืื ืืืจ ืืึธื ืืึธืงืขืจ-ืงืึธืืคึผืึธืกืข ืืืืขื (ืึธืืขืจ ืฉืืืคึผื) ืึธื ืกืืืืืืข ืืืึทืืขืืืืืง
$MY_SERVICE_VERSION, ืื ืืืขืจื ืืืขื ืืืื ืืขืืืืื ื ืืขืฆืืึธืืขืจ ืืืื ืืืจ ืฉืืขืื
ืื ืืืขืจื ืคืื ืื ืื ืืืืืจืึทื ืืขื ืึทื ืืืึทืืขืืืืืง ืืืืืขืจ ืื ืืืืขื, ืขืก ืืืขื ืืืื ืืขืืืืื ื ืืืขื ืื ืื ืึธืืขืจ ืคึผืืฉืื ื
ืฆื ืื ืจืขืืืกืืจืืจื ืคึผืจืืืืึทื.ืจืขืืืกืืจื.ืืืื.
ืืืึทื ืคึผืจืื ืฆืืคึผื
ืื ืึทืคึผืจืึธืืืฉืื ืืืึธืก ืึทืจืืขื ืคึฟืึทืจ ืืืจ ืงืขื ืืืื ืึทืจืืขื ืคึฟืึทืจ ืืืจ. ืืื ืืื ืื ืืึธืืืงืข
ืคึผืฉืื ืึผืืืื:
- ืึทืืข ืืืื ืกืืึทืงืก ืคึฟืึทืจ ืคึผืจืึธืืืงืฆืืข, ืึทื ืืืืืงืืื ื (ืึธืืขืจ ืื ืืขืจืข ืื ืืืืืจืึทื ืืึทื ืฅ) ืืขื ืขื ืืืคืืื ื ืืืจื
ืืึธืงืงืขืจ-ืงืึธืืคึผืึธืกืข ืืขืงืขืก - ืงืึธื ืคืืืืจืึทืืืึธื ืืขืงืขืก ืืืจืฃ ืฆื ืืขืงื ืึทืืข ืืืื ืื ืืืืืจืึทื ืืึทื ืฅ, ืืื ืคืื ืืื ืืขืืืขื
ืืืกืืืืื ืืืคึผืืืงืึทืืืึธื. - ืืื ืืึทืจืคึฟื ืืืื ืคึผืฉืื ืืึทืคึฟืขื ืฆื ืึทืจืืขืื ืืื ืืขืืขืจ ืกืืืืืืข.
- ืื ืืืืคึผื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืืืคืืื ื ืืื ืืขืจ ืืขืงืข ืืึธืงืงืขืจ-ืงืึธืืคึผืึธืกืข.ืืื.
- ืกืืืืืืข ืืืขืจืืึทืืึทืื ืืขื ืขื ืืขื ืืฆื ืฆื ืืขืคืื ืืจื ืืืื ืืึทืืก ืึธืืขืจ ืื ืืขืจืข
ืืืขืจืืึทืืึทืื ืืืึธืก ืงืขื ืืืึทืื ืคืื ืกืืืืืืข ืฆื ืกืืืืืืข (ืกืืึทืืื ื, ืื ืึทืืจืืืฉืึทื,
ืคึผืจืึธืืืงืฆืืข). - ืื ืืืึทืืืขืก ืคืื ืคึผืจืึธืืืงืฆืืข ืืืขืจืืึทืืึทืื ืืขื ืขื ืืขื ืืฆื ืืื ืืืึทืืืขืก ืคึฟืึทืจ
ืืืจื ืคืขืืืงืืึทื, ืืึธืก ืืื ืึทืืืืืึทื ืื ืจืืกืงืก ืืืื ืืขืจ ืึธื ืืืืื ืืื ืืึธื ืืฉื ืืื ืคึผืจืึธืืืงืฆืืข ืึธื
ืฉืืขืื ืกืืืืืืข ืืืึทืืขืืืืืง. - ืฆื ืึธื ืืืืื ืึท ืืื ืกื ืืื ืึท ืคึผืจืึธืืืงืฆืืข ืกืืืืืืข, ื ืืฆื ืื ืืึทืคึฟืขื ืืึธืงืงืขืจ ืกืืึทืง ืฆืขืืืืงืืขื - ืงืึทืืคึผืึธืื-ืืขืงืข docker-compose.yml -with-registry-auth ืืืื-ืกืืึทืง-ื ืึธืืขื.
- ืื ืึทืจืืขื ืกืืืืืืข ืืื ืกืืึทืจืืขื ื ืืฆื ืื ืืึทืคึฟืขื ืืึธืงืืขืจ-ืงืึทืืคึผืึธืื ืึทืจืืืฃ-ืื.
ืืื ืก ืงืืง ืืืึท ืึท ืคึผืฉืื ืืืึทืฉืคึผืื.
# 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
...
ืืื ืงืขื ืขื ื ืืฆื ืืึธืงืขืจ-ืงืึธืืคึผืึธืกืข (ืืึธืงืงืขืจ-ืงืึธืืคึผืึธืกืข ืึทืจืืืฃ)ืฆื ืืืืคื ืื ืกืืึทืง ืืื
ืึทื ืืืืืงืืื ื ืืึธืืข ืืื ืืงืืจ ืงืึธื ืืึธืื ืืขื ืืื /project/src.
ืืื ืงืขื ืขื ื ืืฆื ืื ืืขืืืข ืืขืงืขืก ืืื ืคึผืจืึธืืืงืฆืืข! ืืื ืืื ืงืขื ืืืฉืืืื ื ืืฆื
ืืขืืืืงืขืจ ืืขืงืข ืืึธืงืงืขืจ-ืงืึธืืคึผืึธืกืข.ืืื ืคึฟืึทืจ ืกืืึทืืื ื. ืฆื ืืงืกืคึผืึทื ื ืืขื ืฆื
ืคึผืจืึธืืืงืฆืืข, ืืื ื ืึธืจ ืืึทืจืคึฟื ืฆื ืืืืขื ืืื ืฉืืงื ืื ืืืื ืืื ืึท ืคึผืจืขืืขืคืื ืขื ืงืืืืื
ืืื ืื 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
ืืื ืึท ืจืขืืืืืึทื, ืืืจ ืืขืืืืื ื ืฆืืืื ืคืึทืจืฉืืืขื ืข ืืึธืงืงืขืจ-ืงืึธืืคึผืึธืกืข ืืขืงืขืก, ืืืึธืก ืึธื
ืืืคึผืืืงืึทื ืงืึทื ืคืืืืขืจืืืฉืึทื ื ืงืขื ืขื ืืืื ืืขืืืืื ื ืคึฟืึทืจ ืงืืื ืกืืืืืืข ืืืจ ืืึธืื!
ืืขืจื ืขื ืืขืจ ืืืขืื ืืขื ืงืืจืก
ืืงืืจ: www.habr.com