Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ Π²ΡΡ‚Π°ΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с классичСской Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚ΠΊΠΎΠΉ прилоТСния:

  • Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π° 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 с Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ docker
  • push - ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π·Π°ΠΏΡƒΡˆΠΈΡ‚ΡŒ собранный локально 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 - установка Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π½Π°ΠΌ shell
  • RUN - Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ. Бамая частая Π² использовании ΠΊΠΎΠΌΠ°Π½Π΄Π°. Для поднятия ΠΈ сборки Π±ΠΈΠ»Π΄Π°
  • 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 сразу нСсколько ΠΎΠ±Ρ€Π°Π·ΠΎΠ².

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΠ»ΡŽΡΡ‹:

  1. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ сТатый ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π±ΠΈΠ»Π΄
  2. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ сСкрСты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС, Π½ΠΎ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΡ… ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сСйчас ΠΌΡ‹ сдСлаСм ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² сСбС собСрёт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. А Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±Ρ€Π°Π·Π΅ ΠΌΡ‹ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ собранноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ обращСния Ρ‡Π΅Ρ€Π΅Π· --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 - это ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠΈΠ·Π°Ρ†ΠΈΠΈ выполнСния скриптов.

Π—Π°Π΄Π°Ρ‡ΠΈ Ansible

Для Ρ‡Π΅Π³ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

  1. АвтоматиизируСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π·Π°Π΄Π°Ρ‡ΠΈ. Π‘Ρ€Π°Π·Ρƒ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° большом количСствС машин.
  2. АвтоматизируСт слоТныС Π·Π°Π΄Π°Ρ‡ΠΈ. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ слоТныС Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π°Π· Π·Π° Ρ€Π°Π·ΠΎΠΌ Π±Π΅Π· ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ошибок.
  3. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ IAC ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ (инфраструктура ΠΊΠ°ΠΊ ΠΊΠΎΠ΄).

КакиС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠ½ Ρ€Π΅ΡˆΠ°Π΅Ρ‚:

  1. ΠžΡ‚ΠΌΠ΅Ρ‚Π°Π΅Ρ‚ чСловСчСский Ρ„Π°ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΈ исполнСнии скриптов.
  2. Π Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ нСдостатка прозрачности настроСк ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ
  3. УстраняСт ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ повторСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
  4. Π­ΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ ΠΊΡƒΡ‡Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
  5. ΠŸΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

КакиС ΠΏΠ»ΡŽΡΡ‹ ΠΈΠΌΠ΅Π½Π½ΠΎ Ansible:

  1. НСт Π΄ΠΎΠΏ ПО Π½Π° сСрвСрС - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ python
  2. МоТно Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ свои ΠΌΠΎΠ΄ΡƒΠ»ΠΈ
  3. Низкий ΠΏΠΎΡ€ΠΎΠ³ вхоТдСния
  4. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ API Ρ‡Π΅Ρ€Π΅Π· AWX (Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ автоматичСскоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ скриптов ΠΈ scheduling)

Π‘Ρ…Π΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ansible

  1. YML-ΠΊΠΎΠ½Ρ„ΠΈΠ³ (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ выполняСм). ΠžΠΏΠΈΡΡ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎ состояниС, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ привСсти сСрвСра. Π’ΡƒΡ‚ ΠΌΡ‹ описываСм ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ состояниС, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ привСсти систСму.
  2. Π˜Π½Π²Π΅Π½Ρ‚Π°Ρ€ΡŒ (Π½Π° Ρ‡Ρ‘ΠΌ выполняСм). Π­Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. ΠžΠΏΠΈΡΡ‹Π²Π°Π΅Ρ‚ всС сСрвСра, ΠΈΡ… состояния, ΠΊΠ°ΠΊ ΠΊ Π½ΠΈΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΠ΄ ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ip ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.
  3. Ansible. Он ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ сСрвСра ΠΊ описанному Ρ€Π°Π½Π΅Π΅ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ.
    1. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ, ΠΎΠ½ собираСт Ρ„Π°ΠΊΡ‚Ρ‹ ΠΎ сСрвСрах. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ / Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‚ΠΈΠΏ ОБ, происходит ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚.
    2. Π‘Π±ΠΎΡ€ΠΊΠ° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ² с сСрвСров.
    3. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²
    4. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ
  4. Вранспиляция 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 Π½Π° мноТСство сСрвСров.

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ:

  1. Если Ρƒ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π΅ΡΡ‚ΡŒ порядковыС Π½ΠΎΠΌΠ΅Ρ€Π°, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄
  2. МоТСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
  3. Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ для сСрвСра Π±Π΅Π· названия ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ алиас, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ (Ρ‚Π°ΠΊ Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ coolhost, Π° Π½Π΅ 192.68...)

  1. Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ спокойно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для Π³Ρ€ΡƒΠΏΠΏΡ‹ Ρ‡Π΅Ρ€Π΅Π· [group:vars]

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ хосту состоят ΠΈΠ· 4Ρ‘Ρ… Π±Π»ΠΎΠΊΠΎΠ²:

  1. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ
    • connection - ssh / sftp / scp
    • host - имя хоста, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ
    • port - ΠΏΠΎΡ€Ρ‚ (Ρ‚ΡƒΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ понадобится кастомный ssh-ΠΏΠΎΡ€Ρ‚ Π½Π΅ 22, Π° 2222)
    • user - имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
    • password - ΠΏΠ°Ρ€ΠΎΠ»ΡŒ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ссли Π½Π΅ Π·Π°Π΄Π°Π½Ρ‹ ssh-ΠΊΠ»ΡŽΡ‡ΠΈ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.
  2. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ssh / scp / sftp
    • private_key_file - ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ, Π½ΠΎ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„Π°ΠΉΠ» Π² .ssh
    • common_args - ΠΎΠ±Ρ‰ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для всСх Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ
    • extra_args - Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹
    • pipelining - ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства ssh-ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ 100 ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ)
    • executable - Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ настройка выполнСния
  3. ΠŸΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ (ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· ΠΏΠΎΠ΄ sudo)
    • become - Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΡ‚ sudo
    • method - ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° (su/sudo)
    • exe, flags - настраиваСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ sudo
  4. Настройки 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 Π½Π° всСх хостах

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, послС выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ прСдставлСн Π½Π° сСрвСрС.

Π£ нас Π΅ΡΡ‚ΡŒ нСсколько Ρ‚ΠΈΠΏΠΎΠ² Π²Ρ‹Π²ΠΎΠ΄Π°:

  1. Success - Π—Π΅Π»Ρ‘Π½Ρ‹ΠΉ - опСрация Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°
  2. Changed - Π–Ρ‘Π»Ρ‚Ρ‹ΠΉ - опСрация Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°
  3. 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
По названию Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈΠ· описанного инвСнтаря
  1. Из инвСнтаря Π±Π΅Ρ€Ρ‘ΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ demo
  2. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ ΠΏΠ°ΠΏΠΊΡƒ group_vars, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΏΠ°ΠΏΠΊΡƒ с Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ ΠΈ фиксированным ΠΈΠΌΠ΅Π½Π΅ΠΌ vars.yml

group_vars / demo / vars.yml

---
user: zeizel
  1. Π’ Ρ„Π°ΠΉΠ»Π΅ playbook Π½ΠΈΡ‡Π΅Π³ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ - просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
---
- name: user
  hosts: demo
  tasks:
      - name: create user
        become: true
        user:
            name: '{{ user }}'
            state: present
По хостам
  1. Из инвСнтаря Π±Π΅Ρ€Ρ‘ΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ хоста (ΠΌΠΎΠΆΠ½ΠΎ алиас, Ссли Π΅ΡΡ‚ΡŒ) 127.0.0.1
  2. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ ΠΏΠ°ΠΏΠΊΡƒ host_vars, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ создаём ямл с ΠΈΠΌΠ΅Π½Π΅ΠΌ хоста 127.0.0.1.yml

host_vars / 127.0.0.1.yml

---
user: zeizel
  1. И ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π±Π΅Π· прямого ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
Π—Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ прямо Π² ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π΅

Π’Π°ΠΊ ΠΆΠ΅ пСрСмСнная Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ Π² 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, Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ:

  1. Π₯Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° дискС c Windows (Π½Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ linux ~/)
  2. Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ 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

Setup VM’s Ubuntu

Установка 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