ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΠΌΠΈ Π²ΡΡΠ°ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Ρ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ°Π·Π²ΡΡΡΠΊΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
- Π·Π°Π³ΡΡΠ·ΠΊΠ° Π½Π° FTP ΡΡΠ΅Π±ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ ΡΠΈΠ» Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ (ΡΠ΅ΠΉΡΠ°Ρ ΠΌΠΎΠ³ΡΡ ΡΠ²ΡΠ·Π°ΡΡ ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΊΡ ΠΈΠ· Π³ΠΈΡΠ° ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ)
- ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡ Π²Π΅ΡΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ΅ΠΌ, ΡΡΠΎ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅
- ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Π½Π° ΡΠ°Π·Π½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ (Π½Π° linux ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ, Π° Π½Π° Π΄ΡΡΠ³ΠΎΠΉ ΡΠΆΠ΅ Π½Π΅Ρ)
- Π΅ΡΠ»ΠΈ ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π΅, ΡΠΎ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½ΠΈΠΊΠ°ΠΊ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ - ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ
- ΠΈΠ· Π²ΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠ½ΠΊΡΠ° ΠΈΠ΄ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° Docker:
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ - ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΡ, ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ
- ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ ΠΈ Π±ΡΡΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΠ°ΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ Π½Π° Π½ΡΠΌ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° - ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΊΠ°ΡΠΈΡΡ image Π΄ΠΎ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ
- ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²Π°ΡΡ ΠΏΠΎΡΡΠ°ΠΌΠΈ
- ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠΎΠΌΡ, ΡΡΠΎ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠ°ΠΊΡΠ΅ΠΌ Π΅Π³ΠΎ Π² ΠΎΠ±ΡΠ°Π·, Π²ΡΠ³ΡΡΠΆΠ°Π΅ΠΌ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ (Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·Π²ΡΡΡΡΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ΄Π°Π»ΡΠ½Π½ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ)
- ΡΠ΄ΠΎΠ±Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ΅ΡΡΡ
- ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΡΠ°ΠΌΠΈ
- ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΡΠ°Π·Π½ΡΡ ΠΌΠ°ΡΠΈΠ½, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΡΠ°Π·Π½ΡΡ ΠΌΠ΅ΡΡΠ°Ρ , ΡΠΎΠ·Π΄Π°Π²Π°Ρ ΠΊΠ»Π°ΡΡΠ΅Ρ
- ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ ΠΏΠΎ API, Π° ΡΠ΅ΡΠ΅Π· Service Discovery, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π³Π΄Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π²Π½ΡΡΡΠΈ DNS
Π§Π°ΡΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌ:
- ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΡ ΡΡ Π·Π°Π΄Π°Ρ
- Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΏΠΎΠ΄Π½ΡΡΠΈΠ΅ΠΌ image Π² Π΄ΠΎΠΊΠ΅ΡΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ, ΡΡΠΎ Π·Π°ΠΌΠ΅Π΄Π»ΡΠ΅Ρ Π΄ΠΎΡΡΠ°Π²ΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½
- ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² - ΠΌΡ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠ°Π·Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, Π³Π΄Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π»ΠΈΠ±ΠΎ Π² ΡΠ°ΠΌΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ , Π»ΠΈΠ±ΠΎ Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ° Π² Π³ΠΎΠ»ΠΎΠ²Π΅
Ansible ΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΡΡΡΠΈΠ½Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Docker ΠΈ ΠΏΠΎΠ΄Π½ΡΡΠΈΠΈ ΠΈΡ image
ΠΠ±Π·ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°
ΠΠ· Π±ΡΠ°ΡΠ·Π΅ΡΠ° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ Π·Π°ΠΏΡΠΎΡ, NGINX Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡ Π·Π°ΠΏΡΠΎΡΡ, API Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° NestJS, APP Π½Π° React, ΠΎΠ±ΠΌΠ΅Π½ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΏΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ΅ΡΠ΅Π· RMQ
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° VM Π½Π° Linux
ΠΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π΄ΠΎΠΊΠ΅ΡΠ° Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π° ΡΠ°ΠΊ ΠΆΠ΅ ΡΠ°Π³Π°Ρ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Docker
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
ΠΠ°Π»Π΅Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΊΠ»ΡΡ Π΄ΠΎΠΊΠ΅ΡΠ°
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
ΠΡΡ ΡΠ°Π· ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΡΡΠΈΠ»ΠΈΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
sudo apt-get update
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΡ Π΄ΠΎΠΊΠ΅ΡΠ°
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΡ Π΄ΠΎΠΊΠ΅ΡΠ°
sudo docker run hello-world
ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π³ΡΡΠΏΠΏΡ Π΄ΠΎΠΊΠ΅ΡΠ°
sudo groupadd docker
Π’ΡΡ ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ΅Π±Ρ Π² Π³ΡΡΠΏΠΏΡ Π΄ΠΎΠΊΠ΅ΡΠ°
sudo usermod -aG docker $USER
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π²ΠΈΡΡΡΠ°Π»ΠΊΠΈ
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ΄Π°Π»ΡΠ½Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ, Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ
- ΠΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ - VirtualBox
- ΠΠ‘ - Ubuntu Server
ΠΠΎΠ΄ Fedora ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
sudo dnf install -y "kernel-devel-$(uname -r)"
sudo /sbin/vboxconfig
sudo rmmod kvm-intel
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° Π²ΠΈΡΡΡΠ°Π»ΠΊΠΈ Ρ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Ρ Π½Π°Ρ ΠΈΠ΄ΡΡ ΡΠ°ΠΌΠ°Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ°, Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ Π²ΡΠ±ΠΎΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ OpenSSH ΠΈ docker.
ΠΠ°Π»Π΅Π΅ Π² VB Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠΊΠΈΠ½ΡΡΡ ΠΏΠΎΡΡΡ Ρ Π½Π°ΡΠ΅ΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ Π½Π° Ρ ΠΎΡΡ: ΠΠ±ΡΠ°Π· β ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β Π‘Π΅ΡΡ β ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ β ΠΡΠΎΠ±ΡΠΎΡ ΠΏΠΎΡΡΠΎΠ² β ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π½ΡΠΆΠ½ΡΠ΅ ΠΏΠΎΡΡΡ
ΠΠ°Π»Π΅Π΅ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π²Ρ ΠΎΠ΄ΠΈΡΡ Π½Π° Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΠΎ Π»ΠΎΠ³ΠΈΠ½Ρ/ΠΏΠ°ΡΠΎΠ»Ρ. ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ Π²Ρ ΠΎΠ΄Π°:
ssh <user>@127.0.0.1 -p 2222
ΠΠ°Π»Π΅Π΅ Π½Π° Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ
cat ~/.ssh/id_ed25519.pub
Π Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊΠ»ΡΡ Π² Π²ΠΈΡΡΡΠ°Π»ΠΊΡ Π² ΡΠ°ΠΉΠ» authorized_keys
. ΠΡΠΎΡ ΡΠ°ΠΉΠ» Ρ
ΡΠ°Π½ΠΈΡ ΠΊΠ»ΡΡΠΈ ΡΡΡΡΠΎΠΉΡΡΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΊ Π½Π΅ΠΌΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΏΠΎ ssh.
mkdir ~/.ssh
cd ~/.ssh
nano authorized_keys
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π²Π²ΠΎΠ΄ΠΈΡΡ Π»ΠΎΠ³/ΠΏΠ°Ρ Π΄Π»Ρ Π²Ρ ΠΎΠ΄Π°.
ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ Docker
002 ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Docker
ΠΠΎΠΊΠ΅Ρ ΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° - ΡΡΠΎ Π΄Π²Π΅ ΡΠ°Π·Π½ΡΠ΅ Π²Π΅ΡΠΈ. ΠΠΎΠΊΠ΅Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠΏΠ΅ΡΠ²ΠΈΠ·ΠΎΡΡ ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΡ Π³ΠΎΡΡΠ΅Π²ΡΡ ΠΠ‘, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄Π½ΡΡΡ Π²Π½ΡΡΡΠΈ Π½Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Π·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
htop
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ Π² linux ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΠΌΠΈ
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π²Π½ΡΡΡΠΈ docker, ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ namespace, ΠΊΠΎΡΠΎΡΡΠΉ Π² ΡΠ΅Π±Ρ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ
- Cgroups - ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°
- IPC - ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ
- Network
- Mount - ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΉ
- PID - ΡΠ²ΠΎΠΈ Process ID
- User
- UTS
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π΄ΠΎΠΊΠ΅ΡΠ° - ΡΡΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ namespace Ρ ΠΎΠ±Π²ΡΠ·ΠΊΠ°ΠΌΠΈ Π΄ΠΎΠΊΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π½Π° Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅
Docker ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΄ΡΠΎ Linux Ρ ΠΎΡΡΠ° ΠΈ image ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠΎΠΊΠ΅Ρ Π΄Π΅Π»ΠΈΡΡΡ Π½Π° Π΄Π²Π΅ ΡΠ°ΡΡΠΈ: ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ°Ρ ΡΠ°ΡΡΡ CLI ΠΈ Ρ ΠΎΡΡΠΎΠ²Π°Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΎΡ CLI ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½ΡΠΆΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
ΠΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ ΠΌΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² Π΄ΠΎΠΊΠ΅Ρ ΠΏΠΎ API, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡ Π² Π΄ΠΎΠΊΠ΅Ρ daemon. Daemon ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Π΅ΡΡΡ Π»ΠΈ Π½ΡΠΆΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π· Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ°Π· ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, ΡΠΎ ΠΎΠ½ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ Π² ΠΎΠ±ΡΠΈΠΉ registry ΠΈ ΠΏΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ°Π· ΠΎΡΡΡΠ΄Π° ΠΈ ΠΏΠΎΡΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
003 Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ
ΠΠ»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π±ΡΠ»ΠΈ Π²ΡΠ½Π΅ΡΠ΅Π½Ρ Π½Π°Π²Π΅ΡΡ
Π²ΠΌΠ΅ΡΡΠΎ
docker container start
docker container stop
docker container stats
ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΈΡΠ°ΡΡ
docker start
docker stop
docker stats
Π£ Π½Π°Ρ Π΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΠΠ¦ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°:
docker run
- ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡ Π΅Π³ΠΎdocker create
- ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π² ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅docker kill / stop
- ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°docker rm
- ΡΠ΄Π°Π»ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ (--force
ΡΠ±ΡΡΡ ΠΈ ΡΠ΄Π°Π»ΠΈΡ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ)
ΠΠ΅ΡΠ²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ. ΠΠ»ΡΡ -a
ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ Π²ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅
docker ps
docker ps -a
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
docker rm ΠΈΠΌΡ/id
Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈΠ· ΠΎΠ±ΡΠ°Π·Π° mongo
, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ my-mongo
. Π€Π»Π°Π³ -d
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΡΠ΅ΠΏΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ bash ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΅Π³ΠΎ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ
docker run --name my-mongo -d mongo
ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ ΡΠΌΠ΅Π½ΠΎΠΉ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΌΡ ΠΏΠΎΡΡΠ»Π°Π΅ΠΌ ΡΠΈΠ³Π½Π°Π»
Π£Π΄Π°Π»ΡΠ΅Ρ Π²ΡΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
docker container prune
ΠΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
docker rename ΠΈΠΌΡ_ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π½ΠΎΠ²ΠΎΠ΅_ΠΈΠΌΡ
004 ΠΠΎΠ³ΠΈ ΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΡ
ΠΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π²ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌ
docker stats
ΠΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ Π½ΡΠΆΠ½ΠΎΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
docker inspect ΠΈΠΌΡ_ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
// ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ, Π²ΠΊΠ»ΡΡΠ°Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ
docker inspect -s ΠΈΠΌΡ_ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
// ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ, ΠΎΠ΄Π½ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ
docker inspect -f "{{.Status.State}}" ΠΈΠΌΡ_ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
ΠΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π²ΡΠ²Π΅ΡΡΠΈ Π»ΠΎΠ³ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
docker logs ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
005 ΠΠΎΠΌΠ°Π½Π΄Ρ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅
ΠΠΎΠΊΠ΅Ρ Π½Π°ΠΌ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²Π½ΡΡΡΠΈ
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
docker exec -e MYVAR=1 mongo printenv
Π ΡΡΡ ΠΌΡ ΡΠΆΠ΅ Π·Π°Π»Π΅Π·Π»ΠΈ Π²Π½ΡΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ Π½ΠΈΠΌ
docker exec -it mongo bash
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠ²ΠΎΠ΄ ΠΈΠ· ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Π²ΡΠ²Π΅ΡΡΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», Π΅ΡΠ»ΠΈ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ
Π’ΡΡ ΡΡΠ°Π·Ρ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΡΠ²ΠΎΠ΄Π° ΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ Π² Π½ΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²Π½Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
docker exec mongo bash -c 'mongo --version > mongo.txt'
Docker image
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ image
Π‘ΠΎΡΡΠ°Π² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΠΊΠ°ΡΠ°Π΅ΠΌ ΠΎΠ±ΡΠ°Π· nginx Ρ docker hub Ρ ΠΏΠΎΠΌΠΎΡΡΡ docker daemon
docker pull nginx
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, Π΄ΠΎΠΊΠ΅Ρ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ Π½Π΅ ΡΠ΅Π»ΠΈΠΊΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π·, Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ»ΠΎΠΈ (aka layers, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΡΡΠΎΠΈΡ ΠΎΠ±ΡΠ°Π·). ΠΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ°Π· ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π½Π° Π΄ΠΈΡΠΊΠ΅.
ΠΠΎ-ΡΠ°ΠΊΡΡ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»ΠΎΠΉ - ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π·, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° Read (ΡΡΠ΅Π½ΠΈΠ΅). ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈΠ· image, Ρ Π½Π°Ρ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΡΠΎΠ½ΠΊΠΈΠΉ ΡΠ»ΠΎΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (ReadWrite).
ΠΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Ρ ΠΌΡ Π½Π΅ Π·Π°ΠΏΡΡΡΠΈΠ»ΠΈ ΡΠ°Π·Π½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, image, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ) nginx Π±ΡΠ΄Π΅Ρ Π±Π°Π·ΠΈΡΠΎΠ²Π°ΡΡΡΡ, ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π° ΠΎΠ΄ΠΈΠ½.
ΠΠ½ΡΡΡΡΠ½ΠΊΠ° image
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² Π΄ΠΎΠΊΠ΅ΡΠ΅.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
docker images
Π§ΡΠΎΠ±Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π°ΡΡ ΠΈΠ² Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ
Π‘ΡΠ°Π·Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ° Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈ Π² Π½Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
docker save --output nginx.tar nginx
mkdir nginx
tar xvf nginx.tar -C nginx
ΠΡ ΠΈ Π² ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ»ΠΎΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
Π‘ΡΡΡΠΊΡΡΡΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»ΠΎΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΠ°ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ layer - ΡΡΠΎ ΡΠΎΠΆΠ΅ image, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
Π’Π°ΠΊΠ°Ρ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ².
Π’Π°ΠΊ ΠΆΠ΅ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΡΠ»ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ ΠΈ Π²Π½ΡΡΡΠ΅Π½Π½ΠΎΡΡΡ Π΅Π³ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠ²Π΅ΡΡΠΈ ΠΈΡΡΠΎΡΠΈΡ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ Π±ΡΠ» ΡΠΎΠ±ΡΠ°Π½ ΡΠΎΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ image. ΠΡΡΠΎΡΠΈΡ ΡΠ½ΠΈΠ·Ρ Π²Π²Π΅ΡΡ ΠΈΠ΄ΡΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠ±ΠΎΡΠΊΠΈ
docker history <package>
ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΌΡ Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌ Π½Π° Π΄ΠΈΡΠΊΠ΅ ΠΌΠ΅ΡΡΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ. Π£ Π½Π°Ρ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ Π²Π΅ΡΡ Π½ΠΈΠ΅ ΡΠ»ΠΎΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ²ΠΎΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΠΏΠ°ΠΊΠ΅ΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ, Π° ΡΠ°ΠΊ ΠΆΠ΅ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΎΠ±ΡΠΈΠ΅ ΡΠ»ΠΎΠΈ.
/var/lib/docker/overlay2
- ΡΡΠΎ Π³ΡΡΠΏΠΏΠ° ΡΠ»ΠΎΡΠ² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΌΡΡΠ΄ΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² ΠΎΠ΄Π½Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΠ°Π·Π½ΡΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°Ρ
. Π‘Π°ΠΌΠ° ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΎΠ½Π° Π²Π΅ΡΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ»ΠΎΡΠ½ΡΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ
/var/lib/docker/containers
- ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ±ΡΠ°Π·Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΡΠ»ΡΠ½ΡΠ»ΠΈ ΠΈΠ· Ρ
Π°Π±Π°. Π‘Π΅ΠΉΡΠ°Ρ ΡΡΡ 54 ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡΠ° nginx
sudo du -sh /var/lib/docker/overlay2
sudo ls /var/lib/docker/overlay2
ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ Π½Π° Π±Π°Π·Π΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ nginx Π²ΡΠΎΡΠΎΠΉ Π²Π΅ΡΡ Π½ΠΈΠΉ ΡΠ»ΠΎΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π½Π΅ ΡΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°
Π’ΠΎ Π΅ΡΡΡ ΠΏΡΠΎΡΠ»ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π½ΠΎΠ²ΠΎΠ΅ Ρ 56ΠΊΠ± Π½Π°ΡΠ°Π»ΠΈ Π²Π΅ΡΠΈΡΡ 120ΠΊΠ±
docker run -d --name nginx2 nginx
ΠΠ΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ²Π΅ΡΠ»Π΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ:
- ΠΠΈΠΆΠ½ΠΈΠΉ ΡΠ»ΠΎΠΉ
- link - ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΠ»ΠΎΠΉ
- diff - ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π·Π°
- ΠΠ΅ΡΡ
Π½ΠΈΠΉ ΡΠ»ΠΎΠΉ
- lower - ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΠ»ΠΎΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΠ½ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°ΠΌ Π»Π΅ΠΆΠΈΡ
- link - ΡΡΡΠ»ΠΊΠ° Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π½Π° ΡΡΠΎΡ ΡΠ»ΠΎΠΉ ΠΌΠΎΠ³ ΡΡΡΠ»Π°ΡΡΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ»ΠΎΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π²ΡΡΠ΅
- diff - ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ°Π·Π½ΠΈΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΠ»ΠΎΠ³ΠΎ ΡΠ»ΠΎΡ
- merged - ΡΠ»ΠΈΡΡΠΉ diff Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ (diff ΠΈΠ· Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΈ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΠ»ΠΎΡ). ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΏΠΎΠΊ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π·
- work - ΠΏΠ°ΠΏΠΊΠ° Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΠΎΠ²Π΅ΡΠ»Π΅Ρ
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΡΠ΅ ΡΡΠΈ ΠΏΠ°ΠΏΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ²Π΅ΡΡΠΈ ΠΈΠ· ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
Π Π°Π½ΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ OverlayFS1 (ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ°Ρ, ΠΌΠ΅Π½Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ Π²Π΅ΡΡΠΈΡ) ΠΈ AUFS (ΡΡΠΎΡ Π±ΡΠ» ΡΡΡΡΠΎΠ΅Π½ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ» Π²ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, Ρ ΠΎΡΡ ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅)
002 Π Π°Π±ΠΎΡΠ° Ρ image
ΠΠΎΠΌΠ°Π½Π΄Ρ docker image
:
history
- Π²ΡΠ²Π΅Π΄Π΅Ρ ΠΈΡΡΠΎΡΠΈΡ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌΡ image ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ°Π·Π°
inspect
- Π²ΡΠ²Π΅Π΄Π΅Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΡΠΏΠ΅ΠΊΡ ΠΏΠΎ image.
LowerDir
- Ρ
ΡΠ°Π½ΠΈΡ Π΄ΠΈΡΡ (blobβΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
ΡΠ»ΠΎΡΠ²)
MergedDir
- ΠΌΡΡΠ΄ΠΆ Π²ΡΠ΅Ρ
ΡΠ»ΠΎΡΠ² Ρ FS ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
UpperDir
- Π΄ΠΈΡΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
WorkDir
- Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ°Ρ Π΄Π»Ρ OverlayFS Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ
import
- ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΡΠΊΠ°ΠΌΠΈ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ image (Π½ΡΠΆΠ½ΠΎ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌ, Ρ ΠΊΠΎΡΠΎΡΡΡ Π½Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΡ)pull
- Π½Π°Ρ ΠΎΠ΄ΠΈΡ registry Ρ Π½ΡΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ dockerpush
- ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π·Π°ΠΏΡΡΠΈΡΡ ΡΠΎΠ±ΡΠ°Π½Π½ΡΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ image Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΌ Π΅Π³ΠΎ ΡΠΊΠ°ΡΠ°ΡΡls
- Π²ΡΠ²Π΅Π΄Π΅Ρ Π²ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. Π’Π°ΠΊ ΠΆΠ΅ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π°Π³ΠΈ:--format {{.Tag}}
, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ²Π΅Π΄Π΅Ρ ΡΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ--filter "before=node"
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΡΠΈΠ»ΡΡΡΡΠ΅Ρ ΠΏΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ (ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ΄ΡΡ Π΄ΠΎ Π½ΠΎΠ΄Ρ)
rm <image name/id>
- ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ΄Π°Π»ΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ image
ΠΡΠ»ΠΈ Π² ΡΠ΄Π°Π»ΡΠ΅ΠΌΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ»ΠΎΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² Π΄ΡΡΠ³ΠΈΡ
ΠΎΠ±ΡΠ°Π·Π°Ρ
, ΡΠΎ Π΄ΠΎΠΊΠ΅Ρ Π½Π°Ρ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅Π΄ΠΈΡ ΠΈ Π΄Π°ΡΡ ΡΠ΄Π°Π»ΠΈΡΡ image ΡΠΎΠ»ΡΠΊΠΎ Ρ --force
ΡΠ»Π°Π³ΠΎΠΌ Π»ΠΈΠ±ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ Π²ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΡΡΠΎΡ image
Π’Π°ΠΊ ΠΆΠ΅ ΡΠ°ΡΡΡΠΌ Π±ΡΠ²Π°Π΅Ρ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π²ΡΡΡΠ΅ΡΠ°Π΅ΠΌΡΡ Ρ dangling image
- ΡΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· ΡΡΠ³Π°. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ΅Π³ ΠΎΠ΄Π½ΠΎΠ³ΠΎ image Π½Π° Π΄ΡΡΠ³ΠΎΠΉ.
Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
prune
- ΠΎΡΠΈΡΡΠΈΡ Π²ΡΠ΅ image Π±Π΅Π· ΡΡΠ³ΠΎΠ²
003 Dockerfile
Π‘Π°ΠΌ ΡΠ°ΠΉΠ»
Dockerfile ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ· ΡΠ΅Π±Ρ ΡΠ°ΠΉΠ» Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌΠΈ Π΄ΠΎΠΊΠ΅ΡΡ, ΡΡΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π· Ρ Π½Π°ΡΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.
Π‘ΡΠ°Π·Ρ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ Π½ΠΎΠ²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° - ΡΡΠΎ ΡΠ»ΠΎΠΉ. Π‘ΡΠΎΠΈΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΡΡΠΎΠ±Ρ ΡΡΠΈΡ ΡΠ»ΠΎΡΠ² Π±ΡΠ»ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ. Π‘Π°ΠΌ Π΄ΠΎΠΊΠ΅Ρ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π² 127 ΡΡΡΠΎΠΊ Π² ΡΠ²ΠΎΡΠΌ ΡΠ°ΠΉΠ»Π΅. ΠΠ±Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΡΠΎ multistaged Π±ΠΈΠ»Π΄Π°ΠΌΠΈ.
ΠΠΎΠ½ΡΠ΅ΠΊΡΡ ΡΠ±ΠΎΡΠΊΠΈ
ΠΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ, ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ ΡΠ±ΠΎΡΠΊΠΈ. ΠΠΎΠ½ΡΠ΅ΠΊΡΡ ΡΠ±ΠΎΡΠΊΠΈ - ΡΡΠΎ Π½Π°Π±ΠΎΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ±ΠΎΡΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ. ΠΠΎΠ³Π΄Π° Π±ΠΈΠ»Π΄ ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, ΡΠΎ ΠΎΠ½ ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ Π²ΡΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½Ρ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π‘Π°ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΠΎΠ΄Π½ΡΡΡ Π½Π΅Π»ΡΠ·Ρ. ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΡΠ°ΠΉΠ» ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ Π²Π²Π΅ΡΡ , ΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄Π½ΡΡΡΡΡ ΠΏΠΎ ΠΏΡΡΠΈ ΡΠ°ΠΌΠΎΠ³ΠΎ Π±ΠΈΠ»Π΄Π° Π½Π° ΠΏΠ°ΠΏΠΊΡ Π²ΡΡΠ΅.
.dockerignore
ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ΄Π°Π»ΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°.
ΠΠΎΠΌΠ°Π½Π΄Ρ
ARG
- Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ - ΡΡΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅. ΠΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΊΠ°ΠΊ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΎ ΡΠ²ΠΎΠΈΠΌ Π·Π½Π°ΡΠ΅Π½Π½ΠΈΠ΅ΠΌ, ΡΠ°ΠΊ ΠΈ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ ΠΈΠ· Π²Π½Π΅ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρdocker build --build-arg
. ΠΡΠΎΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ Π½ΡΠΆΠ΅Π½, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π±ΠΈΠ»Π΄Π°, Π½ΠΎ Π½Π΅ ΠΏΠΎΠΏΠ°Π»ΠΎ Π½Π° ΠΏΡΠΎΠ΄FROM
- ΡΡΠΎ ΡΡΠ°ΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π·Π°. ΠΡΠ΅Π³Π΄Π° ΠΈ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ Π±Π°Π·ΠΈΡΡΡΡΡΡ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³ΠΎΠΌ ΠΎΠ±ΡΠ°Π·Π΅. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ°Π· Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½ΠΈ Π½Π° ΡΡΠΌ Π±Π°Π·ΠΈΡΠΎΠ²Π°ΡΡ, ΡΠΎ ΠΌΡ Π΅Π³ΠΎ Π±Π°Π·ΠΈΡΡΠ΅ΠΌ Π½Π°scratch
. Π’Π°ΠΊ ΠΆΠ΅ ΡΠ΅ΡΠ΅Π·as
ΠΌΡ Π·Π°Π΄Π°ΡΠΌ alias Π΄Π»Ρ Π±ΠΈΠ»Π΄Π°, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π²Π½ΡΡΡΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π±ΠΈΠ»Π΄Π°ONBUILD
- ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΄ΡΡΠ³ΠΎΠΉ image Π±Π°Π·ΠΈΡΡΠ΅ΡΡΡ Π½Π° ΡΡΠΎΠΌ image, ΡΠΎ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π±ΠΈΠ»Π΄Π° Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡLABEL
- Ρ ΡΠ°Π½ΠΈΡ Π² ΡΠ΅Π±Π΅ ΠΌΠ΅ΡΠ°-ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΎΠ±ΡΠ°Π·Π΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π²Π΅ΡΡΠΈΡ, Π°Π²ΡΠΎΡΠ°, ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅USER
- ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΡWORKDIR
- ΡΠ°Π±ΠΎΡΠ°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΡADD
- Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ°ΠΉΠ»Ρ Ρ Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ Π² ΠΎΠ±ΡΠ°Π·. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ°ΠΊ ΠΆΠ΅ ΡΠΌΠ΅Π΅Ρ Π² ΠΏΠΎΠ±ΠΎΡΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π² Π²ΠΈΠ΄Π΅ ΡΠ°Π·Π°ΡΡ ΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΏΠ°ΠΏΠΊΡ ΠΈ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° ΠΏΠΎ ΡΡΠ»ΡCOPY
- ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠ°ΠΉΠ»Ρ Π² ΠΎΠ±ΡΠ°Π·. ΠΠ· ΠΏΠΎΠ±ΠΎΡΠ½ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΎΠ½ ΡΠΌΠ΅Π΅Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ ΠΈΠ· ΠΏΡΠΎΡΠ»ΡΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² Π²ΠΎ Π²ΡΠ΅ΠΌΡ multistage-ΡΠ±ΠΎΡΠΊΠΈ
SHELL
- ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π½ΡΠΆΠ½ΠΎΠ³ΠΎ Π½Π°ΠΌ shellRUN
- Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ. Π‘Π°ΠΌΠ°Ρ ΡΠ°ΡΡΠ°Ρ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°. ΠΠ»Ρ ΠΏΠΎΠ΄Π½ΡΡΠΈΡ ΠΈ ΡΠ±ΠΎΡΠΊΠΈ Π±ΠΈΠ»Π΄Π°ENV
- ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ. Π§ΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ$ΠΠΠ ΠΠΠΠΠΠΠ―
. ΠΠ½Π° Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊ ΠΆΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ ΠΈ Π² ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌ ΠΎΠ±ΡΠ°Π·Π΅, ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΡΠ°Π½ΠΈΡΡ Π² Π½Π΅ΠΉ ΡΠ΅ΠΊΡΠ΅ΡΡ ΠΈ ΡΠΎΠΊΠ΅Π½Ρ - Π½Π΅ΡΠ΅ΠΊΡΡΡΠ½ΠΎ. Π§ΡΠΎΠ±Ρ Π½Π΅ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΈΡΠ°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡRUN VAR=data
.VOLUME
-ENTRYPOINT
- ΡΡΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡCMD
- ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ ΠΏΡΠΎΡΠ»Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π½ΠΎβ¦STOPSIGNAL
- Π²ΡΠ·ΠΎΠ² ΡΡΠΎΠΏΡΠΈΠ³Π½Π°Π»Π° Π΄Π»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°EXPOSE
- ΡΡΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΡ ΠΌΡ ΠΏΡΠΎΠΊΠΈΠ½ΡΠ»ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ½Π°ΡΡΠΆΠΈ Π²Π½Π΅ Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. Π‘Π°ΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡΠΎΠ±ΡΠΎΡΠΎΠΌ ΠΏΠΎΡΡΠΎΠ² Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ.#
- ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π²Π½ΡΡΡΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠ΄Π° Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΠ°ΡΡΠ΅ΡΠ° ΠΏΠΎ ΡΠΎΠΌΡ ΠΆΠ΅ ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
CMD
ΠΈ ENTRYPOINT
Π²Π»ΡΡΡ Π΄ΡΡΠ³ Π½Π° Π΄ΡΡΠ³Π° ΠΈ Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ Π² ΡΠ°Π·Π½ΡΡ
ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²Π°Ρ
. ΠΡΠ»ΠΈ Π½Π΅Ρ Π½ΠΈΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ
, ΡΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ. ΠΡΠ»ΠΈ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ cmd, ΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ. ΠΡΠ»ΠΈ ΠΌΡ Π·Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ½ΡΡΠΈΠΏΠΎΠΈΠ½Ρ Π² Π²ΠΈΠ΄Π΅ ΡΡΡΠΎΠΊΠΈ, ΡΠΎ ΠΎΠ½ ΠΏΠΎΠΊΡΠΎΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ cmd ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΡΠΎΠΊΠΎΠΉ. ΠΡΠ»ΠΈ ΡΠ½ΡΡΠΈ ΠΌΠ°ΡΡΠΈΠ², Π° cmd ΡΡΡΠΎΠΊΠ°, ΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ ΠΎΠ±Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ ΡΡΡΠΈ ΠΌΠ°ΡΡΠΈΠ² ΠΈ cmd ΠΌΠ°ΡΡΠΈΠ², ΡΠΎ cmd Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΠΈΠ· ΡΠ΅Π±Ρ ΠΏΡΠΎΡΡΠΎ ΡΡΠΎΡΠ½ΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ entry.
004 Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ²ΠΎΠΉ image
ΠΠΎΠΌΠ°Π½Π΄Π° docker build
ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ Π½Π°ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
Π ΠΎΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»Π°Π³ΠΎΠ²:
-q
- ΠΏΠΎΠ΄Π°Π²Π»ΡΠ΅Ρ Π²ΡΠ²ΠΎΠ΄ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄ΠΎΠΊΠ΅ΡΠΎΠΌ-f
- ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΡΡ Π΄ΠΎ Dockerfile. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ, Π±ΠΈΠ»Π΄ ΠΈΡΠ΅Ρ ΡΡΠΎΡ ΡΠ°ΠΉΠ» Π² ΠΊΠΎΡΠ½Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, Π½ΠΎ Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ, ΡΠΎ Π²ΡΠ»Π΅Π·Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°ΠΌ ΠΈ Π½ΡΠΆΠ½ΠΎ-t
- ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ ΡΡΠ³ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π·Π°
ΠΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΡΠΎ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ Π±ΡΠΊΡΠ½Π΄ΠΎΠΌ (api
) ΠΈ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ΠΎΠΌ (app
).
ΠΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎΠΉ Π΄ΠΎΠΊΠ΅ΡΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΠΎΠ΄Π½ΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΠ°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΎΠ±ΡΠ°Π· 14 Π½ΠΎΠ΄Ρ, ΡΠΊΠ°ΠΆΠ΅ΠΌ ΡΠ°Π±ΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΊΠ°ΠΊ /opt/app
, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠ΄Π° Π²Π΅ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π²ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ, ΡΠ±ΠΈΠ»Π΄ΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡ, Π·Π°ΠΏΡΡΡΠΈΠΌ Π΅Π³ΠΎ ΡΠ΅ΡΠ΅Π· node
apps / api / Dockerfile
FROM node:14
WORKDIR /opt/app
ADD . .
RUN npm i
RUN npm run build api
CMD ["node", "./dist/apps/api/main.js"]
Π ΡΡΡ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΠ΄Π΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΡΡ Π΄ΠΎ Dockerfile, ΡΠΊΠ°Π·Π°ΡΡ ΡΠ΅Π³, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΠΎΡΠ΅ΡΡΡΡ ΠΎΠ±ΡΠ°Π· ΠΈ ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ .
, ΡΡΠΎΠ±Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ Π²ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ
docker build -f ./apps/api/Dockerfile -t test:latest .
ΠΠ°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π½ΡΡΡ Π½Π°Ρ ΠΎΠ±ΡΠ°Π· Ρ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΡΡΠ΅ΠΏΠ»ΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΡ ΠΎΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ΅ΡΡΠΈΠΈ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°, ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΈΠΌΡ ΠΎΠ±ΡΠ°Π·Π°, ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ΅Π³ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΌΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ»ΠΈΡΡ.
docker run -d --name api test:latest
005 Π£Π»ΡΡΡΠ°Π΅ΠΌ ΡΠ±ΠΎΡΠΊΡ
Π‘Π°ΠΌ ΠΎΠ±ΡΠ°Π· ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ, ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ, Π½ΠΎ Π²Π΅Ρ Π΄Π»Ρ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° - ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ.
ΠΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²Π΅Ρ ΠΎΠ±ΡΠ°Π·Π° Π·Π° ΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ»ΠΎΡΠ².
Π‘Π΅ΠΉΡΠ°Ρ Ρ Π½Π°Ρ ΡΠ°ΠΊΠ°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ. ΠΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠ΅, Ρ Π½Π°Ρ ΠΎΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π·Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΠ½Π΄ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠ°ΠΏΠΎΠ².
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΊΠΎΠ΄, ΡΠΎ Ρ Π½Π°Ρ ΡΠ»Π΅ΡΠΈΡ ΠΊΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΈ ΠΈΡ ΠΏΡΠΈΠ΄ΡΡΡΡ ΡΡΠ°Π²ΠΈΡΡ Π² ΠΏΡΠΎΠ΅ΠΊΡ Π·Π°Π½ΠΎΠ²ΠΎ.
ΠΠΎΠ΄ Ρ Π½Π°Ρ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠ°ΡΠ΅, ΡΠ΅ΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊ ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅.
ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ package.json
, Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, Π° ΡΠΆΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ. Π’Π°ΠΊ ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Π»ΡΠ³ΠΊΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ Π½ΠΎΠ΄Ρ Π±ΡΠ΄Π΅Ρ ΡΠ²Π»ΡΡΡΡΡ Π½Π΅ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠΌ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π΅, Π° alpine, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π΅ΡΠΈΡ ΠΌΠ΅Π½Π΅Π΅ 100 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ. ΠΠ½ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
FROM node:14-alpine3.10
WORKDIR /opt/app
ADD *.json ./
RUN npm i
ADD . .
RUN npm run build api
CMD ["node", "./dist/apps/api/main.js"]
Π ΡΠ΅ΠΏΠ΅ΡΡ Π½Π°ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π»ΠΎ Π²Π΅ΡΠΈΡΡ Π² Π΄Π²Π° ΡΠ°Π·Π° ΠΌΠ΅Π½ΡΡΠ΅ ΠΏΡΠΈ ΡΠ΅Ρ ΠΆΠ΅ Π²Π²ΠΎΠ΄Π½ΡΡ , Π° ΡΠ°ΠΊ ΠΆΠ΅ Ρ Π½Π°Ρ Π·Π°ΠΊΡΡΠΈΡΠΎΠ²Π°Π»ΠΈΡΡ Π²ΡΠ΅ ΡΠ°Π³ΠΈ Π΄ΠΎ Π±ΠΈΠ»Π΄Π°, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΡΡΠ°ΠΏ Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
006 ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ image
ΠΠ»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠΈΠ»ΠΈΡΠΎΠΉ dive, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π»Π΅Π·ΡΡ Π²Π½ΡΡΡΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΡΠ±ΠΎΡΠΊΠΈ.
ΠΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·ΡΠΌΡΡ Π½Π°Ρ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· ΠΈ ΠΏΠΎΡΡΡΠΎΠΈΡ ΠΏΠΎ Π΅Π³ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π³ΡΠ°Ρ
dive test:latest
Π’ΡΡ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠ»ΠΎΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Image Details, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΅ΡΡΡ ΠΎΠ±ΡΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ°Π·Π°
ΠΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π³ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎ Π½ΠΎΠ²ΡΡ ΡΠ°ΠΉΠ»Π°Ρ
Π’Π°ΠΊ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°Π³Π° ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π»Ρ ΡΠ΅Π±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ»ΠΎΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ ΠΈ ΡΡΠ΅Π·Π°Π½Ρ ΠΎΡ Π»ΠΈΡΠ½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²
007 ΠΠ½ΠΎΠ³ΠΎΡΡΠ°ΠΏΠ½Π°Ρ ΡΠ±ΠΎΡΠΊΠ°
ΠΠ½ΠΎΠ³ΠΎΡΡΠ°ΠΏΠ½Π°Ρ ΡΠ±ΠΎΡΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΠΎΠ±ΡΠ°ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ Dockerfile ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠ².
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠ»ΡΡΡ:
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΆΠ°ΡΡΠΉ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ Π±ΠΈΠ»Π΄
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΊΡΡΡΡ ΡΠ΅ΠΊΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠ°ΠΏΠ΅, Π½ΠΎ Π½Π° Π²ΡΠΎΡΠΎΠΌ ΠΈΡ ΡΠΆΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ
ΠΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ ΠΌΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π·, ΠΊΠΎΡΠΎΡΡΠΉ Π² ΡΠ΅Π±Π΅ ΡΠΎΠ±Π΅ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΠΎΠ±ΡΠ°Π·Π΅ ΠΌΡ Π²ΠΎΠ·ΡΠΌΡΠΌ ΡΠΎΠ±ΡΠ°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· --from=<Π°Π»ΠΈΠ°Ρ_ΡΠ±ΠΎΡΠΊΠΈ>
ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ prod-Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
Π’Π°ΠΊ ΠΆΠ΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ COPY
ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΡΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
FROM node:14-alpine3.10 as build
WORKDIR /opt/app
ADD *.json ./
RUN npm i
ADD . .
RUN npm run build api
FROM node:14-alpine3.10
WORKDIR /opt/app
ADD package.json ./
RUN npm i --only=prod
COPY --from=build /opt/app/dist/apps/api ./dist
CMD ["node", "./dist/main.js"]
008 Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ - Π‘Π±ΠΎΡΠΊΠ° go ΠΏΡΠΎΠ΅ΠΊΡΠ°
Π‘Π΅ΠΉΡΠ°Ρ Π·Π°Π²Π΅ΡΠ½ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Go, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠ²ΠΎΡΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌ ΠΏΠΎΡΡΡ
go.mod
module docker-demo-2
go 1.15
main.go
package main
import (
"fmt"
"net/http"
)
func main() {
fmt.Print("Go ΠΏΡΠΎΠ΅ΠΊΡ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠΉ Π² Docker ΡΠ»ΡΡΠ°Π΅Ρ Π½Π° 9000 ΠΏΠΎΡΡΡ")
handler := HttpHandler{}
http.ListenAndServe(":9000", handler)
}
type HttpHandler struct{}
func (h HttpHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
data := []byte("Hello World!")
res.Write(data)
}
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΡΡΠΎ ΡΠΎΠ±Π΅ΡΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
brew install go
go build
./docker-demo-2
ΠΠ°Π»Π΅Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π² Π΄ΠΎΠΊΠ΅Ρ, ΡΠ°ΠΌ ΡΠΎΠ±ΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ golang:alpine
ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Π΄Π»Ρ ΠΏΠΎΠ΄Π½ΡΡΠΈΡ ΠΎΠ±ΡΠ°Π·Π° ΠΈ ΡΠΆΠ΅ Π²Π½ΡΡΡΠΈ Π½Π΅Ρ ΡΠΎΠ±Π΅ΡΡΠΌ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ. Π‘Π°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΠΎΠ΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π½ΠΈΡΠ΅Π³ΠΎ ΡΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π±ΠΈΠ»Π΄ ΠΌΡ ΡΠΎΠ±Π΅ΡΡΠΌ ΠΈΠ· scratch
ΠΈ Π² Π½ΡΠΌ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΡΡΡΠΈΠΌ Π½Π°Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ
FROM golang:alpine as build
WORKDIR /go/bin
ADD . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
FROM scratch
COPY --from=build ./go/bin/docker-demo-2 ./go/bin/docker-demo-2
ENTRYPOINT ["./go/bin/docker-demo-2"]
EXPOSE 9000
ΠΠ°Π»Π΅Π΅ ΠΎΡΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ±ΠΈΠ»Π΄ΠΈΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΎΠ±ΡΠ°Π·
docker build -t go-api:latest .
docker run --name go-api-demo -d go-api
Π‘Π΅ΡΠΈ Docker
bridge host null dockernetwork
Π£ΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΡΠ΅ΡΠΈ Docker
ΠΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΌΠΈ Π² Π΄ΠΎΠΊΠ΅ΡΠ΅ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Libnetwork. ΠΠ½Π° ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΠΎΠΌ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ Π² Linux Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΡΡΠΌΠΈ Π²Π½ΡΡΡΠΈ Π½Π΅Π³ΠΎ.
- ΠΠ½Π° ΡΡΠΈΠ»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡΡ ΡΠ΅ΡΠΈ
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠΎΡΡΡ Π΄Π»Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π° Ρ Π΄ΡΡΠ³ΠΈΠΌ
- Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
- ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ iptables
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΏΡΠΈ ΠΏΠΎΠ΄Π½ΡΡΠΈΠΈ, ΡΠΎΠ·Π΄Π°ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-Π°Π΄Π°ΠΏΡΠ΅Ρ. ΠΡΠΎΡ Π°Π΄Π°ΠΏΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΌΡ ΠΌΠΎΡΡΡ ΠΈ ΡΠΆΠ΅ ΡΠ°ΠΌ ΠΌΠΎΡΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ. Π§Π΅ΡΠ΅Π· ΠΌΠΎΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΌΠΎΠ³ΡΡ ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ ΠΎΡΡΠ°.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π³ΠΈΠ±ΠΊΠ°Ρ, ΡΠΎ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠΈ.
bridge
- ΠΈΠ·ΠΎΠ»ΠΈΡΡΠ΅Ρ ΡΠ΅ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ΅ΠΌΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈhost
- ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ Ρ ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ»ΠΎΡΠ²overlay
- ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Ρ ΠΎΡΡ-ΠΌΠ°ΡΠΈΠ½ Π² ΠΎΠ΄Π½Ρ ΡΠ΅ΡΡ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²macvlan
- ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΡΠΎ ΡΠ²ΠΎΠΈΠΌ mac (ΡΠΈΠ»ΡΠ½ΠΎ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΠ΅ΡΡΠΎΠΌΠ°Π½Ρ ΡΠ΅ΡΠΈ)null
- Π½Π΅ Π΄Π°ΡΡ ΡΠ΅ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
Π£ΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ°ΠΌΡΠΌΠΈ Π±Π°Π·ΠΎΠ²ΡΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ
connect
create
- ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΡΡ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌΡ ΡΠΈΠΏΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°disconnect
inspect
ls
- ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠ΅ΡΠΈrm
- ΡΠ΄Π°Π»ΡΠ΅Ρ ΡΠ΅ΡΡprune
- ΡΠ΄Π°Π»ΡΠ΅Ρ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅
ΠΡΠ²Π΅Π΄Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠ΅ΡΠ΅ΠΉ Π΄ΠΎΠΊΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°Π½Ρ ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
docker network ls
ΠΡ ΠΈ Π΄Π°Π»Π΅Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΡ
scope
- ΡΠ΅ΠΊΡΡΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ ΡΠ΅ΡΠΈ (Π»ΠΎΠΊΠ°Π»ΡΠ½Π°Ρ, ΡΠ΄Π°Π»ΡΠ½Π½Π°Ρ)driver
- ΡΠ΅ΠΊΡΡΠΈΠΉ Π΄ΡΠ°ΠΉΠ²Π΅ΡEnableIPv6
- ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ipv6 Π½Π° ΡΠ΅ΡΡIPAM
- Ρ ΡΠ°Π½ΠΈΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ΄ΡΠ΅ΡΠ΅ΠΉ ΠΈ ΠΈΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²Containers
- Ρ ΡΠ°Π½ΠΈΡ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Ρ ΠΊ ΡΡΠΎΠΉ ΡΠ΅ΡΠΈ. ΠΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π²Π½ΡΡΡΠΈIPv4Address
ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΠ½Π³Π°Π½ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
docker network inspect bridge
[
{
"Name": "bridge",
"Id": "ad9007015b1d9bf9dfd4bddf86c95e3ea89d007de5863818083177ae8ded1288",
"Created": "2024-08-21T18:55:22.413658685+03:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"623903f47a64bf7c3add8bad48d8cbfcfdcfcb73a5fa9262da787e137ddafcc3": {
"Name": "xenodochial_ptolemy",
"EndpointID": "b77ee64683f51c83a6249fd2258321607ca632e10c91e21edf9ae054a56b005c",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
ΠΡΠ°ΠΉΠ²Π΅Ρ bridge
Bridge ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π² ΠΎΠ΄Π½Ρ ΡΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ ΠΎΡΡΠ°.
- ΠΡΠ΅Π½Ρ ΠΏΡΠΎΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
- ΠΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ service discovery (ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ)
- ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ Ρ ΠΎΡΡ-ΠΌΠ°ΡΠΈΠ½Π΅
ΠΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡ ΡΡΠΎΠ½Ρ+Π±ΡΠΊ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΠΈ Π½Π° ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π°Ρ , Π³Π΄Π΅ ΠΎΠ΄ΠΈΠ½ Ρ ΠΎΡΡ.
Π‘Ρ Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΡ
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ ΠΌΠΎΡΡΠΎΠ²ΠΎΠΉ ΡΠ΅ΡΠΈ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉ ip. Π ΡΠΆΠ΅ ΡΠ°ΠΌΠ° ΠΌΠΎΡΡΠΎΠ²Π°Ρ ΡΠ΅ΡΡ ΡΠΌΠΎΡΡΠΈΡ Π² ΠΌΠΈΡ ΡΠ΅ΡΠ΅Π· ΠΎΠ΄ΠΈΠ½ ip.
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΡΡΡ ΡΠ²ΡΠ·ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΈΠΌ Π±ΡΠΈΠ΄ΠΆΠ°ΠΌΠΈ, ΡΡΠΎΠ±Ρ ΡΠ°Π·Π΄Π΅Π»ΡΡΡ ΠΈΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°. ΠΠ΄Π½Π°ΠΊΠΎ bridge Π²ΡΡ ΡΠ°ΠΊ ΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΠΈΠ΄Π΅Π½ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ip.
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ 1 ΠΈ 2, Π° ΡΠ°ΠΊ ΠΆΠ΅ 2 ΠΈ 3 - Π²ΠΈΠ΄ΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°. ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ 1 ΠΈ 3 Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΌΠΎΠ³ΡΡ Π΄ΠΎΡΡΡΡΠ°ΡΡΡΡ Π΄ΡΡΠ³ Π΄ΠΎ Π΄ΡΡΠ³Π°.
Π£ΠΆΠ΅ Π½Π° Π΄Π²ΡΡ ΠΌΠ°ΡΠΈΠ½Π°Ρ ΡΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ. Π’ΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π°ΠΏΡΡΠΌΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌΡ ip Π±ΡΠΈΠ΄ΠΆΠ° Π½Π° Π΄ΡΡΠ³ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΊΠ΅.
ΠΡΠ»ΠΈ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌΡ ΠΏΠΎΡΡΡ ΠΈΠ·Π²Π½Π΅, ΡΠΎ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π°Π΄ΡΠ΅ΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· Port Mapping Π½Π°Ρ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΏΠΎΡΡ.
ΠΡΠΈΠΌΠ΅Ρ
ΠΠ°Π»Π΅Π΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΡΡΡΡ ΡΡΠΈΠ»ΠΈΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΡΡΠΎΠ² ipv4 Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°
const http = require('http');
const { networkInterfaces } = require('os');
const port = 3000;
const requestHandler = (request, response) => {
const IPs = getIPs();
response.end(JSON.stringify(IPs));
}
const server = http.createServer(requestHandler)
server.listen(port, (err) => {
if (err) {
return console.log('ΠΡΠΈΠ±ΠΊΠ°', err)
}
console.log(`Π‘Π΅ΡΠ²Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½ Π½Π° ΠΏΠΎΡΡΡ ${port}`)
});
const getIPs = () => {
const nets = networkInterfaces();
const results = {};
for (const name of Object.keys(nets)) {
for (const net of nets[name]) {
if (net.family === 'IPv4' && !net.internal) {
if (!results[name]) {
results[name] = [];
}
results[name].push(net.address);
}
}
}
return results;
}
Π ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ Π΄ΠΎΠΊΠ΅Ρ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ, Π² ΠΊΠΎΡΠΎΡΡ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΡΡΠ»ΠΈΡΡΡΡ
FROM node:14-alpine
RUN apk add curl
WORKDIR /opt/app
ADD index.js .
CMD ["node", "./index.js"]
Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΎΠ±ΡΠ°Π· ΠΈ ΡΠΎΠ·Π΄Π°ΡΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ Π΄Π²Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
docker build -t bridge:latest
docker run --name node-1 -d bridge:latest
docker run --name node-2 -d bridge:latest
Π£ Π½Π°Ρ Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎ Π΅ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠ΅ΡΠΈ docker network ls
:
Π ΠΏΠΎΡΠ»Π΅ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΠ½Π³Π° ΡΠ΅ΡΠΈ docker inspect 4736089595e6
(Π»ΠΈΠ±ΠΎ docker network inspect bridge
) ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ, ΡΡΠΎ Π² Π½Π΅ΠΉ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ ΠΎΠ±Π° Π½Π°ΡΠΈΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠ±ΠΎΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌ Π±ΡΠ»ΠΈ Π²ΡΠ΄Π°Π½Ρ ip ΠΈΠ· 17ΠΎΠΉ ΠΏΠΎΠ΄ΡΠ΅ΡΠΈ ΠΏΠΎΠ΄ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ 0.2 ΠΈ 0.3
ΠΠ°Π»Π΅Π΅ Π·Π°Ρ
ΠΎΠ΄ΠΈΠΌ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ docker exec it <ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ> sh
ΠΈ ΠΏΡΡΠ°Π΅ΠΌΡΡ Π΄ΠΎΡΡΡΡΠ°ΡΡΡΡ ΠΏΠΎ ip ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΡΠ΅ΡΠ΅Π· curl. Π ΠΎΡΠ²Π΅Ρ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ eh0 ip Π°Π΄ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
ΠΠ±Π° Π½Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈΡΡ Π² bridge ΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π» docker.
Π Π΄Π°Π»Π΅Π΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ΅ΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π΅Ρ Π½Π°ΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ:
# ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠ΅ΡΡ
docker network create my-b-network
# ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΊ Π½Π΅ΠΉ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠΈΠ΅ Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
docker network connect my-b-network node-1
docker network connect my-b-network node-2
# ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΠΌ Π½Π°ΡΡ ΡΠ΅ΡΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²
docker network inspect my-b-network
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΎΡΡΠ°ΡΡΡΡ Π² Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎΠΉ bridge ΡΠ΅ΡΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π² Π½Π°ΡΡ (Π²ΠΎΡΠΊΠ½ΡΠ»ΠΈ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ethernet Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ). Π Π½Π°ΡΠ΅ΠΉ ΡΠ΅ΡΠΈ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΅Π·ΠΎΠ»Π²ΠΈΡΡ ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΈ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΏΠΎ Π½ΠΈΠΌ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ, ΡΡΠΎ Π΄Π°ΡΡ ΠΏΡΠΈ curl ΡΠ°ΠΊΠΎΠΉ Π²ΡΠ²ΠΎΠ΄:
/opt/app # curl node-2:3000
{"eth0":["172.17.0.3"],"eth1":["172.18.0.3"]}
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΡΡΠ°Π·Ρ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ Π½ΡΠΆΠ½ΡΠΉ Π½Π΅ΡΠ²ΠΎΡΠΊ. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² Π΄Π΅ΡΠΎΠ»ΡΠ½ΡΠΉ bridge, Π° ΡΡΠ°Π·Ρ ΠΏΠΎΠ»Π΅ΡΠΈΡ Π² my-b-network.
docker run --name node-3 --network my-b-network -d bridge:latest
Π§ΡΠΎΠ±Ρ Π²ΡΠ²Π΅ΡΡΠΈ ΠΏΠΎΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π½Π°ΡΡΠΆΡ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ ΠΊΠ»ΡΡΡΠΌ -p
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠΊΠΈΠ½Π΅Ρ Π½Π° ΠΏΠΎΡΡ Ρ
ΠΎΡΡΠ°:ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
ΠΏΠΎΡΡ
docker run --name node-4 -p 3000:3000 --network my-b-network -d bridge:latest
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΅Π±Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ curl Ρ Π»ΠΎΠΊΠ°Π»Ρ ΠΎΡΡΠ° ΠΏΡΡΠΌΠΎ Π² Π½ΡΠΆΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
ΠΡΠ°ΠΉΠ²Π΅ΡΠ° host ΠΈ null
Host - ΡΡΠΎ ΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ±ΠΈΡΠ°Π΅Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ Π² Π²ΠΈΠ΄Π΅ docker-ΡΠ΅ΡΠ΅ΠΉ ΠΈ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ Π²ΡΡ ΡΠ΅ΡΡ ΠΈΠ· Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ Π² Π΄ΠΎΠΊΠ΅Ρ-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ.
ΠΠ°ΡΠ°ΡΡΡΡ ΡΠ°ΠΊΠ°Ρ ΡΠ΅ΡΡ Π½ΡΠΆΠ½Π°, ΠΊΠΎΠ³Π΄Π° Π½Π° Π½Π°ΡΠ΅ΠΌ Ρ ΠΎΡΡΠ΅ ΡΡΠΎΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° - ΡΠ° ΠΆΠ΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ . ΠΠΎΠ΄ Π½Π΅Ρ Π½Π΅Ρ ΡΠΌΡΡΠ»Π° Π²ΠΎΠ·ΠΈΡΡΡΡ ΠΈ Π²ΡΠ΄Π΅Π»ΡΡΡ Ρ ΠΎΡΡΡ.
docker run --name node-6 --network host -d bridge:latest
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΊΡΡΠ»ΠΈΡΡΡΡ ΡΠ°ΠΌΠΈ Π² ΡΠ΅Π±Ρ ΠΏΠΎ Π½Π°ΡΠ΅ΠΌΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌΡ ip, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄ΠΎΠΊΠ΅Ρ ΠΏΡΠΎΠΊΠΈΠ½ΡΠ» ΠΏΠΎΡΡ 3000 ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΏΡΡΠΌΠΎ Π½Π° Ρ ΠΎΡΡ
Null - ΡΡΠΎ ΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ°.
ΠΠ°ΡΠ°ΡΡΡΡ Π½ΡΠΆΠ½Π°, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ Π² ΠΌΠ°ΡΠΈΠ½Π΅. ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Ad-hoc ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΠΎΠΌ ΡΡΠ°Π·Ρ ΡΠ±ΠΈΠ²Π°Π΅ΡΡΡ. Π Π°Π±ΡΠ°Π΅Ρ ΡΠΈΡΡΠΎ Π·Π° ΡΡΡΡ Π΄Π°Π½Π½ΡΡ Ρ Ρ ΠΎΡΡ-ΠΌΠ°ΡΠΈΠ½Ρ, Π»ΠΈΠ±ΠΎ ΡΠ°ΠΌ Π³Π΅Π½Π΅ΡΠΈΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π°Π½Π½ΡΠ΅.
docker run --name node-7 --network none -d bridge:latest
ΠΡΠ° ΡΠ΅ΡΡ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
DNS
DNS - ΡΡΠΎ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½Π°Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°Ρ . Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ip-Π°Π΄ΡΠ΅ΡΠ° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ ΠΎΡΡΠ°.
Π§ΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π°Π΄ΡΠ΅Ρ DNS Ρ ΡΠ΅Π±Ρ Π»ΠΈΠ±ΠΎ ΠΏΡΡΠΌΠΎ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° docker Ρ alpine, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΠΊΠ½ΡΡΡ /etc/resolv.conf
(ΠΎΠ±ΡΡΠ½ΠΎ ΡΡΠΎΡ ΡΠ°ΠΉΠ» Π±Π΅ΡΡΡΡΡ Ρ Ρ
ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ)
cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.1
ΠΠΎ ΡΠ°ΠΊ ΠΆΠ΅ Π½ΠΈΡΡΠΎ Π½Π΅ ΠΌΠ΅ΡΠ°Π΅Ρ Π½Π°ΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΌ dns
docker run --name node-9 --dns 8.8.8.8 -d bridge:latest
Π ΠΈΡΠΎΠ³Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡΡΡ ΡΠΎΡ ΡΠ°ΠΌΡΠΉ resolv.conf
ΠΈ dns ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² Π½Π΅Π³ΠΎ
Docker volumes
Π£ΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΈ ΡΠΈΠΏΡ volumes
Volumes - ΡΡΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° Π΄Π°Π½Π½ΡΠ΅ Ρ Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΡΡΠΎ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ docker-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΌΡ ΡΠ°ΠΊ ΠΆΠ΅ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΈ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ Π² ΡΡΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ.
ΠΠ΅ΡΠ²Ρ ΡΠΏΠΎΡΠΎΠ± - Volumes
Volumes Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ (Π° Π½Π΅ Π² ΡΠΎΠΌ ΠΆΠ΅ swarm). ΠΠ½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ. Π’ΠΎ Π΅ΡΡΡ docker ΡΠΎΠ·Π΄Π°ΡΡ Π² ΡΠ²ΠΎΠ΅ΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΠΈΠ½Π΄ΠΈΡΡΡ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ.
ΠΡΠΎΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± - Bind mounts
Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΏΠΎΠ΄ΠΊΠ»ΠΎΡΡΠ°Π΅ΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΈ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ΅Π»ΠΈΠΊΠΎΠ²ΠΎ Π½Π° Π½Π΅Ρ.
Π’ΡΠ΅ΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± - tmpfs
Π‘ΠΎΠ·Π΄Π°ΡΡ Π±ΡΡΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΅Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π² ΠΏΠ°ΠΌΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°.
ΠΠ»Ρ ΡΠ΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ volumes
- ΠΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΠ΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ (ΡΡΠ°ΡΠΈΡΠ½ΠΎΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌ ΠΈΠ· ΠΠ)
- ΠΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΎΠ² (ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΈΡΠ°Π΅Ρ ΡΠΆΠ΅ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ)
- ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ² Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
- Share Π΄Π°Π½Π½ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ volumes
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ Π² Π½Π°ΡΠ΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΈΡ
src / index.js
const express = require("express");
const { writeFileSync, readFileSync } = require("fs");
const fse = require("fs-extra");
const app = express();
const port = 3000;
app.get("/set", async (request, response) => {
await fse.ensureDir("data");
writeFileSync("./data/req", request.query.id);
response.send("done!");
});
app.get("/get", (request, response) => {
const res = readFileSync("./data/req");
response.send(res.toString());
});
app.listen(port, (err) => {
if (err) {
return console.log("something bad happened", err);
}
console.log(`server is listening on ${port}`);
});
ΠΠΎΠΊΠ΅ΡΡΠ°ΠΉΠ» Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
FROM node:14-alpine as build
WORKDIR /opt/app
ADD *.json ./
RUN npm install
ADD . .
CMD ["node", "./src/index.js"]
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ:
ΠΠ°Π»Π΅Π΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ docker volume
Π½ΠΎΠ²ΡΠΉ volume Π΄Π»Ρ Π½Π°ΡΠΈΡ
Π±ΡΠ΄ΡΡΠΈΡ
Π΄Π°Π½Π½ΡΡ
.
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ volumes
$ docker volume create demo
demo
$ docker volume ls
DRIVER VOLUME NAME
local demo
$ docker volume inspect demo
[
{
"CreatedAt": "2025-01-08T12:21:30+03:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/demo/_data",
"Name": "demo",
"Options": null,
"Scope": "local"
}
]
Π§ΡΠΎΠ±Ρ ΠΏΡΠΈΠ²ΡΠ·Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π΄ΠΎΠΊΠ΅ΡΠ° ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Ρ, Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
docker run --name volume-1 -d -v demo:/opt/app/data -p 3000:3000 demo4:latest
ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΠΊ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Ρ ΡΠ΅ΡΠ΅Π· -v
, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ:ΠΏΡΡΡ_Π²_ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅
, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΡΠ²ΡΠ·Π°ΡΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Ρ Π½Π°ΡΠ΅ΠΉ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠΎΠΉ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π½Π° Ρ
ΠΎΡΡΠ΅. ΠΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ ΠΌΡ ΡΡΠΈΡΠ°Π΅ΠΌ ΠΎΡ WORKDIR /opt/app
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠΊΠ°Π·Π°Π»ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΡΡ ΠΏΠ°ΠΏΠΊΡ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. data
Π½Π΅ΠΏΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π±ΡΠ΄Π΅Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² /opt/app/data
, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Ρ Π½Π°Ρ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΎΠ½Π° ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ Π² <project>/data
.
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π·Π°ΠΏΡΠΎΡ Π² Π΄ΠΎΠΊΠ΅Ρ ΠΈ ΠΈΠ· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠ°Π·Ρ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ docker ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΏΠΎΠ»ΠΎΠΆΠΈΠ» Π½Π° Π½Π°ΡΡ Ρ
ΠΎΡΡ-ΠΌΠ°ΡΠΈΠ½Ρ Π² /var/lib/docker/volumes/demo/_data
. ΠΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· data
Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ ΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΡ
ΠΏΠΎΠ΄ΡΠ΅ΠΏΠΈΠ»ΠΈ ΠΈΠ· Π΄ΠΎΠΊΠ΅ΡΠ°.
$ curl "127.0.0.1:3000/set?id=1234"
done!%
$ curl "127.0.0.1:3000/get"
1234%
$ sudo cat /var/lib/docker/volumes/demo/_data/req
1234%
ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π½ΠΎ Π½Π° ΠΏΠΎΡΡΡ 3001, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ΄ΡΠ΅ΠΏΠ»Π΅Π½ ΠΏΠΎΠ΄ ΡΡΠΎΡ ΠΆΠ΅ volume ΠΈ Π΄ΡΡΠ½Π΅ΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡ, ΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ Π²ΡΠ²ΠΎΠ΄, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Π° ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠ΅ΠΉΡΠ°Ρ ΡΠΌΠΎΡΡΡΡ Π½Π° ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ Ρ ΠΎΡΡΠΎΠ²ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ.
ΠΡΠ»ΠΈ Π΄Π²Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΏΠΎΠ΄ΡΠ΅ΠΏΠ»Π΅Π½Ρ ΠΏΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ volume, ΡΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΈΠΌΠΈ Π΄Π²ΡΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ Π±ΡΠ΄ΡΡ ΡΠ΅ΠΉΡΠΈΡΡΡΡ.
$ docker run --name volume-2 -d -v demo:/opt/app/data -p 3001:3000 demo4:latest
$ curl "127.0.0.1:3001/get"
1234%
Π§ΡΠΎΠ±Ρ ΡΠ΄Π°Π»ΠΈΡΡ volume, Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ½Π°ΡΠ°Π»Π° ΡΠ΄Π°Π»ΠΈΡΡ Π²ΡΠ΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π½ΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
$ docker rm $(docker ps -a -q) -f
8a6d2f71508f
$ docker volume rm demo
demo
$ sudo ls /var/lib/docker/volumes
backingFsBlockDev metadata.db
Π’Π°ΠΊ ΠΆΠ΅ Π΅ΡΡΡ ΠΈ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½Π°Ρ Π·Π°ΠΏΠΈΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ volumes ΡΠ΅ΡΠ΅Π· ΡΠ»Π°Π³ --mount
, Π³Π΄Π΅ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ°Π·Π°ΡΡ:
- type - ΡΠΈΠΏ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° (volume / bind / tmpfs)
- src - ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΏΡΡΡ Ρ ΠΎΡΡ-ΠΌΠ°ΡΠΈΠ½Ρ
- dst - Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
docker run --mount type=bind,src=<host-path>,dst=<container-path>
VOLUME Π² Dockerfile
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΡΡΠΌΡΡ Π² ΡΠ°ΠΉΠ»Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠΊΠ°Π·Π°ΡΡ volume, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ
FROM node:14-alpine AS build
WORKDIR /opt/app
ADD *.json ./
RUN npm install
ADD . .
VOLUME ["/opt/app/data"]
CMD ["node", "./src/index.js"]
ΠΠΎΡΠ»Π΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΌΠ΅ΡΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈ ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊ Π½Π΅ΠΌΡ ΠΏΠΎΠ΄ΡΠ΅ΠΏΠ»Π΅Π½Ρ
$ docker build -t demo4:latest .
$ docker image inspect demo4:latest
"Volumes": {
"/opt/app/data": {}
},
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ volume ΡΠΎ ΡΠ²ΠΎΠΈΠΌ ΡΠ»ΠΎΠΆΠ½ΡΠΌ Ρ Π΅ΡΠ΅ΠΌ
$ docker volume ls
DRIVER VOLUME NAME
$ docker run --name volume-3 -d -p 3000:3000 demo4
$ docker volume ls
DRIVER VOLUME NAME
local cb72c2cba4e40437...
ΠΠ½ ΡΠ°ΠΊ ΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠ°ΠΊ ΠΈ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΡΠ°Π½Π΅Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ volume
$ curl "127.0.0.1:3000/set?id=1234"
done!%
$ sudo cat /var/lib/docker/volumes/cb72c2cba4e404379e2af659fa65a3ca495e0cade6aaa0df51718d5e42e45f4d/_data/req
1234%
ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΡ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΠΌΡΡ Ρ ΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ Π±ΡΠ΄ΡΡ Π±ΠΈΠ½Π΄ΠΈΡΡΡΡ ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡΡΡ Π½ΠΎΠ²ΡΠΉ volume, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π·Π°Π½ΠΈΠΌΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°. Π’Π° ΠΆΠ΅ ΠΌΠΎΠ½Π³Π° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΡΡΠΎ Π΄Π²Π° ΡΠ°Π·Π° Π·Π°Π½ΡΡΡ ΠΏΠΎ 300 ΠΌΠ±, Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠΊΠ°.
ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠΈΠ±ΠΈΠ½Π΄ΠΈΡΡ Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌΡ volume.
$ docker run --name volume-4 -d -v demo:/opt/app/data -p 3000:3000 demo4
d7fdcdaa487eee48...
$ docker volume ls
DRIVER VOLUME NAME
local cb72c2cba4e40...
local demo
Π§ΡΠΎΠ±Ρ ΠΎΡΠΈΡΡΠΈΡΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ volume, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΈΡΡΠΈΡΡ ΠΈΡ
ΡΠ΅ΡΠ΅Π· prune
$ docker volume prune
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
cb72c2cba4e404379e2af659fa65a3ca495e0cade6aaa0df51718d5e42e45f4d
Total reclaimed space: 4B
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ bind mounts
Bind mounts - ΡΡΠΎ Π±ΠΈΠ½Π΄ΠΈΠ½Π³ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ ΠΎΠ±Π»Π°ΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ Ρ ΠΎΡΡΠ° (Π° Π½Π΅ Π²Π½ΡΡΡΠΈ Π΄ΠΎΠΊΠ΅ΡΠ°)
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΡΠ΅ΠΏΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΎΠ±Π»Π°ΡΡΡ Ρ Π½Π°ΡΠ΅Π³ΠΎ Ρ ΠΎΡΡΠ°, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΌΠ΅ΡΡΠΎ Π·Π°Π΄Π°Π½ΠΈΡ ΠΈΠΌΠ΅Π½ΠΈ volume ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΡΡ Π½Π° Π½Π°ΡΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΠΈ ΠΏΠΎΠ΄ΡΠ΅ΠΏΠΈΡΡ Π΅Π³ΠΎ ΠΏΠΎΠ΄ docker.
docker run --name volume-5 -d -v /home/zeizel/data:/opt/app/data -p 3000:3000 demo4
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅ΠΊΡΡΡΡ ΠΏΠ°ΠΏΠΊΡ Π½Π° Π½Π°ΡΠ΅ΠΉ Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅
$ curl "127.0.0.1:3000/set?id=1234"
done!%
$ cat ~/data/req
1234%
ΠΠ»Ρ ΡΠ΅Π³ΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½ΡΠΆΠ½ΠΎ?
ΠΠ°ΡΠ°ΡΡΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΌΠ΅Π½ΡΡΡ ΠΊΠ°ΠΊΡΡ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
ΠΠΎΠ΄ΡΠΎΠ²ΡΠ²Π°Π΅ΠΌ ΡΠ°ΠΉΠ» - bind mount Π Π°Π±ΠΎΡΠ°Π΅ΠΌ Ρ ΠΠ - ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ volume
Π ΡΠΏΠΈΡΠΊΠ΅ volume ΡΡΠΎΡ ΡΠΈΠΏ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ² Π½Π΅ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ tmpfs
TempFS - ΡΡΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΊΡΡΠΎΡΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΡΡΠΌΠΎ Π² ΠΏΠ°ΠΌΡΡΡ Ρ ΠΎΡΡΠ°.
Π ΡΠΏΠΈΡΠΊΠ΅ volume ΡΡΠΎΡ ΡΠΈΠΏ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ² ΡΠ°ΠΊ ΠΆΠ΅ Π½Π΅ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΊΡΡΠΊΠ° Π΄Π°Π½Π½ΡΡ Π²Π½Π΅ ΡΠ»ΠΎΡ Docker (ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΡ ).
- ΠΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Swarm
- ΠΠ΅Π»ΡΠ·Ρ ΡΠ΅ΠΉΡΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ
- Π£Π΄Π°Π»ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
ΠΠ»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΠ°ΡΡΠΈ Π΄Π°Π½Π½ΡΡ
ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π² ΠΠΠ£ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ»Π°Π³ --tmpfs
Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΡΠΈ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
docker run --name volume-6 -d --tmpfs /opt/app/data -p 3000:3000 demo4
ΠΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ - ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΅ΡΡΡ. ΠΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠ΅ΡΠ΅Π· stop/start
, ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ» Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΏΡΠΎΠΏΠ°Π» ΠΈΠ· ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ.
$ curl "127.0.0.1:3000/set?id=1234"
done!%
$ curl "127.0.0.1:3000/get"
1234%
$ docker stop volume-6
volume-6
$ docker start volume-6
volume-6
$ curl "127.0.0.1:3000/get"
<pre>Error: ENOENT: no such file or directory, open
Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ², Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΠ½ΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ volume. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ docker cp <host_path> <container>:<container_path>
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠΎΠΏΠΈΡΡΠ΅Ρ Π½Π°ΠΌ Π΄Π°Π½Π½ΡΠ΅ Ρ Ρ
ΠΎΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ.
ΠΠ°Π½Π½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΠΏΠ°ΠΏΠΊΡ Ρ Ρ ΠΎΡΡΠ° ΠΏΡΡΠΌΠΎ Π² Π΄ΠΎΠΊΠ΅Ρ
docker cp /home/zeizel/data volume-9:/opt/app/data
ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π½Π° Ρ ΠΎΡΡ, ΡΠΎ ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅
$ docker cp volume-9:/opt/app/data ~/data
Successfully copied 2.56kB to /home/zeizel/data
$ cat ~/data/req
123
ΠΡΠ»ΠΈ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ°ΠΏΠΊΠΈ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΡΠ΅Π· .
docker cp volume-9:/opt/app/data/. ~/data
Docker compose
YAML
YAML (yaml ainβt markup language) - ΡΡΠΎ Π½Π°Π΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ JSON, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅ ΠΏΠΈΡΠ°ΡΡ Π»ΡΠ΄ΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ
Π ΡΠ°ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡ ΡΠ°ΠΉΠ»:
main.yml
# Π‘ΡΡΠΎΠΊΠΈ
firstname: 'Olegov'
name: Oleg
surname: "Olegovich \n"
# Π§ΠΈΡΠ»Π°
version: 1.2.3
age: 23
# boolean
isDev: true
isTest: off # on
isProd: no # yes
# ΠΎΠ±ΡΠ΅ΠΊΡ
user:
name: Oleg
age: 23
# ΡΠΏΠΈΡΠΎΠΊ
users:
- name: Oleg
age: 24
- name: Vera
age: 22
# ΡΠΏΠΈΡΠΎΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
userList:
- Oleg
- Vera
# Π·Π°ΠΏΠΈΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΌΠ°ΡΡΠΈΠ²Π°
userNames: [Oleg, Vera, 1.2.3]
# YML ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°Π΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ Π½Π°Π΄ JSON ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°ΠΊΠ°Ρ Π·Π°ΠΏΠΈΡΡ ΡΠΎΠΆΠ΅ Π²Π°Π»ΠΈΠ΄Π½Π°
myObject: {
"key": "value",
string: 1.2.3
}
# ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΈΡΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΡΡΠΎΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ
multiline: |
ΠΡΠ° ΡΡΡΠΎΠΊΠ°
ΠΏΠΎΠΉΠ΄ΡΡ Π½Π°
Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ
ΡΡΡΠΎΠΊ.
ΠΠΎΠΏΡΠΎΡΡ?
# Π΅ΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π±ΠΎΠ»ΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΡΡΠΎΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ΅ΠΉ
singleline: >
Π‘ΠΊΠΎΠ»ΡΠΊΠΎ Π±Ρ ΡΡΡ Π½Π΅ Π±ΡΠ»ΠΎ ΡΠ΅ΠΊΡΡΠ°,
ΠΎΠ½ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ ΡΡΠΈΡΠ°ΡΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ
# Π’Π°ΠΊΠ°Ρ ΡΠ΅ΡΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ ΠΎΠ΄Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΌΠ»Π° ΠΎΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ (ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΡΠ½)
---
name: Oleg
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° docker compose
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ ΡΠ°Π³ΠΈ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΅Π³ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ Docker, Π° Π½Π΅ standalone.
docker compose --help
Docker compose
Docker compose - ΡΡΠΎ ΡΡΠΈΠ»ΠΈΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΠΈΡΠ°ΡΡ Π²ΡΡ Π½ΡΠΆΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΅Π³ΠΎ ΠΈΠ· ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΡΠΈΠ³Π°
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
- version - ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ·Π°, ΡΠΈΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ. Π‘Π΅ΠΉΡΠ°Ρ ΠΏΠΈΡΠ°ΡΡ ΡΡΡ ΡΡΡΠΎΠΊΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ.
- services - ΡΡΠΎ ΠΊΠ»ΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡ. ΠΠ½ΡΡΡΠΈ Π½Π΅Π³ΠΎ ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΠ±ΡΠ°Π·ΠΎΠ².
- networks - ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ Π½ΠΈΠΌ
- volumes - ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
docker-compose.yml
# Π²Π΅ΡΡΠΈΡ compose
version: '3'
# ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
services:
api: # ΡΠ΅ΡΠ²ΠΈΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ api
image: demo4 # Π½Π°ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΈΠ· registry
container_name: my-name # ΠΈΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² swarm
ports:
- "3000:3000" # ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ±ΡΠΎΡΠ° ΠΏΠΎΡΡΠΎΠ²
networks:
- servers # Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΠ΅ΡΠΈ
volumes:
- data:/opt/app/data # ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° Ρ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ΠΎΠΌ
# ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ
networks:
servers:
driver: bridge
# ΠΠΠΠ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ, Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΠ΅ΡΠΈ
networks:
default:
external: true
name: servers
# ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ² Π΄Π°Π½Π½ΡΡ
volumes:
data:
ΠΠΎΠΌΠ°Π½Π΄Ρ
ΠΠ°Π»Π΅Π΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΏΠΎΠ΄Π½ΡΡΡ Π²ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π² docker-compose.yml
:
# ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΠΈΠΉ compose
docker compose up
# ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡ ΡΠ΅ΠΊΡΡΠΈΠΉ compose
docker compose stop
# ΡΡΠ°ΡΡΠ°Π½ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΠ΅ΠΊΡΡΠΈΠΉ compose
docker compose start
# ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡ ΠΈ ΡΠ΄Π°Π»ΠΈΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ (ΡΠ΄Π°Π»ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈ ΡΠ΅ΡΡ, Π½ΠΎ ΠΎΡΡΠ°Π²ΠΈΡ volume, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ΅Π½)
docker compose down
ΠΠ°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ compose - ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΡ!
Π’ΠΎ Π΅ΡΡΡ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠ°ΠΏΠΊΠΈ, ΠΎΠΏΠΈΡΠ°ΡΡΡ Π½Π°
docker-compose.yml
Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
- restart - ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ
- pull / push - ΠΏΡΠ»ΠΈΡ ΠΈ ΠΏΡΡΠΈΡ image Ρ registry
- port - Π²ΡΠ²Π΅Π΄Π΅Ρ Π·Π°Π½ΡΡΡΠ΅ ΠΏΠΎΡΡΡ
- logs - Π²ΡΠ²Π΅Π΄Π΅Ρ Π»ΠΎΠ³ΠΈ ΠΈΠ· Π²ΡΠ΅Ρ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ². ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π·Π°ΠΏΡΡΠ΅Π½Ρ Π²
-d
. - images - Π²ΡΠ²Π΅Π΄Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ²
- top - ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ Π² ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΡΠΎΡΠ΅ΡΡΡ
[$] docker compose up -d
[+] Running 1/1
β Container my-name Started 0.2s
[$] docker compose top
my-name
UID PID PPID C STIME TTY TIME CMD
root 1210000 1209978 1 18:55 ? 00:00:00 node ./src/index.js
[$] docker compose images
CONTAINER REPOSITORY TAG IMAGE ID SIZE
my-name demo4 latest 1fc568913222 122MB
ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° Π»ΠΎΠ³Π°ΠΌΠΈ ΠΏΠΎΠ΄Π½ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π· -d
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ -f
docker compose logs <ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ> -f
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
docker compose - ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΎΡΠΊΠ΅ΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ. ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΡΡΠΈ Π²ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΌΡ Π΄Π΅Π»Π°Π»ΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ±ΠΈΡΠ°Π»ΠΈ, Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΈ, ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π»ΠΈ ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΈ ΠΎΠ±ΡΠ°Π·Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ.
ΠΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
Docker compose ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΎΡΠΊΠ΅ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ΄Π½ΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ ΠΏΠΎ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π½Π°ΠΌΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ.
Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, Π³Π΄Π΅ Π² apps Π±ΡΠ΄ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΡ: api, app, converter. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ Dockerfile, ΠΊΠΎΡΠΎΡΡΠΉ all-in-one ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ Π² ΡΠ΅Π±Π΅ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ ΠΎΠ±ΡΠ°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· rabbitmq, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄Π½ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ docker-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ»ΠΎ ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π²Π½ΡΡΡΠΈ compose.
- ΠΠ΄Π΅ΡΡ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ volumes, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ΅Π· Π½ΠΈΡ
ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ
.env
ΡΠ°ΠΉΠ» Π² Π±ΠΈΠ»Π΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π ΡΠ°ΠΌΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΠΎΠ·Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΎΠ΄Π΅ - ΡΡΠΎ Ρ ΠΎΡΠΎΡΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ. ΠΡΠ»ΠΈ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡ Π² swarm, ΡΠΎ ΡΠ°ΠΌ ΡΠΆΠ΅ ΡΠ½Π²Ρ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ². - ΠΠΎΠ³Π΄Π° ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΎΠ±ΡΠ°Π· ΡΠ΅ΡΠ΅Π·
docker run
, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ΅ΡΠ΅Π·-e ENV_NAME=value -e ENV_NAME_2=value_2
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ. Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈ Π²Π½ΡΡΡΠΈ compose ΠΊΠ»ΡΡΠΎΠΌenvironment
- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π»ΠΈΠ±ΠΎ build, Π»ΠΈΠ±ΠΎ image ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡ. Image ΠΌΡ Π±Π΅ΡΡΠΌ ΠΈΠ· registry Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΈΠ»ΠΈ dockerhub. Build ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠ²Π»ΡΡΡΡΡ: context (ΠΎΠ±Π»Π°ΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·Π°) ΠΈ dockerfile (ΡΠ°ΠΌ ΡΠ°ΠΉΠ» Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ).
docker-compose.yml
---
# ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π²ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ
services:
# ΡΠ΅ΡΠ²ΠΈΡ Π°ΠΏΠΈΡΠΊΠΈ
api:
container_name: api
# ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΎΡΠΊΡΠ΄Π° Π±ΡΠ΄Π΅ΠΌ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π·
build:
context: . # Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π±Π΅ΡΡΠΌ Π²ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°
dockerfile: apps/api/Dockerfile # ΡΠΊΠ°ΡΠ·Π²Π°Π΅ΠΌ ΠΏΡΡΡ Π΄ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠ΅
# ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ
restart: always
# ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΏΡΡΡ Π΄ΠΎ .env ΡΠ°ΠΉΠ»Π°
volumes: [./.env:/opt/app/.env]
# ΡΠΊΠ°ΡΠ·Π²Π°Π΅ΠΌ ΡΠ΅ΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
networks: [my-network]
# ΠΎΠ±ΡΠ°Π· Π·Π°Π²ΠΈΡΠΈΠΌ ΠΎΡ RMQ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡΡ ΡΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ Π½Π΅Π³ΠΎ
depends_on: [rmq]
app:
container_name: app
build:
context: .
dockerfile: apps/app/Dockerfile
restart: always
volumes: [./.env:/opt/app/.env]
networks: [my-network]
converter:
container_name: converter
build:
context: .
dockerfile: apps/converter/Dockerfile
restart: always
volumes: [./.env:/opt/app/.env]
networks: [my-network]
depends_on: [rmq]
# ΡΠ΅ΡΠ²ΠΈΡ Π±ΡΠΎΠΊΠ΅ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ
rmq:
# ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ image ΠΈΠ· registry docker hub
image: rabbitmq:3-management
networks: [my-network]
restart: always
# ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²Ρ
ΠΎΠ΄Π°
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
networks:
my-network:
driver: bridge
volumes:
data:
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ°, Ρ Π½Π°Ρ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡΡΡ ΡΡΠ°Π·Ρ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ
docker compose up
ΠΡΠΎΡΠΈΠ»ΠΈ
ΠΡΠΎΡΠΈΠ»ΠΈ - ΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ Π² ΠΊΠΎΠ½ΡΠΈΠ³Π΅, ΠΊΠΎΡΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
---
services:
api:
container_name: api
build:
context: .
dockerfile: apps/api/Dockerfile
restart: always
volumes: [./.env:/opt/app/.env]
networks: [my-network]
depends_on: [rmq]
profiles: [backend]
Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π°ΠΌ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. Π’ΠΎ Π΅ΡΡΡ Π²ΡΠ΅ backend ΡΠ΅ΡΠ²ΠΈΡΡ ΠΏΠΎΠ΄Π½ΠΈΠΌΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΡΠΊΠ°ΠΆΠ΅ΠΌ --profile <ΠΏΡΠΎΡΠΈΠ»Ρ>
ΠΠ°ΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ»Π°Π³ΠΈ Π΄ΠΎ
up
$ docker compose --profile backend --profile frontend up
# Π»ΠΈΠ±ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ Π½ΡΠΆΠ½ΡΠ΅ ΠΏΡΠΎΡΠΈΠ»ΠΈ ΡΠ°ΠΊ
COMPOSE_PROFILES=backend,frontend docker compose up
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄Π½ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π²ΡΠ±ΡΠ°Π½Π½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ. ΠΠΎΠ΄Π½ΠΈΠΌΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½ ΠΈ Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΡΠΊΠ°Π·Π°Π»ΠΈ Π² depends_on
.
run
Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΡΠΈΠ»ΠΈ Π½Π΅ΡΠ²Π½ΠΎ ΠΏΡΠΎΡΡΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΠΊΡ.
Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΎΠ±ΡΠ°Π·Ρ Ρ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌΠΈ ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ.
docker compose run api
ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΈΠ»Ρ Π΅ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΈΠ»Ρ, ΡΠΎ ΠΌΡ ΡΡΠΎΠ»ΠΊΠ½ΡΠΌΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΡΠΌΠΎ Π²Π½ΡΡΡΠΈ ΡΠ°ΠΉΠ»Π° Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ·Π°, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ. ΠΡΡΠ°Π²Π»ΡΡΡ ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ Π² ΡΡΡΠΎΠΊΠΈ ΡΠ΅ΡΠ΅Π· '{$<ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ>}'
Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΡΡΠΎ Π²ΡΡΠ°Π²Π»ΡΡ $<ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ>
services:
api:
container_name: '{$API_CONTAINER_NAME}'
build:
context: .
dockerfile: apps/api/Dockerfile
restart: always
volumes: [./.env:/opt/app/.env]
networks: [my-network]
depends_on: [rmq]
profiles: [backend]
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΄Π΅Π»Π° ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ»
.env.compose
API_CONTAINER_NAME=api
Π ΡΠ΅ΡΠ΅Π· ΡΠ»Π°Π³ --env-file
ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΡΡ Π΄ΠΎ ΡΠ½Π²Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠΈΠ³Π°.
ΠΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ»Π°Π³ ΠΈ ΡΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π΅ΡΠΎΠ»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» .env
.
docker compose --env-file .env.compose --profile backend up
Π’Π°ΠΊ ΠΆΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠ·Π²Π°ΡΡ docker compose config
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° ΠΈΡΠΎΠ³ΠΎΠ²ΡΠΉ ΠΊΠΎΠ½ΡΠΈΠ³, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΏΠ΄Π°ΡΡ Π² ΠΊΠΎΠΌΠΏΠΎΠ· ΠΈ Π±ΡΠ΄Π΅Ρ ΠΊΡΡΡΠΈΡΡΡΡ.
Π Π½Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ --env
, ΡΡΠΎΠ±Ρ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡ ΠΈ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ --profile
, Π΅ΡΠ»ΠΈ ΠΌΡ Π·Π°Π΄Π°Π»ΠΈ Π΅Π³ΠΎ Π΄Π»Ρ Π½Π°ΡΠΈΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²
$ docker compose --env-file .env.compose --profile queue config
name: docker-demo
services:
rmq:
profiles:
- queue
environment:
RABBITMQ_DEFAULT_PASS: admin
RABBITMQ_DEFAULT_USER: admin
image: rabbitmq:3-management
networks:
my-network: null
restart: always
networks:
my-network:
name: docker-demo_my-network
driver: bridge
Π’Π°ΠΊ ΠΆΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΠΏΠΎΠΌΡΠ½ΡΡΡ ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π² ΡΠ°ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· environment
, Π½ΠΎ ΠΈ ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° Ρ ΡΠ½Π²Π°ΠΌΠΈ Π² ΠΊΠ»ΡΡΠ΅ env_file
rmq:
image: rabbitmq:3-management
networks: [my-network]
restart: always
env_file: [.env.rmq]
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
profiles: [queue]
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ COMPOSE_PROJECT_NAME
, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² Π±ΠΈΠ»Π΄Π΅ ΠΊΠΎΠΌΠΏΠΎΠ·Π° Ρ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΏΠ°ΠΏΠΊΠΈ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ docker-compose.yml
Π½Π° Π½Π°Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π·Π°Π΄Π°Π»ΠΈ
COMPOSE_PROJECT_NAME=mycompose docker compose --env-file .env.compose --profile backend --profile queue up
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ - ΠΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
Π‘Ρ Π΅ΠΌΠ° Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠ΅ΠΆΠ½ΠΈΡ:
- Π½Π° Ρ ΠΎΡΡΠ΅ Π·Π°ΠΏΡΡΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π±ΡΠ°ΡΠ·Π΅Ρ
- Π½Π° ΠΈΠΌΠΌΠΈΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° (virtualbox) ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ· ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ
- Π±ΡΠ°ΡΠ·Π΅Ρ Π΄ΠΎΠ»Π±ΠΈΡΡΡ ΠΏΠΎ ΠΏΠΎΡΡΡ 3001 Π½Π° ΠΏΠΎΡΡ 3001 ΡΠ΅ΡΠ²Π΅ΡΠ°, Π° ΡΠ΅ΡΠ²Π΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· 3001 ΠΏΠΎΡΡ ΡΡΠΎΠ½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΡΡΠ΅Π½ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π½Π° 80 ΠΏΠΎΡΡΡ
- ΠΈΠ· Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΌΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡ Π² VB Π½Π° ΠΏΠΎΡΡ 3002, ΠΏΠΎΡΡ 3002 Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΡΠΌΠΎΡΡΠΈΡ Π½Π° 3000 ΠΏΠΎΡΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
- API ΠΎΠ±ΡΠ°Π΅ΡΡΡ Ρ RMQ
- RMQ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ API ΠΈ Converter
- API Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π² Π±ΡΠ°ΡΠ·Π΅Ρ ΠΎΡΠ²Π΅ΡΡ, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ App ΡΡΠΎΠ½ΡΠ°
ΠΡΠΆΠ½ΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π½ΡΠΆΠ½ΡΠ΅ ΠΏΠΎΡΡΡ ΠΏΡΠΎΠΊΠΈΠ½ΡΡΡ ΠΈΠ· Π½Π°ΡΠ΅ΠΉ Π²ΠΈΡΡΡΠ°Π»ΠΊΠΈ Π½Π° Ρ ΠΎΡΡ.
ΠΠ°Π»Π΅Π΅ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π²ΡΠ»Π΅Π΄ Π·Π° ΡΡ Π΅ΠΌΠΎΠΉ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ ΠΏΠΎΡΡΡ Π΄Π»Ρ Π½Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ². ΠΠ»Ρ ΠΊΠΎΠ½Π²Π΅ΡΡΠ΅ΡΠ° Π½Π°ΠΌ ΠΏΠΎΡΡΡ Π½Π΅ Π½ΡΠΆΠ½Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ ΠΎΠ±ΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π½Π°ΡΠΈΠΌ api, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅ΡΠΈ.
docker-compose.yml
services:
app:
container_name: app
build:
context: .
dockerfile: apps/app/Dockerfile
restart: always
ports: [3001:80]
networks: [my-network]
api:
container_name: api
build:
context: .
dockerfile: apps/api/Dockerfile
restart: always
ports: [3002:3000]
volumes: [./.env:/opt/app/.env]
networks: [my-network]
depends_on: [rmq]
converter:
container_name: converter
build:
context: .
dockerfile: apps/converter/Dockerfile
restart: always
volumes: [./.env:/opt/app/.env]
networks: [my-network]
depends_on: [rmq]
rmq:
image: rabbitmq:3-management
networks: [my-network]
restart: always
env_file: [.env.rmq]
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
networks:
my-network:
driver: bridge
volumes:
data:
Shared ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ docker-compose.yml
Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡ Π½Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ²
Π Π²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ»ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΡΡ Π΄Π»Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ-ΠΏΠ°Π½Π΅Π»ΠΈ RMQ
docker-compose.dev.yml
---
services:
rmq:
ports: [15672:15672]
Π§ΡΠΎΠ±Ρ ΡΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΈΡ
Π²ΠΌΠ΅ΡΡΠ΅, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ΅ΡΠ΅Π· -f
Π²ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π½Π°ΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
Extend
ΠΡ ΠΈ ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΡΡΠΌΡ ΡΠΊΡΡΠ΅Π½Π΄ΠΈΡΡΡΡ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΡΡΠΌΠΎ Π² ΠΊΠΎΠ½ΡΠΈΠ³Π΅
ΠΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ ΡΠ΅ΡΠ²ΠΈΡΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅
docker-compose.api.yml
---
services:
api:
container_name: api
build:
context: .
dockerfile: apps/api/Dockerfile
restart: always
ports: [3002:3000]
volumes: [./.env:/opt/app/.env]
networks: [my-network]
Π Π·Π°ΡΠΊΡΡΠ΅Π½Π΄ΠΈΠΌ ΡΡΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
docker-compose.yml
services:
api:
extends:
file: docker-compose.api.yml
service: api
depends_on: [rmq]
ΠΠΊΡΡΠ΅Π½Π΄ΠΈΡΡ ΠΊΠ»ΡΡ
depends_on
ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° - Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΡΡΡΡΡ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΈ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΡΠ°Π·ΡΠ΅Π·ΠΎΠ»Π²ΡΡΡΡ, ΠΌΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΡΠΈΠ±ΠΊΡ ΠΎΡΡΡΡΡΠ²ΡΡΡΠ΅ΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Ρ ΡΠ°Π·Π±ΠΈΡΠΈΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ·Π° Π½Π° ΠΏΠΎΠ΄ΡΠ°ΠΉΠ»Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΏΡΠΎΡΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΠΏΠΎΠ²ΡΡΠ°ΡΡ Π΅Ρ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ.
Docker registry
Π Π°Π±ΠΎΡΠ° docker-registry
Docker registry - ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ API, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΡΠ½ΡΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ Π½Π° Π½Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π·.
ΠΠΎΠ³Π΄Π° ΠΌΡ Ρ Π½Π°ΡΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ (host) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π·Π° Π±Π΅Π· ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ registry, ΠΌΡ Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΠΌΡΡ Π² dockerhub, Π³Π΄Π΅ ΡΡΡΠ³ΠΈΠ²Π°Π΅ΠΌ (pull) ΠΏΠΎ <image>:<tag>
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊ Π½Π°ΠΌ.
ΠΠΎΠ³Π΄Π° ΠΊ Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ°Π·Π° registry/image:tag
Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ registry
, ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅, ΠΊΡΠ΄Π° ΡΡΠΎΡ ΠΎΠ±ΡΠ°Π· ΠΏΠΎΠ»Π΅ΡΠΈΡ ΠΏΡΠΈ ΠΏΡΡΠ΅ ΠΈ ΠΎΡΠΊΡΠ΄Π° ΡΡΡΠ½Π΅ΡΡΡ ΠΏΡΠΈ ΠΏΡΠ»Π»Π΅.
Π§ΡΠΎΠ±Ρ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ registry, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ:
- Π·Π°Π»ΠΈΡΡ Π΅Π³ΠΎ Π½Π° github (+ ΡΠ°ΠΌ ΠΈΠΌΠ΅Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π»ΠΈΡΡ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎ)
- Π·Π°Π»ΠΈΡΡ Π½Π° gitlab (Π½Π° ΡΠ΅Π»ΡΡ ΠΎΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ Π΅ΡΡΡ registry)
- Π·Π°Π»ΠΈΡΡ Π½Π° dockerhub
- ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ registry Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ:
- ΠΏΠΎΠΊΡΠΏΠ°ΡΡ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΈΠΌΡ Π»ΠΈΠ±ΠΎ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Ρ ΡΠ΅Π±Ρ ΡΠ°ΠΌΠΎΠΌΡ
- ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ ΡΠ΅ΡΡΡ Π΄Π»Ρ Π΄ΠΎΠΌΠ΅Π½Π°
# Π·Π°ΠΏΡΠ»Π»ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΎΠ±ΡΠ°Π·
docker pull <image>
# Π·Π°ΠΏΡΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΎΠ±ΡΠ°Π·
docker push <image>
# ΡΠ΅Π³Π½Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΎΠ±ΡΠ°Π·
docker tag <image> <tag>
# Π·Π°ΠΏΡΠ»Π»ΠΈΡ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Ρ Π² docker-compse.yml
docker compose pull
# ΠΎΠΏΡΠ±Π»ΠΈΠΊΡΠ΅Ρ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ
docker compose push
# ΠΏΠΎΠΈΡΠΊ ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΏΠΎ Π΄ΠΎΠΊΠ΅ΡΡ
Π°Π±Ρ
docker search --no-trunc <image>
GitHub registry
ΠΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΡΠ»Π»ΠΈΠ½Π³
Π§ΡΠΎΠ±Ρ Ρ docker Π±ΡΠ»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ registry, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ GH Ρ Π½ΡΠΆΠ½ΡΠΌΠΈ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΌΠΈ ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π΅Π³ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅
Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π² Π»ΡΠ±ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Ρ ΠΎΡΡΠ°, Π³Π΄Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄ΡΡΠ½ΡΡΡ ΡΠΎΠΊΠ΅Π½
nvim ~/TOKEN.txt
ΠΠ»Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π²ΡΠ²ΠΎΠ΄ ΡΠΎΠΊΠ΅Π½Π° ΡΠ΅ΡΠ΅Π· pipe ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΅Π³ΠΎ Π² login
Π΄ΠΎΠΊΠ΅ΡΠ° Ρ ΡΠ»Π°Π³ΠΎΠΌ --password-stdin
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ pipe Π΄Π°Π½Π½ΡΠ΅
cat ~/TOKEN.txt | docker login https://ghcr.io -u <github_username> --password-stdin
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΡΠ΅Π±Π΅ ΡΠΏΡΠ»Π»ΠΈΡΡ ΠΈΠ· gh Π»ΡΠ±ΠΎΠΉ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π· Π»ΠΈΠ±ΠΎ Π½Π°Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΉ
$ docker pull ghcr.io/alaricode/top-api-demo/top-api-test:latest
latest: Pulling from alaricode/top-api-demo/top-api-test
ddad3d7c1e96: Downloading 785.6kB/2.816MB
f845e0f7d73a: Downloading 7.159MB/36.12MB
47d471c4d820: Downloading 801.9kB/2.24MB
1a88008f9c83: Waiting
f7a72abda4da: Waiting
6106deb0d93a: Waiting
0ef759e161b4: Waiting
0ea68650b52d: Waiting
ΠΡΡ
ΠΠ°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΡΠ΅Π³Π°ΡΡ Π½Π°Ρ ΠΎΠ±ΡΠ°Π· ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅, ΡΡΠΎΠ±Ρ gh ΡΠΌΠΎΠ³ Π΅Π³ΠΎ Π² ΡΠ΅Π±Ρ ΠΏΡΠΈΠ½ΡΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ
docker tag <image> ghcr.io/<gh_username>/<repo>/<image_name>:<tag>
docker tag docker-demo-api:latest ghcr.io/alaricode/top-api-demo/top-api-test:latest
docker push ghcr.io/alaricode/top-api-demo/top-api-test:latest
Π Π°Π±ΠΎΡΠ° Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ registry Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° ΡΠΎΠΉ, ΡΡΠΎ Π΅ΡΡΡ Π½Π° Π³ΠΈΡΡ Π°Π±Π΅
ΠΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ ΡΠ²ΠΎΠΉ registry
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π² docker-compse ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΡΡΠΎΠ±Ρ Π±ΡΡΡΡΠ΅Π΅ ΠΈ ΠΏΡΠΎΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ registry
docker-compse.yml
services:
registry:
image: registry:2
container_name: registry
restart: always
volumes: [data:/var/lib/registry]
ports: [5000:5000]
volumes:
data:
ΠΠ°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ registry, ΠΏΡΠΎΡΠ΅Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½ΡΠΆΠ½ΡΠΉ Π½Π°ΠΌ ΠΎΠ±ΡΠ°Π· ΠΈ Π·Π°ΠΏΡΡΠΈΡΡ Π΅Π³ΠΎ Π² ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ registry
Π’Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π·Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠΌΠ΅Π½Π° Π² Π½Π°ΡΠ°Π»Π΅ ΠΎΠ±ΡΠ°Π·Π°
docker compose up -d
docker tag docker-demo-api:latest localhost:5000/api
docker push localhost:5000/api
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΠΎΠ±ΡΠ°Π· Ρ Π½Π°ΡΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΡΡΠ½ΡΡΡ Ρ Π½Π°ΡΠ΅Π³ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ-ΡΠ°Π·Π²ΡΡΠ½ΡΡΠΎΠ³ΠΎ registry
docker image rm localhost:5000/api
docker pull localhost:5000/api
ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΡΡΠΎΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎΠΌΠ΅Π½Π° ip-Π°Π΄ΡΠ΅Ρ
ΠΡΠΈ ΠΏΠ΅ΡΠ΅Π΅Π·Π΄Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΡΡΠ°ΡΡΠΉ ip-Π°Π΄ΡΠ΅Ρ, Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉ Π΄ΠΎΠΌΠ΅Π½, ΡΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΈ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ ΠΎΡΡΠ°Π½ΡΡΡΡ Π½Π° ΠΌΠ΅ΡΡΠ΅.
ΠΡΠ΄Π° Π±ΠΎΠ»ΡΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΡΠΈΠ΄ΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠΌ Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ ΠΈ ΠΏΡΠΈΠ΄ΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΡ Π°Π΄ΡΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊ, ΡΠ΅ΡΡΡ ΠΈ ΠΊΠ»ΡΡΠΈ
docker run -d \
--restart=always \
--name registry \
-v "$(pwd)"/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-p 443:443 \
registry:2
ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ Ansible
Ansible - ΡΡΠΎ ΡΡΠΈΠ»ΠΈΡΠ° Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠΎΠ².
ΠΠ°Π΄Π°ΡΠΈ Ansible
ΠΠ»Ρ ΡΠ΅Π³ΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ:
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΠ΅ΡΡ Π·Π°Π΄Π°ΡΠΈ. Π‘ΡΠ°Π·Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΠΌΠ°ΡΠΈΠ½.
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ. ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΡΠ°Π· Π·Π° ΡΠ°Π·ΠΎΠΌ Π±Π΅Π· ΡΠΎΠ²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ IAC ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ (ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠ°ΠΊ ΠΊΠΎΠ΄).
ΠΠ°ΠΊΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΎΠ½ ΡΠ΅ΡΠ°Π΅Ρ:
- ΠΡΠΌΠ΅ΡΠ°Π΅Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°ΠΊΡΠΎΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ².
- Π Π΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠ° ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΠΈ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
- Π£ΡΡΡΠ°Π½ΡΠ΅Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
- ΠΠΊΠΎΠ½ΠΎΠΌΠΈΡ ΠΊΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
- ΠΠΎΠ²ΡΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ
ΠΠ°ΠΊΠΈΠ΅ ΠΏΠ»ΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Ansible:
- ΠΠ΅Ρ Π΄ΠΎΠΏ ΠΠ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ - ΡΠΎΠ»ΡΠΊΠΎ python
- ΠΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ
- ΠΠΈΠ·ΠΊΠΈΠΉ ΠΏΠΎΡΠΎΠ³ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ API ΡΠ΅ΡΠ΅Π· AWX (ΡΠ΅ΡΠ΅Π· ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ² ΠΈ scheduling)
Π‘Ρ Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΡ Ansible
- YML-ΠΊΠΎΠ½ΡΠΈΠ³ (ΡΠΎ, ΡΡΠΎ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ). ΠΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°. Π’ΡΡ ΠΌΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΡΠΈΡΡΠ΅ΠΌΡ.
- ΠΠ½Π²Π΅Π½ΡΠ°ΡΡ (Π½Π° ΡΡΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ). ΠΡΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ. ΠΠΏΠΈΡΡΠ²Π°Π΅Ρ Π²ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, ΠΊΠ°ΠΊ ΠΊ Π½ΠΈΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ, ΠΏΠΎΠ΄ ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ip ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
- Ansible. ΠΠ½ ΡΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΊ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ ΡΠ°Π½Π΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
- ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ, ΠΎΠ½ ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΡΠ°ΠΊΡΡ ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ . ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ / Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΠΈΠΏ ΠΠ‘, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ ΠΊΠΎΠ½Π½Π΅ΠΊΡ.
- Π‘Π±ΠΎΡΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ² Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ².
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ
- Π’ΡΠ°Π½ΡΠΏΠΈΠ»ΡΡΠΈΡ YAML Π² python ΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. ΠΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ Π² ΡΠ°ΠΌΠΎΠΌ Ansible.
Π‘ΠΈΡΡΠ΅ΠΌΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΡΠ½ΠΎ Π΄Π΅Π»ΡΡΡΡ Π½Π° pull ΠΈ push. Pull ΡΡΠ΅Π±ΡΡΡ Π½Π°Π»ΠΈΡΠΈΡ Π°Π³Π΅Π½ΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ , ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ ΡΠ°ΠΌΠΈ Π² ΡΠ΅Π±Ρ. Push ΡΠΆΠ΅ ΡΡΠ΅Π±ΡΡΡ, ΡΡΠΎΠ±Ρ ΠΌΡ ΡΠ°ΠΌΠΈ Π·Π°ΠΏΠΈΡ Π½ΡΠ»ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, ΡΡΠΎΠ±Ρ ΡΠΎΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»ΡΡ. ΠΡΠΎΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΡΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΠ ΠΈ Π°Π³Π΅Π½ΡΠΎΠ².
ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Ansible Π½Π° ΡΠΎΠΌ ΠΆΠ΅ Ubuntu ΡΠ΅ΡΠ²Π΅ΡΠ΅ (Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΆΠ΅ Π΅ΡΡΡ python) Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΊΡΠΎΠΌΠ΅ ssh, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π°ΠΌ ΡΠ΄Π°Π»ΡΠ½Π½ΠΎ ΡΠΊΡΠΈΠΏΡΡ.
ΠΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Ρ - ΡΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ ΠΊ Ansible ΠΊΡΡΠΊΠΈ ΠΊΠΎΠ΄Π°. Π‘Π°ΠΌΠΈ ΠΎΡΠ»ΠΈΡΠΈΡ:
ΠΠΎΠ΄ΡΠ»ΠΈ | ΠΠ»Π°Π³ΠΈΠ½Ρ |
---|---|
ΠΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°Ρ | ΠΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π° host-ΠΌΠ°ΡΠΈΠ½Π΅ |
ΠΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ | ΠΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ |
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
Π§Π΅ΡΠ΅Π· Π»ΡΠ±ΠΎΠΉ ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΄Π΅ΠΆΠ΅Ρ (Π²ΠΊΠ»ΡΡΠ°Ρ pip
)
brew install ansible
# ΠΠ»ΠΈ
sudo [apt|dnf|pacman] install ansible
Inventory
ΠΠ½Π²Π΅Π½ΡΠ°ΡΡ - ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ Ρ ΠΎΡΡΠΎΠ² ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Ansible ΠΈ playbooks.
ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅Π½Π΅Π΅ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΠΎΠ³ΠΎ .ini
Π»ΠΈΠ±ΠΎ ΡΠ΅ΡΠ΅Π· .yml
ΠΠΎΠ³Π΄Π° ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π΄ΠΎΠΌΠ΅Π½Ρ [group]
Π² ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ
ΡΠΊΠΎΠ±ΠΊΠ°Ρ
, ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠΊΡΠΈΠΏΡΡ Π½Π° ΡΠ΅Π»ΡΡ
Π³ΡΡΠΏΠΏΠ°Ρ
Π΄ΠΎΠΌΠ΅Π½ΠΎΠ². Π’Π°ΠΊΠΈΠ΅ Π³ΡΡΠΏΠΏΡ ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ nginx Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ².
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ:
- ΠΡΠ»ΠΈ Ρ ΠΌΠ°ΡΠΈΠ½Ρ Π΅ΡΡΡ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠ΅ Π½ΠΎΠΌΠ΅ΡΠ°, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄
- ΠΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
- Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Π±Π΅Π· Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠΊΠ°Π·Π°ΡΡ Π°Π»ΠΈΠ°Ρ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π±ΡΠ΄Π΅Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ (ΡΠ°ΠΊ Π½Π° ΡΡΠ΅ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠ΅ΡΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ
coolhost
, Π° Π½Π΅192.68...
)
- Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΡΠ΅Π·
[group:vars]
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ Ρ ΠΎΡΡΡ ΡΠΎΡΡΠΎΡΡ ΠΈΠ· 4ΡΡ Π±Π»ΠΎΠΊΠΎΠ²:
- ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
- connection - ssh / sftp / scp
- host - ΠΈΠΌΡ Ρ ΠΎΡΡΠ°, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ
- port - ΠΏΠΎΡΡ (ΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΉ ssh-ΠΏΠΎΡΡ Π½Π΅ 22, Π° 2222)
- user - ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- password - ΠΏΠ°ΡΠΎΠ»Ρ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ Π·Π°Π΄Π°Π½Ρ ssh-ΠΊΠ»ΡΡΠΈ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
- ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ssh / scp / sftp
- private_key_file - ΠΏΡΡΡ ΠΊ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠΌΡ ΠΊΠ»ΡΡΡ, Π½ΠΎ Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°ΠΉΠ» Π²
.ssh
- common_args - ΠΎΠ±ΡΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ² ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
- extra_args - Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
- pipelining - ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ssh-ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ (ΡΡΠΎΠ±Ρ Π½Π΅ ΠΎΡΠΊΡΡΠ²Π°ΡΡ 100 ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ)
- executable - Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
- private_key_file - ΠΏΡΡΡ ΠΊ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠΌΡ ΠΊΠ»ΡΡΡ, Π½ΠΎ Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°ΠΉΠ» Π²
- ΠΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ (ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· ΠΏΠΎΠ΄ sudo)
- become - Π½ΡΠΆΠ½ΠΎ Π»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΡ sudo
- method - ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° (su/sudo)
- exe, flags - Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΊ sudo
- ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ shell
- shell_type - Π²ΡΠ±ΠΎΡ shell (bash/zsh)
- ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ ΠΏΠΈΡΠΎΠ½Π°
- Π΅ΠΊΠ·Π΅ΠΊΡΡΠ΅Ρ ΡΠΊΡΠΈΠΏΡΠ°
ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠ°ΠΉΠ» ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. Π’ΡΡ ΠΌΡ ΠΎΠΏΠΈΡΠ°Π»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΡΡΡΠΈΡΡΡ Ρ Π½Π°Ρ Π½Π° localhost ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΠΊ Π½Π΅ΠΌΡ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠΎΡΡ Π΄ΡΡΠ³ΠΎΠΉ, ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π½Π°Ρ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ssh.
hosts.ini
[demo]
127.0.0.1 ansible_user=zeizel ansible_port=2222
ΠΠ°Π»Π΅Π΅ ΡΠ΅ΡΠ΅Π· -i
ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΏΡΡΡ ΠΊ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ ΠΈ Π΄ΡΡΠ³Π°Π΅ΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ ping
ΠΈΠ· ansible ΠΏΠΎ Π²ΡΠ΅ΠΉ Π³ΡΡΠΏΠΏΠ΅ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² demo
ansible -i hosts.ini -m ping demo
Π Π΄Π°Π»Π΅Π΅ Π½Π°ΠΌ ΠΏΡΠΈΠ»Π΅ΡΠ΅Π» ΠΎΡΠ²Π΅Ρ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° (Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ Π½Π°Ρ ΡΡΠΎΡΠ» python, ΡΡΠΎΠ±Ρ ΡΡΠΈΠ³Π³Π΅ΡΠ½ΡΡΡ ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ)
Modules
ΠΠΎΠ΄ΡΠ»ΠΈ - ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π° Ρ ΠΎΡΡΠ°Ρ ΠΈ ΡΠ±ΠΎΡΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ.
- service - ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ ΡΠ΅ΡΠ²ΠΈΡ
- command - Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² shell
# ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ service ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π² Π½Π΅Π³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² -a
ansible webservers -m service -a "name=httpd state=started"
# ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ -m ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² -a
ansible webservers -m command -a "/sbin/reboot -t now"
ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
ansible-doc user
Ad-hoc
Ad-hoc - ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ°, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π½Π΅ Ρ ΠΎΡΠΈΠΌ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ:
- Π±ΡΡΡΡΡΡ ΡΠΈΠΊΡΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠ°Π» ΡΠ΅ΡΠ²Π΅Ρ)
- Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°
- Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄
ΠΡΠΎ Π°Π½Π°Π»ΠΎΠ³ docker run -it sh
, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π½Π°ΠΏΡΡΠΌΡΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ Π² ΠΊΡΡΡΡΡΠΈΠΉΡΡ Π΄ΠΎΠΊΠ΅Ρ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π² Π½ΡΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
Ad-hoc ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
- ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
- ΠΌΠΎΠ΄ΡΠ»Ρ - ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π² ad-hoc
- Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
- ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ ΠΎΡΡΠΎΠ² (all / ip / Π³ΡΡΠΏΠΏΠ°)
Π’Π΅ΠΊΡΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎ name
Π½Π° Π²ΡΠ΅Ρ
Ρ
ΠΎΡΡΠ°Ρ
Π’Π΅ΠΏΠ΅ΡΡ, ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅.
Π£ Π½Π°Ρ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏΠΎΠ² Π²ΡΠ²ΠΎΠ΄Π°:
- Success - ΠΠ΅Π»ΡΠ½ΡΠΉ - ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°
- Changed - ΠΡΠ»ΡΡΠΉ - ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠΎ-ΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°
- Failed - ΠΡΠ°ΡΠ½ΡΠΉ - ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π°
β ansible -i hosts -m user -a "name=zeizel state=present" localhost
localhost | SUCCESS => {
"append": false,
"changed": false,
"comment": ",,,",
"group": 1000,
"home": "/home/zeizel",
"move_home": false,
"name": "zeizel",
"shell": "/usr/bin/zsh",
"state": "present",
"uid": 1000
}
Π§ΡΠΎΠ±Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡ ΠΎΡ sudo, Π΄ΠΎΠ±Π°Π»ΡΠ΅ΠΌ become
ΡΠ΅ΡΠ΅Π· -b
ΠΈ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΠ°ΡΠΎΠ»Ρ ΡΠ΅ΡΠ΅Π· -K
. ΠΡΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ sudo.
β ansible -m user -a "name=zeizel state=present" -b -K localhost
BECOME password:
localhost | SUCCESS => {
"append": false,
"changed": false,
"comment": ",,,",
"group": 1000,
"home": "/home/zeizel",
"move_home": false,
"name": "zeizel",
"shell": "/usr/bin/zsh",
"state": "present",
"uid": 1000
}
ΠΡ ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΠ² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π½Π° absent ΠΌΡ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΡ (ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΡ ΠΌΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΡ)
ΠΡΠΎΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± - ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ. Π’Π°ΠΊ ΠΆΠ΅ Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· -e
ansible -i hosts -m user -a "name=zeizel state=absent" -e "ansible_become=true ansible_become_password=123" demo
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡΠΈ ΡΡΠ΅ΡΡΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΡ sudo, ΠΏΠ΅ΡΠ΅Π΄Π°Π² Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΡΠ°Π·Ρ Π² ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ.
ΠΡΠΎ Π½Π΅ΡΠ΅ΠΊΠΎΠΌΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΡΠΉ ΡΠΏΠΎΡΠΎΠ±, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ ΠΊΠ»Π°ΡΡΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ - ΠΏΠ»ΠΎΡ ΠΎ!
ΠΠΎΠ»ΠΎΠΆΠΈΡΡ ip, Π°Π»ΠΈΠ°Ρ - ΡΡΠΎ Π½ΠΎΡΠΌ. ΠΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΏΠ°ΡΠΎΠ»Π΅ΠΌ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ - ΡΡΠΎ Π·Π°Π΄Π°ΡΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°.
hosts.ini
[demo]
127.0.0.1 ansible_user=zeizel ansible_port=2222 ansible_become=true ansible_become_password=123
Π Π΄ΡΡΠ½ΡΡΡ
ansible -i hosts -m user -a "name=zeizel state=absent" demo
Ansible playbooks
Playbook
Ansible Playbook - ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΠΈ ΠΈΠ»ΠΈ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ. ΠΠ½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ΄Π°Π»ΡΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ ΡΠ°Π³ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
ΠΡΠΎ ΡΠ°ΠΌΠΎΠ΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΠΈΡΠ°Π½Π° Π² ΡΠΊΡΠΈΠΏΡΠ΅. ΠΠ½Π° ΡΠΎΡ ΡΠ°Π½ΡΡΡΡ Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΡΡ ΠΈΠ· ΡΠ°Π·Π° Β Π² ΡΠ°Π· Π½Π° Π²ΡΠ΅Ρ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ .
name
- ΠΈΠΌΡ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠ°hosts
- ΠΌΠ°ΡΠΈΠ½Ρ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρtasks
- ΡΡΠΎ Π½Π°Π±ΠΎΡ ad-hoc ΠΊΠΎΠΌΠ°Π½Π΄. Π Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠ΅ ΠΆΠ΅ ΡΠ°ΠΌΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΡΡΠΎ ΠΈ Π² ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ansible.
ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ansible_connection=local
, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π° Π½Π°ΡΠ΅ΠΌ ΠΠ
hosts.ini
[demo]
127.0.0.1 ansible_user=zeizel ansible_connection=local
Π Π΄Π°Π»Π΅Π΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΊΡΠΈΠΏΡ playbook
- name - ΡΡΠΎ ΠΈΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
- user - ΡΡΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄ΡΡΠ½Π΅ΡΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
user.yml
---
- name: user
hosts: demo
tasks:
- name: create user
user:
name: zeizel
state: present
become: true # ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΠΎΡΠΈΡΡ sudo ΠΏΠ°ΡΠΎΠ»Ρ
Π Π΄Π°Π»Π΅Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ansible-playbook
ΠΊΠΎΠΌΠ°Π½Π΄Ρ. ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ -K
, ΡΡΠΎΠ±Ρ Π² ΡΠ»ΡΡΠ°Π΅ ΡΠ΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ sudo
ΠΏΠ°ΡΠΎΠ»Ρ
ansible-playbook -i hosts.ini user.yml -K
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ - ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ Π² playbook
- ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΡΠ°Π·Π½ΡΡ ΠΌΠ΅ΡΡΠ°Ρ
- ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅
- ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ:
- ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π° ΠΈΠ· python (async)
- Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ»ΠΎΠ²Π° playbook
*myvar
- wildcarts ΠΈ ΡΠΏΠ΅ΡΡΠΈΠΌΠ²ΠΎΠ»Ρ Π²Π½Π°ΡΠ°Π»Π΅my var
- ΠΏΡΠΎΠ±Π΅Π»Ρmy-var
- Π΄Π΅ΡΠΈΡΡ5my_var
- Π½Π°ΡΠΈΠ½Π°ΡΡ Ρ ΡΠΈΡΠ»Π°
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ΅ΡΠΌΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°ΡΡ Π²: playbook, block, tasks, group_vars, host_vars, inventory, extra_vars
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π· ΠΊΠ»ΡΡ vars
ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ
ΡΠ΅ΡΠ΅Π· ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ '{{ environment }}'
ΠΠΎΠ΄ΡΠ»Ρ
ΠΠ°ΠΏΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»Ρ ΠΌΠΎΠ΄ΡΠ»Ρ
---
- name: user
hosts: demo
tasks:
- name: create user
vars:
user: zeizel
become: true
user:
name: '{{ user }}'
state: present
ΠΠ΅ΡΡ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊ
Π Π·Π°ΠΏΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠ°
---
- name: user
hosts: demo
vars:
user: zeizel
tasks:
- name: create user
become: true
user:
name: '{{ user }}'
state: present
ΠΠ°Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· ΠΏΡΠΎΠΌΠΏΡΠ°
Π§Π΅ΡΠ΅Π· vars_prompt
ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π½Π°Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ Π²Π²Π΅ΡΡΠΈ playbook Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°ΡΠΎΠΊ
- name: user
hosts: demo
vars_prompt:
- name: user # ΠΈΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
prompt: 'Input user name' # Π²ΡΠ²ΠΎΠ΄ΠΈΠΌΡΠΉ Π»Π΅ΠΉΠ±Π» Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
private: no # ΡΠΊΡΡΠ²Π°ΡΡ Π»ΠΈ Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
tasks:
- name: create user
become: true
user:
name: '{{ user }}'
state: present
ΠΠ· ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» ΡΠΈΡΡΠΎ ΠΏΠΎΠ΄ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
user_vars.yml
---
user: zeizel
Π’ΡΡ ΡΠΆΠ΅ ΠΌΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠ»Π΅ vars_files
ΡΠΏΠΈΡΠΎΠΊ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
---
- name: user
hosts: demo
vars_files: [./user_vars.yml]
tasks:
- name: create user
become: true
user:
name: '{{ user }}'
state: present
ΠΠ΅ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅
Π’Π°ΠΊ ΠΆΠ΅ Π² ansible ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΏΠ»Π°Π³ΠΈΠ½, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ΡΠ²Π½ΠΎ Π±Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ Π³ΡΡΠΏΠΏΠ°ΠΌ Π΄Π°Π½Π½ΡΡ
ΠΠΎΡ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
[demo]
127.0.0.1 ansible_user=zeizel ansible_connection=local
ΠΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ Π³ΡΡΠΏΠΏΡ ΠΈΠ· ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
- ΠΠ· ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ Π±Π΅ΡΡΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π³ΡΡΠΏΠΏΡ
demo
- Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΏΠ°ΠΏΠΊΡ
group_vars
, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΏΠ°ΠΏΠΊΡ Ρ Π³ΡΡΠΏΠΏΠΎΠΉ ΠΈ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌvars.yml
group_vars / demo / vars.yml
---
user: zeizel
- Π ΡΠ°ΠΉΠ»Π΅ playbook Π½ΠΈΡΠ΅Π³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ - ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
---
- name: user
hosts: demo
tasks:
- name: create user
become: true
user:
name: '{{ user }}'
state: present
ΠΠΎ Ρ ΠΎΡΡΠ°ΠΌ
- ΠΠ· ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ Π±Π΅ΡΡΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ
ΠΎΡΡΠ° (ΠΌΠΎΠΆΠ½ΠΎ Π°Π»ΠΈΠ°Ρ, Π΅ΡΠ»ΠΈ Π΅ΡΡΡ)
127.0.0.1
- Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΏΠ°ΠΏΠΊΡ
host_vars
, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠΌΠ» Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ ΠΎΡΡΠ°127.0.0.1.yml
host_vars / 127.0.0.1.yml
---
user: zeizel
- Π ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΊ ΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±Π΅Π· ΠΏΡΡΠΌΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡΡΠ°
ΠΠ°Π΄Π°Π²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΡΠΌΠΎ Π² ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ΅
Π’Π°ΠΊ ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π½Π°ΠΏΡΡΠΌΡΡ ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² playbook, Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΊΠ°ΠΆΠ΅ΠΌ Π΅Ρ ΠΏΡΡΠΌΠΎ Π² ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ΅
[demo]
127.0.0.1 ansible_user=zeizel ansible_connection=local user=zeizel
ΠΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ΅ΠΉ
Π’Π°ΠΊ ΠΆΠ΅ Π½ΠΈΡΡΠΎ Π½Π°ΠΌ Π½Π΅ ΠΌΠ΅ΡΠ°Π΅Ρ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ, ΡΡΠΎΠ±Ρ ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Ρ ΠΎΡΡΠΎΠ² ΠΈ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ Π½ΠΈΠΌ
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡ demo-server
, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠΌ ΠΏΡΠΎΡΡΠΎ ΡΠ°ΠΉΠ» demo
demo-server / demo
[demo]
127.0.0.1 ansible_user=zeizel ansible_connection=local user=zeizel
Π Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π½Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», Π° Π²ΡΡ ΠΏΠ°ΠΏΠΊΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ, Π³Π΄Π΅ Π²ΡΠ΅ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠΈ ΠΈΠ· Π½Π΅Ρ ΡΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½ΠΈΡΡΡΡΡΡ Π² ΠΎΠ΄ΠΈΠ½
ansible-playbook -i demo-server user.yml -K
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² Π³ΡΡΠΏΠΏΠ΅ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ΅ΠΉ
ΠΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΡΠΌΠΎ Π² ΡΡ ΠΆΠ΅ ΠΏΠ°ΠΏΠΊΡ Ρ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡΠΌ ΠΈ Π½Π΅ ΠΏΠΈΡ Π°ΡΡ ΠΈΡ ΠΏΡΡΠΌΠΎ Π² ΡΠ°ΠΌ ΡΠ°ΠΉΠ» Ρ Ρ ΠΎΡΡΠ°ΠΌΠΈ
group_vars / all.yml
---
user: zeizel
ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠ°ΠΏΠΎΠΊ
.
βββ demo-server
β βββ group_vars
β β βββ all.yml
β βββ hosts
βββ user.yml
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π· extra-vars
ΠΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΏΡΡΠΌΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΡΠ΅ΡΠ΅Π· ΡΠ»Π°Π³ --extra-vars
ansible-playbook -i demo-server user.yml -K --extra-vars "user=zeizel"
ΠΠΎΡΡΠ΄ΠΎΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΡ
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΡΡΠ΄ΠΆΠ°ΡΡΡ ΠΈΠ· ΡΠ°Π·Π½ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ². ΠΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΡΠ°ΠΌΡΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π·Π°Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ (Π³ΡΡΠΏΠΏΠ° < Ρ ΠΎΡΡ < ΡΠΎΠ»Ρ < Π±Π»ΠΎΠΊ < ΡΠ°ΡΠΊΠ°)
--extra-vars
- ΡΡΠΎ ΡΠ°ΠΌΡΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠ· Π²ΡΠ΅Ρ
.
ΠΡΠ»Π°Π΄ΠΊΠ°
ΠΠ»ΠΎΠΊΠΈ ΠΈ ΠΎΡΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ
ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ - ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
Ansible Lint
Π Π°Π·Π²ΡΡΡΠΊΠ° ΠΌΠ°ΡΠΈΠ½ Ρ Vagrant
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΌΠΎΠ³Π»Π° Π±Ρ Π±ΡΡΡ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅ΠΉ, Π΅ΡΠ»ΠΈ Π±Ρ vagrant Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ Π΄Π»Ρ Π ΠΎΡΡΠΈΠΈ.
ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΠΠ, ΡΠΎ ΡΠ°ΠΊ:
brew tap hashicorp/tap
brew install hashicorp/tap/vagrant
ΠΡΠ»ΠΈ Π½Π΅Ρ, ΡΠΎ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ ΠΏΠΎΠ΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ Π΄ΠΈΡΡΡΡ ΠΈΠ· Π΄ΠΎΠΊΠΈ
Π§ΡΠΎΠ±Ρ Π±ΡΠ»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ΄Π½ΡΡΡ Vagrant, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π½Π°ΡΠ°Π»ΠΎ Vagrantfile
ΡΠ½Π²Ρ Ρ ΡΠ΅Π»ΡΡ
ΠΎΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ:
ENV['VAGRANT_SERVER_URL'] = 'https://vagrant.elab.pro'
Π‘ΠΊΠ°ΡΠ°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ Vagrant ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π² Yandex ΠΈΠ»ΠΈ Mail.ru
Vagrant ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ VB, ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠΊΠ°ΡΠΈΠ²Π°ΡΡ ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π½Π΅ Π±ΡΠ»ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΡ!
Π Π°Π·Π²ΡΡΡΠΊΠ° ΠΌΠ°ΡΠΈΠ½
ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ RSA ΠΊΠ»ΡΡ Π½Π° Π½Π°ΡΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π΅
ssh-keygen -t rsa
ΠΠΎΠ½ΡΠΈΠ³ vagrant Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Ruby
Vagrantfile
# ΠΌΠΈΡΡΠΎΡ Π²Π°Π³ΡΠ°Π½ΡΠ°
ENV['VAGRANT_SERVER_URL'] = 'https://vagrant.elab.pro'
# ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄Π»Ρ Π²ΡΠΎΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ
Vagrant.configure("2") do |config|
# ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΡΡΡ 5 ΡΠ°Π·, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄Π½ΡΡΡ 5 ΠΌΠ°ΡΠΈΠ½
(1..5).each do |i|
# Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΠΎΠ΄ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ (web - ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³Π°, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ°ΠΌΠΈ)
config.vm.define "server#{i}" do |web|
# box - ΡΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ Π²ΠΈΡΡΡΠ°Π»ΠΊΠ°, ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ
web.vm.box = "ubuntu/focal64"
# ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΡΡΡ (Ρ
ΠΎΡΡ ΠΏΠΎΡΡΡ 2223, 2224... Π½Π° Π³ΠΎΡΡΠ΅Π²ΠΎΠΉ 22)
web.vm.network "forwarded_port", id: "ssh", host: 2222 + i, guest: 22
# ΠΏΠΎΡΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°
web.vm.network "private_network", ip: "10.11.10.#{i}", virtualbox__intnet: true
# ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Ρ
ΠΎΡΡ
web.vm.hostname = "server#{i}"
# ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Π»Π», ΡΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ssh-ΠΊΠ»ΡΡΠΈ
web.vm.provision "shell" do |s|
# ΠΏΡΡΡ ΠΊ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠΌΡ ΠΊΠ»ΡΡΡ
ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
# Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ssh-ΠΊΠ»ΡΡ Π² vagrant (ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΡ ΠΊΠ°ΠΊ Π΄Π΅ΡΠΎΠ»ΡΠ½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ΄Π°Π»ΡΠ½Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ)
s.inline = <<-SHELL
echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
SHELL
end
# ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΠΊ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΡ virtualbox, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄Π½ΡΡΡ 5 ΠΌΠ°ΡΠΈΠ½ Π½Π° ΡΠ±ΡΠ½ΡΠ΅
web.vm.provider "virtualbox" do |v|
v.name = "server#{i}"
# Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ 2 Π³ΠΈΠ³Π° ΠΎΠ·Ρ
v.memory = 2048
# ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΡ
v.cpus = 1
end
end
end
end
Π ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ Π²ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ
vagrant up
ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ Π²Π°Π³ΡΠ°Π½Ρ ΠΈΠ· ΠΏΠΎΠ΄ WSL, ΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ:
- Π₯ΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΠΏΠΊΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° Π΄ΠΈΡΠΊΠ΅ c Windows (Π½Π΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ linux
~/
)- Π Π°Π·ΡΠ΅ΡΠΈΡΡ Vagrant ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Windows ΠΈΠ· ΠΏΠΎΠ΄ WSL ΡΠ΅ΡΠ΅Π·:
export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
ΠΡΠ»ΠΈ Π²ΡΡ ΠΎΠ΄ΠΈΡ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ°, ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΠΏΠ°ΠΏΠΊΡ
.vagrant
The VirtualBox VM was created with a user that doesnβt match the current user running Vagrant. VirtualBox requires that the same user be used to manage the VM that was created. Please re-run Vagrant with that user. This is not a Vagrant issue. The UID used to create the VM was: 1000 Your UID is: 0
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ Π»ΡΠ±ΠΎΠΌΡ Π½Π°ΡΠ΅ΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ
ssh vagrant@127.0.0.1 -p 2223
ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠ°Π·Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈ ΠΏΡΠΎΠΏΠΈΡΠ°ΡΡ
yes
ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊ ssh
Troubleshooting
Π’Π°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΎ, Π΅ΡΠ»ΠΈ Π΅ΡΡΡ ΠΌΡΡΠΎΡ Π² ΡΠ°ΠΉΠ»Π΅ Ρ ΠΎΡΡΠΎΠ² ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π² ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ»
Π ΡΠ΄Π°Π»ΠΈΡΡ ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌ
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠΎΠ²
ΠΡΠΆΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈ ansible
Docker Swarm
Ansible - ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ ΡΠ΅ΠΌΡ
Deploy ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΊΠ»Π°ΡΡΠ΅Ρ
Troubleshooting
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Docker Π½Π° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ Π½Π° MacOS
# 1. Π£Π΄Π°Π»ΠΈΠΌ ΡΠ΅ΠΊΡΡΠΈΠΉ GPG-ΠΊΠ»ΡΡ ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ
sudo rm -f /etc/apt/keyrings/docker.gpg
sudo rm -f /etc/apt/sources.list.d/docker.list
# 2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ GPG-ΠΊΠ»ΡΡ Π·Π°Π½ΠΎΠ²ΠΎ
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 3. ΠΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΊΠ°ΠΊ `jammy` (Π²ΠΌΠ΅ΡΡΠΎ noble!)
echo \
"deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu jammy stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 4. ΠΠ±Π½ΠΎΠ²ΠΈΠΌ apt ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker