# πŸ“– ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования ## 1. Базовая сборка ΠΈ публикация ### ΠŸΡ€ΠΎΡΡ‚Π°Ρ сборка ```bash # Π‘Π±ΠΎΡ€ΠΊΠ° с Π΄Π²ΠΎΠΉΠ½Ρ‹ΠΌΠΈ Ρ‚Π΅Π³Π°ΠΌΠΈ make docker build IMAGE=myapp TAG1=latest TAG2=v1.0.0 # Π‘Π±ΠΎΡ€ΠΊΠ° с кастомным registry make docker build \ IMAGE=myapp \ TAG1=latest TAG2=v1.0.0 \ REGISTRY=hub.cism-ms.ru/library # Π‘Π±ΠΎΡ€ΠΊΠ° с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ make docker build IMAGE=myapp TAG1=latest TAG2=v1.0.0 make docker check RUN_CMD="lsb_release -a" ``` ### ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» сборки ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ```bash # 1. Π‘Π±ΠΎΡ€ΠΊΠ° ΠΎΠ±Ρ€Π°Π·Π° (Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ Ρ‚Π΅Π³ΠΈ) make docker build \ IMAGE=myapp \ TAG1=latest TAG2=v1.0.0 \ REGISTRY=hub.cism-ms.ru/library # 2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° работоспособности make docker check \ RUN_CMD="curl -f http://localhost:8080/health" # 3. ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ Π² registry make docker push \ IMAGE=myapp \ TAG1=latest TAG2=v1.0.0 \ REGISTRY=hub.cism-ms.ru/library ``` ## 2. ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Π°Ρ сборка ### Настройка buildx ```bash # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ buildx builder make docker create-builder # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° builder'Π° make docker use-builder # ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ доступных ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ docker buildx inspect --bootstrap ``` ### Π‘Π±ΠΎΡ€ΠΊΠ° для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ ```bash # Π‘Π±ΠΎΡ€ΠΊΠ° для AMD64 ΠΈ ARM64 make docker build \ IMAGE=myapp \ TAG1=latest TAG2=v1.0.0 \ USE_BUILDX=1 \ PLATFORMS="linux/amd64,linux/arm64" \ PUSH=1 \ LOAD=0 # Π‘Π±ΠΎΡ€ΠΊΠ° для всСх популярных ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ make docker build \ IMAGE=myapp \ TAG1=latest TAG2=v1.0.0 \ USE_BUILDX=1 \ PLATFORMS="linux/amd64,linux/arm64,linux/arm/v7" \ PUSH=1 ``` ## 3. ΠžΡ„Ρ„Π»Π°ΠΉΠ½ Π΄Π΅ΠΏΠ»ΠΎΠΉ ### Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ```bash # ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ сохранСниС make docker save SRC_IMAGE=myapp:latest # Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ с сТатиСм make docker save \ SRC_IMAGE=myapp:v1.0.0 \ COMPRESS=1 # Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ с Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° части make docker save \ SRC_IMAGE=myapp:v1.0.0 \ COMPRESS=1 \ SPLIT_SIZE=2G # Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΡΡ‚ΠΎΠΌΠ½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ make docker save \ SRC_IMAGE=myapp:v1.0.0 \ IMAGES_DIR=/backup/containers \ COMPRESS=1 ``` ### Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ публикация ```bash # ΠŸΡ€ΠΎΡΡ‚Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° make docker load ARCHIVE=images/myapp_v1.0.0.tar.gz # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ make docker load \ ARCHIVE=images/myapp_v1.0.0.tar.gz \ REGISTRY=hub.cism-ms.ru/library \ IMAGE=myapp \ TAG1=v1.0.0 \ LOGIN=1 \ PUSH_OFFLINE=1 # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с сохранСниСм исходного Ρ‚Π΅Π³Π° make docker load \ ARCHIVE=images/myapp_v1.0.0.tar.gz \ KEEP_SRC_TAG=1 \ LOGIN=1 \ PUSH_OFFLINE=1 ``` ## 4. Π Π°Π±ΠΎΡ‚Π° с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ сборки ### ИспользованиС BUILD_ARGS ```bash # ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния make docker build \ IMAGE=myapp \ TAG1=v1.0.0 \ BUILD_ARGS="--build-arg VERSION=1.0.0 --build-arg NODE_ENV=production" # ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… make docker build \ IMAGE=myapp \ TAG1=v1.0.0 \ BUILD_ARGS="--build-arg USER_ID=1000 --build-arg GROUP_ID=1000" ``` ### ИспользованиС ARG_FILE ```bash # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ cat > build.args << EOF VERSION=1.0.0 BUILD_DATE=2024-01-15 GIT_COMMIT=abc123def NODE_ENV=production USER_ID=1000 GROUP_ID=1000 EOF # Π‘Π±ΠΎΡ€ΠΊΠ° с Ρ„Π°ΠΉΠ»ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² make docker build \ IMAGE=myapp \ TAG=v1.0.0 \ ARG_FILE=build.args ``` ## 5. Π Π°Π±ΠΎΡ‚Π° с Git ### Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ```bash # ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ статуса make git status # ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ make git pull # ΠšΠΎΠΌΠΌΠΈΡ‚ с сообщСниСм make git commit GIT_MSG="Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Docker" # ΠšΠΎΠΌΠΌΠΈΡ‚ ΠΈ push make git push GIT_MSG="ОбновлСна докумСнтация" ``` ### ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ сцСнарии ```bash # Бинхронизация с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ make git sync # Π Π°Π±ΠΎΡ‚Π° с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌΠΈ рСпозиториями make git pull GIT_REMOTE=upstream make git push GIT_REMOTE=origin GIT_MSG="Бинхронизация с upstream" ``` ## 6. Π Π°Π±ΠΎΡ‚Π° с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ систСмами ### Linux (Ubuntu/Debian) ```bash # Установка Docker sudo apt-get update sudo apt-get install -y docker.io sudo systemctl start docker sudo systemctl enable docker sudo usermod -aG docker $USER # Установка Make sudo apt-get install -y make # ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° для примСнСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ sudo reboot ``` ### Linux (CentOS/RHEL/Fedora) ```bash # Установка Docker sudo yum install -y docker # ΠΈΠ»ΠΈ для Fedora sudo dnf install -y docker sudo systemctl start docker sudo systemctl enable docker sudo usermod -aG docker $USER # Установка Make sudo yum install -y make # ΠΈΠ»ΠΈ для Fedora sudo dnf install -y make ``` ### macOS ```bash # Установка Ρ‡Π΅Ρ€Π΅Π· Homebrew brew install docker brew install make # Или установка Docker Desktop # Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ с https://www.docker.com/products/docker-desktop # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° установки docker --version make --version ``` ### Windows ```bash # Π§Π΅Ρ€Π΅Π· WSL2 (рСкомСндуСтся) wsl --install # Π—Π°Ρ‚Π΅ΠΌ Π² WSL2: sudo apt-get update sudo apt-get install -y docker.io make # Или Ρ‡Π΅Ρ€Π΅Π· Git Bash # УстановитС Docker Desktop ΠΈ Git for Windows # Make поставляСтся с Git for Windows ``` ## 7. ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ### ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ```bash # ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ make docker print-config # ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠ±Ρ€Π°Π·Π΅ make docker inspect # ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π»ΠΎΠ³ΠΎΠ² сборки tail -f logs/build_20240115_143022.log ``` ### ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ```bash # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° вСрсии Java make docker check RUN_CMD="java -version" # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° вСрсии Node.js make docker check RUN_CMD="node --version" # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° доступности сСрвиса make docker check RUN_CMD="curl -f http://localhost:8080/health" # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния make docker check RUN_CMD="env | grep -E 'VERSION|NODE_ENV'" ``` ## 8. ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ сцСнарии ### Π‘Π±ΠΎΡ€ΠΊΠ° с кастомным Dockerfile ```bash # Π‘Π±ΠΎΡ€ΠΊΠ° с Dockerfile.prod make docker build \ IMAGE=myapp \ TAG1=production \ DOCKERFILE=Dockerfile.prod # Π‘Π±ΠΎΡ€ΠΊΠ° с контСкстом Π² ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠ΅ make docker build \ IMAGE=myapp \ TAG1=v1.0.0 \ CONTEXT=./app ``` ### Π Π°Π±ΠΎΡ‚Π° с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ registry ```bash # Π‘Π±ΠΎΡ€ΠΊΠ° для локального registry make docker build \ IMAGE=myapp \ TAG1=v1.0.0 \ REGISTRY=localhost:5000 # Π‘Π±ΠΎΡ€ΠΊΠ° для Docker Hub make docker build \ IMAGE=myapp \ TAG1=v1.0.0 \ REGISTRY=myusername # Π‘Π±ΠΎΡ€ΠΊΠ° для GitLab Registry make docker build \ IMAGE=myapp \ TAG1=v1.0.0 \ REGISTRY=registry.gitlab.com/myproject ``` ### Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π³Π°ΠΌΠΈ ```bash # ΠŸΠ΅Ρ€Π΅Ρ‚Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° (локально) make docker retag NEW_TAG=v2.0.0 # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ‚Π΅Π³ΠΎΠ² make docker retag NEW_TAG=latest make docker retag NEW_TAG=stable make docker retag NEW_TAG=2024.01.15 # ΠŸΡƒΠ»Π» ΠΎΠ±ΠΎΠΈΡ… Ρ‚Π΅Π³ΠΎΠ² make docker pull IMAGE=myapp TAG1=latest TAG2=v2.0.0 REGISTRY=hub.cism-ms.ru/library # ΠŸΠ΅Ρ€Π΅ΡΠ±ΠΎΡ€ΠΊΠ° Π±Π΅Π· кэша с двумя Ρ‚Π΅Π³Π°ΠΌΠΈ make docker rebuild IMAGE=myapp TAG1=latest TAG2=v2.0.0 ``` ## 9. ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΠΈ обслуТиваниС ### ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ```bash # ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π»ΠΎΠ³ΠΎΠ² ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² make docker clean # ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Docker систСмы (Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ) docker system prune -f docker image prune -f ``` ### Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π°ΠΌΠΈ ```bash # ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ сохранСнных Π°Ρ€Ρ…ΠΈΠ²ΠΎΠ² ls -la images/ # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° цСлостности Π°Ρ€Ρ…ΠΈΠ²Π° sha256sum -c images/myapp_v1.0.0.tar.gz.sha256 # Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ старых Π°Ρ€Ρ…ΠΈΠ²ΠΎΠ² find images/ -name "*.tar.gz" -mtime +30 -delete ```