DevOps
Docker для разработчика: практическое руководство
Как использовать Docker в разработке: docker-compose, мультистейдж сборки, оптимизация образов и отладка контейнеров.
ИК
Игор Кривошей
Full-stack инженер
20 февраля 2026 г.·8 мин

Зачем разработчику Docker?
Docker решает классическую проблему "работает на моей машине":
- Одинаковое окружение — от development до production
- Изоляция зависимостей — разные версии на одной машине
- Быстрый onboarding — новый разработчик запускает проект за минуты
- Масштабируемость — горизонтальное масштабирование
Базовый docker-compose.yml
YAML
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgresql://user:pass@db:5432/app
volumes:
- .:/app
- /app/node_modules
depends_on:
- db
- redis
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: app
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:Мультистейдж Dockerfile
Оптимизация размера образа:
Dockerfile
# Этап сборки
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Этап production
FROM node:20-alpine AS production
WORKDIR /app
ENV NODE_ENV=production
# Только production зависимости
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
# Копируем собранное приложение
COPY /app/dist ./dist
USER node
EXPOSE 3000
CMD ["node", "dist/main.js"]Оптимизация образов
Многоэтапная сборка
Разделяйте build и runtime:
- Builder этап: все инструменты, компиляция
- Runtime этап: только необходимое для работы
Alpine базовые образы
Dockerfile
# Вместо
FROM node:20 # ~1GB
# Используйте
FROM node:20-alpine # ~180MB.dockerignore
node_modules
.git
.env
.env.local
.next
dist
*.log
.DS_Store
README.md
.github
.vscodeОтладка контейнеров
Просмотр логов
Bash
# Все логи сервиса
docker-compose logs -f app
# Последние 100 строк
docker-compose logs --tail=100 appВход в контейнер
Bash
# Интерактивный shell
docker-compose exec app sh
# Выполнить команду
docker-compose exec app npm run migrateПросмотр ресурсов
Bash
# Статистика по контейнерам
docker stats
# Подробная информация
docker system dfРазработка с hot reload
Для Node.js/Next.js:
YAML
services:
app:
build: .
volumes:
- .:/app
- /app/node_modules
environment:
- CHOKIDAR_USEPOLLING=true
command: npm run devБезопасность
Не запускайте от root
Dockerfile
# Создаем пользователя
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
USER nodejsСканирование уязвимостей
Bash
# Docker Scout
docker scout quickview myapp:latest
# Trivy
trivy image myapp:latestПродвинутые техники
Health checks
Dockerfile
HEALTHCHECK \
CMD curl -f http://localhost:3000/health || exit 1Graceful shutdown
JAVASCRIPT
// Обработка сигналов
process.on('SIGTERM', () => {
console.log('SIGTERM received, shutting down gracefully');
server.close(() => {
process.exit(0);
});
});Заключение
Docker стал стандартом индустрии:
- Упрощает разработку и деплой
- Гарантирует консистентность окружения
- Ускоряет масштабирование
- Интегрируется с CI/CD
Начните с docker-compose.yml для разработки и постепенно усложняйте инфраструктуру.
Теги
DockerDevOpsBackendInfrastructure