ΠΡΠ΅Π²ΠΎΠ΄ Π½Π° ΡΡΠ°Π½ΡΠΊΡΠΈΠΏΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΠΎΠ΄ΠΊΠ°ΡΡ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π° Π²ΠΎ ΠΏΡΠ΅ΡΡΠ΅Ρ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° ΠΊΡΡΡΠΎΡ
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.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.
- ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π½Π° ΠΆΠΈΠ²ΠΎΡΠ½Π°ΡΠ° ΡΡΠ΅Π΄ΠΈΠ½Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π·Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΠ·Π½Π°ΠΊΠΈ Π½Π° ΡΠ»ΠΈΠΊΠΈ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈ
ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π°ΡΠΈΡΠ°Π°Ρ ΠΎΠ΄ ΡΡΠ΅Π΄ΠΈΠ½Π° Π΄ΠΎ ΡΡΠ΅Π΄ΠΈΠ½Π° (ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅, ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ°,
ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ). - ΠΡΠ΅Π΄Π½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΊΠ°ΠΊΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ Π·Π°
ΠΏΠΎ Π΄ΠΈΡΠΎΠ»Ρ, ΠΎΠ²Π° Π³ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠΈΠ·ΠΈΡΠΈΡΠ΅ Π΄ΠΎΠΊΠΎΠ»ΠΊΡ ΠΎΡΠ°ΠΊΠΎΡ ΡΠ΅ Π»Π°Π½ΡΠΈΡΠ° Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ Π±Π΅Π·
ΠΏΠΎΡΡΠ°Π²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ°. - ΠΠ° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΡΡΠ»ΡΠ³Π° Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π° ΡΡΠ΅Π΄ΠΈΠ½Π°, ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° docker stack deploy - compose-file docker-compose.yml -with-registry-auth my-stack-name.
- Π Π°Π±ΠΎΡΠ½Π°ΡΠ° ΡΡΠ΅Π΄ΠΈΠ½Π° ΡΠ΅ ΡΡΠ°ΡΡΡΠ²Π° ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π΄ΠΎΠΊΠ΅Ρ-ΠΊΠΎΠΌΠΏΠΎΠ½ΠΈΡΠ°Ρ -Π.
ΠΡΠ΄Π΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ.
# 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)Π·Π° Π΄Π° Π³ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΌΠ°Π³Π°ΡΠΈΠ½ΠΎΡ
ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π·Π²ΠΎΡ ΡΠΎ ΠΌΠΎΠ½ΡΠΈΡΠ°Π½ ΠΈΠ·Π²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ /ΠΏΡΠΎΠ΅ΠΊΡ/src.
ΠΠΎΠΆΠ°ΠΌ Π΄Π° Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠ°ΠΌ ΠΈΡΡΠΈΡΠ΅ ΠΎΠ²ΠΈΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ! Π Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΠ²Π½ΠΎ ΠΌΠΎΠΆΠ΅Π² Π΄Π° ΠΊΠΎΡΠΈΡΡΠ°ΠΌ
ΠΈΡΡΠ°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° docker-compose.yml Π·Π° ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ°. ΠΠ° Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠΈ ΠΎΠ²Π° Π½Π°
ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ°, ΡΠ°ΠΌΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° ΠΈΠ·Π³ΡΠ°Π΄Π°ΠΌ ΠΈ ΠΈΡΠΏΡΠ°ΡΠ°ΠΌ ΡΠ»ΠΈΠΊΠ°ΡΠ° ΡΠΎ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π° ΠΎΠ·Π½Π°ΠΊΠ°
Π²ΠΎ 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