Files
Dockerfile/docs/best-practices.md
2025-10-29 14:47:35 +03:00

354 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 💡 Лучшие практики
## 1. Управление версиями
### Семантическое версионирование
```bash
# Основные версии
TAG=v1.0.0 # Стабильная версия
TAG=v1.1.0 # Новая функциональность
TAG=v1.1.1 # Исправления ошибок
# Предварительные версии
TAG=v1.2.0-alpha.1
TAG=v1.2.0-beta.1
TAG=v1.2.0-rc.1
# Специальные теги
TAG=latest # Последняя стабильная
TAG=dev # Разработка
TAG=stable # Стабильная ветка
```
### Автоматическое версионирование
```bash
# Использование Git commit hash
TAG=$(git rev-parse --short HEAD)
# Использование даты
TAG=$(date +%Y%m%d-%H%M%S)
# Использование Git тегов
TAG=$(git describe --tags --always)
```
## 2. Безопасность
### Использование непривилегированного пользователя
```dockerfile
# В Dockerfile
RUN useradd -ms /bin/bash appuser
USER appuser
```
### Сканирование образов
```bash
# Проверка уязвимостей
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image myapp:latest
# Проверка с детальным отчетом
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --severity HIGH,CRITICAL myapp:latest
```
## 3. Оптимизация сборки
### Многоэтапная сборка
```dockerfile
# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# Production stage
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["npm", "start"]
```
### Использование .dockerignore
```dockerfile
# .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.nyc_output
.coverage
```
## 4. Мониторинг и логирование
### Структурированные логи
```bash
# Создание логов с метаданными
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
BUILD_ARGS="--build-arg BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
LOG_DIR=./build-logs
```
### Мониторинг размера образов
```bash
# Просмотр размера образа
docker images myapp:latest
# Детальная информация
docker history myapp:latest
# Анализ слоев
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive:latest myapp:latest
```
## 5. Оптимизация производительности
### Кэширование слоев Docker
```bash
# Сборка с использованием кэша
make docker build IMAGE=myapp TAG=v1.0.0
# Сборка без кэша (для чистых сборок)
make docker build IMAGE=myapp TAG=v1.0.0 NO_CACHE=1
# Принудительное обновление базовых образов
make docker build IMAGE=myapp TAG=v1.0.0 PULL=1
```
### Параллельная сборка
```bash
# Сборка нескольких образов параллельно
make docker build IMAGE=frontend TAG=v1.0.0 &
make docker build IMAGE=backend TAG=v1.0.0 &
make docker build IMAGE=worker TAG=v1.0.0 &
wait
# Проверка результатов
docker images | grep -E "(frontend|backend|worker)"
```
### Оптимизация размера образов
```bash
# Сборка с минимальным размером
make docker build \
IMAGE=myapp \
TAG=minimal \
BUILD_ARGS="--build-arg BUILDKIT_INLINE_CACHE=1"
# Сжатие образов
make docker save \
SRC_IMAGE=myapp:latest \
COMPRESS=1
```
## 6. Управление зависимостями
### Создание базового образа
```bash
# Сборка базового образа
make docker build \
IMAGE=base-image \
TAG=ubuntu-22.04 \
DOCKERFILE=Dockerfile.base
# Использование базового образа
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
BUILD_ARGS="--build-arg BASE_IMAGE=base-image:ubuntu-22.04"
```
### Управление зависимостями
```bash
# Обновление базовых образов
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
PULL=1
# Проверка обновлений
docker pull ubuntu:22.04
```
## 7. Отладка и тестирование
### Тестирование образов
```bash
# Запуск тестов в контейнере
make docker check RUN_CMD="npm test"
# Проверка конфигурации
make docker check RUN_CMD="nginx -t"
# Проверка портов
make docker check RUN_CMD="netstat -tlnp"
```
### Интерактивная отладка
```bash
# Запуск интерактивного контейнера
docker run -it --rm myapp:latest /bin/bash
# Запуск с отладкой
docker run -it --rm \
-p 8080:8080 \
-e DEBUG=1 \
myapp:latest
```
## 8. Мониторинг производительности
### Измерение времени сборки
```bash
# Время сборки
time make docker build IMAGE=myapp TAG=v1.0.0
# Детальная статистика
make docker build IMAGE=myapp TAG=v1.0.0 2>&1 | tee build.log
```
### Мониторинг ресурсов
```bash
# Использование ресурсов контейнеров
docker stats --no-stream myapp-container
# Анализ размера образов
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
```
## 9. Организация проекта
### Структура файлов
```
project/
├── Dockerfile
├── makefile
├── .dockerignore
├── build.args
├── Makefile.local
├── docs/
│ ├── installation.md
│ ├── dockerfile.md
│ ├── makefile.md
│ ├── examples.md
│ └── best-practices.md
├── logs/
├── images/
└── .offline/
```
### Управление конфигурацией
```bash
# Создание Makefile.local для проекта
cat > Makefile.local << EOF
REGISTRY=my-registry.com
IMAGE=my-project
TAG=dev
NO_CACHE=0
QUIET=0
EOF
# Использование конфигурации
make docker build # Использует настройки из Makefile.local
```
## 10. Резервное копирование
### Регулярное сохранение образов
```bash
# Создание скрипта для ежедневного бэкапа
cat > backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d)
make docker save \
SRC_IMAGE=myapp:latest \
IMAGES_DIR=/backup/docker-images \
COMPRESS=1
EOF
chmod +x backup.sh
# Добавление в crontab
echo "0 2 * * * /path/to/backup.sh" | crontab -
```
### Восстановление из архива
```bash
# Восстановление образа
make docker load \
ARCHIVE=/backup/docker-images/myapp_latest.tar.gz \
REGISTRY=my-registry.com \
IMAGE=myapp \
TAG=restored \
LOGIN=1 \
PUSH_OFFLINE=1
```
## 11. Документирование
### Создание README для проекта
```bash
# Создание документации проекта
cat > PROJECT_README.md << 'EOF'
# My Project
## Быстрый старт
```bash
make docker build IMAGE=myapp TAG=latest
make docker push IMAGE=myapp TAG=latest
```
## Переменные окружения
- VERSION: Версия приложения
- NODE_ENV: Окружение (development/production)
EOF
```
### Комментирование Dockerfile
```dockerfile
# Базовый образ Ubuntu 22.04
ARG BASE_IMAGE=ubuntu:22.04
FROM ${BASE_IMAGE}
# Метаданные образа
LABEL maintainer="Sergey Antropov <devops@devops.org.ru>" \
description="Универсальный базовый образ" \
version="1.0"
# Настройки окружения для неинтерактивной установки
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Etc/UTC \
LANG=C.UTF-8
# Установка необходимых утилит
RUN apt-get update && \
apt-get install -y \
ca-certificates \
curl \
wget \
bash \
tzdata \
nano \
mc \
tar \
gzip \
unzip \
net-tools \
iputils-ping && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Установка рабочей директории
WORKDIR /app
```