354 lines
8.6 KiB
Markdown
354 lines
8.6 KiB
Markdown
# 💡 Лучшие практики
|
||
|
||
## 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
|
||
```
|