Files
Dockerfile/docs/best-practices.md

354 lines
8.6 KiB
Markdown
Raw Permalink 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
# Основной и дополнительный тег (двойное тегирование)
TAG1=latest TAG2=v1.0.0 # Рекомендуемый минимум: стабильный alias + версия
TAG1=stable TAG2=v1.1.0 # Пример для стабильной ветки
TAG1=dev # Разработка без второго тега
# Предрелизные версии
TAG1=rc TAG2=v1.2.0-rc.1
TAG1=beta TAG2=v1.2.0-beta.1
TAG1=alpha TAG2=v1.2.0-alpha.1
# Специальные алиасы
TAG1=latest
TAG1=stable
TAG1=dev
```
### Автоматическое версионирование
```bash
# Использование Git commit hash
TAG1=$(git rev-parse --short HEAD)
# Использование даты
TAG1=$(date +%Y%m%d-%H%M%S)
# Использование Git тегов
TAG1=$(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 \
TAG1=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 TAG1=v1.0.0
# Сборка без кэша (для чистых сборок)
make docker rebuild IMAGE=myapp TAG1=v1.0.0
# Принудительное обновление базовых образов
make docker build IMAGE=myapp TAG1=v1.0.0 PULL=1
```
### Параллельная сборка
```bash
# Сборка нескольких образов параллельно
make docker build IMAGE=frontend TAG1=v1.0.0 &
make docker build IMAGE=backend TAG1=v1.0.0 &
make docker build IMAGE=worker TAG1=v1.0.0 &
wait
# Проверка результатов
docker images | grep -E "(frontend|backend|worker)"
```
### Оптимизация размера образов
```bash
# Сборка с минимальным размером
make docker build \
IMAGE=myapp \
TAG1=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 \
TAG1=ubuntu-22.04 \
DOCKERFILE=Dockerfile.base
# Использование базового образа
make docker build \
IMAGE=myapp \
TAG1=v1.0.0 \
BUILD_ARGS="--build-arg BASE_IMAGE=base-image:ubuntu-22.04"
```
### Управление зависимостями
```bash
# Обновление базовых образов
make docker build \
IMAGE=myapp \
TAG1=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 TAG1=v1.0.0
# Детальная статистика
make docker build IMAGE=myapp TAG1=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
TAG1=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
```