ΠΡΠ΅Π²ΠΎΠ΄ΡΡ Π½Π° ΡΡΠ°Π½ΡΠΊΡΠΈΠΏΡΠΈΡΡΠ° Π½Π° ΠΏΠΎΠ΄ΠΊΠ°ΡΡΠ° Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ Π² Π½Π°Π²Π΅ΡΠ΅ΡΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ°ΡΡΠ° Π½Π° ΠΊΡΡΡΠ°

Docker Compose Π΅ ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»Π΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ½Π°
ΡΡΠ΅Π΄Π° Π·Π° ΡΡΠ΅ΠΊΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π²ΡΠ² Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ΠΎΠΉ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅
Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ»Π΅Π΄Π²Π°ΠΉΠΊΠΈ ΡΡΠ½Π° ΠΈ ΠΏΡΠΎΡΡΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π² .
docker compose v3 ΠΊΠ»ΡΡΡΠ΅Ρ
Docker Swarm .
ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΎΠ½Π½Π° ΡΡΠ΅Π΄Π°? ΠΠ»ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΡΡΠΈΡ ΡΠ°ΠΉΠ» Π·Π°
ΡΡΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³? ΠΠΌΠΈ, ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ β Π΄Π°, Π½ΠΎ Π·Π° ΡΠ°ΠΊΡΠ² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
ΠΠ½ΡΠ΅ΡΠΏΠΎΠ»Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ: ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° Π·Π° Π½ΡΠΊΠΎΠΈ
- ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ Π²ΡΠ² Π²ΡΡΠΊΠ° ΡΡΠ΅Π΄Π°.
ΠΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°: Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π²ΡΠΎΡΠΈ (ΠΈΠ»ΠΈ ΠΊΠΎΠΉΡΠΎ ΠΈ Π΄Π° Π΅ - Π΄ΡΡΠ³ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°Ρ) docker-compose ΡΠ°ΠΉΠ», ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π΅ΡΠΎ ΠΎΡΠ½ΠΎΡΠ½ΠΎ
ΠΏΡΡΠ²ΠΈΡ, Π° docker compose ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ³ΡΠΈΠΆΠΈ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π²Π°ΡΠ° ΡΠ°ΠΉΠ»Π°.
Π Π°Π·Π»ΠΈΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΊΠΎΠ΄Π° Π²
ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅. ΠΠ° ΡΠ΅Π»ΡΠ°, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ, ΡΠΎΠΌ Ρ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡ ΠΊΠΎΠ΄ ΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠ° Π²
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎ Π·Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΎΠ½Π½Π° ΡΡΠ΅Π΄Π°
ΡΠ°ΠΊΡΠ² ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡ.
Π ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΡΠ° ΠΈΠΌΠ°ΡΠ΅ ΠΊΠ»ΡΡΡΠ΅Ρ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΡΠ·Π»ΠΈ, Π° ΡΠΎΠΌ Π΅ Π»ΠΎΠΊΠ°Π»Π΅Π½ ΡΠΏΡΡΠΌΠΎ
Π²ΡΠ·Π΅Π»Π°, Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π²Π°ΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ (ΠΈΠ»ΠΈ ΡΡΠ»ΡΠ³Π°), Π·Π°ΡΠΎΠ²Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅
Π΄Π° ΠΌΠΎΠ½ΡΠΈΡΠ°ΡΠ΅ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡ ΠΊΠΎΠ΄ Π±Π΅Π· ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π²ΠΊΠ»ΡΡΠ²Π°ΡΠΈ
ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ΄Π°, ΡΠΈΠ³Π½Π°Π»ΠΈ ΠΈ Ρ.Π½.
ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΎΠ±ΡΠ°Π· Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° Π²Π°ΡΠΈΡ ΠΊΠΎΠ΄.
Π’ΠΎΠΉ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π²Π° ΡΡΡ ΡΡΠΎΡΠ²Π΅ΡΠ΅Π½ Π΅ΡΠΈΠΊΠ΅Ρ (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ½ΠΎ
Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ Π΄ΡΡΠ³Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎ Π²Π°Ρ ΠΈΠ·Π±ΠΎΡ).
ΠΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°
ΠΠ°ΡΠΎ ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠ°Π·Π»ΠΈΠΊΠΈΡΠ΅ ΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π²ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ Π² ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ΡΠ΅
Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ, ΡΡΠ½ΠΎ Π΅, ΡΠ΅ ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
Docker compose ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ 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 |
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 ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π½Π΅ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ 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 |
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 |
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 build (ΠΈΠ»ΠΈ push) Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° ΠΎΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π°
$MY_SERVICE_VERSION, ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° latest, Π½ΠΎ Π°ΠΊΠΎ Π·Π°Π΄Π°Π΄Π΅ΡΠ΅
ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π½Π° ΠΎΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π° ΠΏΡΠ΅Π΄ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅, ΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅
Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° private.registry.mine.
ΠΠΎΠΈΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ
ΠΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΡΠ΄ΠΎΠ±Π½ΠΈ Π·Π° ΠΌΠ΅Π½, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ°Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΠΈ Π·Π° Π²Π°Ρ. Π‘Π»Π΅Π΄Π²Π°ΠΌ ΡΠ΅Π·ΠΈ
ΠΏΡΠΎΡΡΠΈΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°:
- ΠΡΠΈΡΠΊΠΈΡΠ΅ ΠΌΠΈ ΡΡΠ΅ΠΊΠΎΠ²Π΅ Π·Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° (ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ΅Π΄ΠΈ) ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΡΠ΅Π·
ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ docker-compose. - ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΎΠ±Ρ
Π²Π°ΡΠ°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΌΠΎΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ, ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ
ΠΈΠ·Π±ΡΠ³Π²Π°Ρ Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ΡΠΎ. - ΠΡΠΆΠ΄Π°Ρ ΡΠ΅ ΠΎΡ Π΅Π΄Π½Π° ΠΏΡΠΎΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΡΠ°Π±ΠΎΡΠ° Π²ΡΠ² Π²ΡΡΠΊΠ° ΡΡΠ΅Π΄Π°.
- ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π²ΡΠ² ΡΠ°ΠΉΠ»Π° docker-compose.yml.
- ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π·Π° ΡΡΠ΅Π΄Π°ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠ°Π³ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈΡΠ΅ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈ
ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΎΡ ΡΡΠ΅Π΄Π° Π½Π° ΡΡΠ΅Π΄Π° (ΡΡΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³, ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ,
ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ). - Π‘ΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΊΠ°ΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΠΎ
ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, ΡΠΎΠ²Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠΈΡΠΊΠΎΠ²Π΅ΡΠ΅ ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ΅ΠΊΠ° Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ Π±Π΅Π·
ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½Π°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°. - ΠΠ° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΎΠ½Π½Π° ΡΡΠ΅Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° docker stack deploy --compose-file docker-compose.yml --with-registry-auth my-stack-name.
- Π Π°Π±ΠΎΡΠ½Π°ΡΠ° ΡΡΠ΅Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° docker-compose up -d.
ΠΠ΅ΠΊΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ ΠΏΡΠΎΡΡ ΠΏΡΠΈΠΌΠ΅Ρ.
# 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.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Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ
ΠΌΠ΅ Π΄Π²Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»Π° docker-compose, ΠΊΠΎΠΈΡΠΎ Π±Π΅Π·
Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° Π²ΡΡΠΊΠ° Π²Π°ΡΠ° ΡΡΠ΅Π΄Π°!
ΠΠ°ΡΡΠ΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΊΡΡΡΠ°
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
