Переписана документация

This commit is contained in:
Сергей Антропов
2025-10-29 14:47:35 +03:00
parent e466f14d49
commit e4e23b88ca
10 changed files with 2528 additions and 403 deletions

222
docs/dockerfile.md Normal file
View File

@@ -0,0 +1,222 @@
# 🐳 Dockerfile
## Особенности
- **Базовый образ:** Ubuntu 22.04 (настраивается через ARG)
- **Предустановленные утилиты:** curl, wget, nano, mc, net-tools, ping и др.
- **Оптимизированный размер:** удаление кэша apt после установки
- **Безопасность:** возможность создания непривилегированного пользователя
- **Гибкость:** легко расширяется под конкретные нужды
## Использование
```bash
# Сборка с базовым образом Ubuntu 22.04
make docker build IMAGE=myapp TAG=latest
# Сборка с другим базовым образом
make docker build IMAGE=myapp TAG=latest BUILD_ARGS="--build-arg BASE_IMAGE=ubuntu:20.04"
# Сборка без кэша
make docker build IMAGE=myapp TAG=latest NO_CACHE=1
```
## Структура Dockerfile
```dockerfile
# Базовый образ (настраивается)
ARG BASE_IMAGE=ubuntu:22.04
FROM ${BASE_IMAGE}
# Метаданные
LABEL maintainer="Sergey Antropov <devops@devops.org.ru>"
# Настройки окружения
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
ENV 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
```
## Расширение Dockerfile
### Добавление пользователя
```dockerfile
# Создание непривилегированного пользователя
RUN useradd -ms /bin/bash appuser && \
chown -R appuser:appuser /app
USER appuser
```
### Добавление портов
```dockerfile
# Открытие портов
EXPOSE 8080
EXPOSE 3000
```
### Добавление переменных окружения
```dockerfile
# Переменные для приложения
ENV APP_HOME=/app
ENV PATH="$PATH:/app/bin"
ENV NODE_ENV=production
```
### Добавление команды по умолчанию
```dockerfile
# Команда по умолчанию
CMD ["bash"]
# или
CMD ["npm", "start"]
```
## Примеры использования
### Базовое использование
```bash
# Простая сборка
make docker build IMAGE=myapp TAG=latest
# Сборка с проверкой
make docker build IMAGE=myapp TAG=v1.0.0
make docker check RUN_CMD="lsb_release -a"
```
### Сборка с аргументами
```bash
# Передача переменных в Dockerfile
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
BUILD_ARGS="--build-arg VERSION=1.0.0 --build-arg NODE_ENV=production"
```
### Сборка с файлом аргументов
```bash
# Создание файла build.args
cat > build.args << EOF
VERSION=1.0.0
BUILD_DATE=2024-01-15
NODE_ENV=production
EOF
# Сборка с файлом аргументов
make docker build IMAGE=myapp TAG=v1.0.0 ARG_FILE=build.args
```
## Оптимизация Dockerfile
### Многоэтапная сборка
```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
```
### Минимизация слоев
```dockerfile
# Плохо - много слоев
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget
RUN apt-get clean
# Хорошо - один слой
RUN apt-get update && \
apt-get install -y curl wget && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
```
## Безопасность
### Использование непривилегированного пользователя
```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
```
### Обновление пакетов
```dockerfile
# Обновление всех пакетов
RUN apt-get update && \
apt-get upgrade -y && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
```
## Отладка
### Просмотр истории сборки
```bash
# История слоев
docker history myapp:latest
# Детальная информация
docker image inspect myapp:latest
```
### Интерактивная отладка
```bash
# Запуск интерактивного контейнера
docker run -it --rm myapp:latest /bin/bash
# Запуск с отладкой
docker run -it --rm \
-p 8080:8080 \
-e DEBUG=1 \
myapp:latest
```
### Анализ размера образа
```bash
# Анализ слоев
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive:latest myapp:latest
```