Docker сегодня — это не просто «еще один инструмент», а фактически стандарт для разработки. Если ты до сих пор поднимаешь окружение руками — ты уже проигрываешь во времени.
Разберем без воды: что он дает, как использовать и где ускориться.
Зачем тебе Docker на практике
Docker закрывает сразу несколько болей разработчика:
-
Повторяемость окружения
Один раз настроил — у всех работает одинаково. Без «у меня на машине норм». -
Быстрый онбординг
Новый человек в команде →docker-compose up→ работает. Без танцев с зависимостями. -
Изоляция
Никаких конфликтов Python, Node, портов и библиотек. -
Нормальный CI/CD
Ты тестируешь ровно то же, что потом уедет в прод.
Контейнеризировать можно почти всё: API, базы, очереди, воркеры, тесты, даже сборку фронта.
База: как поднять проект
1. Dockerfile
Минимальный пример для Flask:
FROM python:3.11
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run", "--host=0.0.0.0"]
Ключевая мысль: зависимости ставим до копирования кода — иначе будешь пересобирать всё при каждом изменении.
2. docker-compose
Связываем приложение и базу:
version: "3.9"
services:
app:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=development
- DATABASE_URL=postgresql://user:password@db:5432/app_db
volumes:
- .:/app
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: app_db
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Запуск:
docker-compose up --build
И всё. У тебя уже мини-инфраструктура.
3. Команды, которые реально используешь
-
Зайти внутрь контейнера:
docker-compose run --rm app bash -
Логи:
docker-compose logs -f -
Снести всё (включая БД):
docker-compose down -v
Как ускориться (вот тут начинается магия)
Горячая перезагрузка
volumes:
- .:/app
Меняешь код → он сразу в контейнере.
Добавь reload — и забудь про пересборку.
Быстрые билды
Главное правило:
COPY requirements.txt ./
RUN pip install ...
COPY . .
Если поменял код — зависимости не пересобираются.
Экономия времени — в разы.
.dockerignore — underrated штука
__pycache__/
.git/
tests/
*.pyc
Меньше мусора → быстрее билд → меньше вес образа.
Переменные окружения
Не храни секреты в коде. Вообще никогда.
Используй .env:
DB_PASSWORD=secret
И подключай через ${} в compose.
CI/CD без боли
Простейший билд:
docker build -t app:ci .
Дальше можно:
-
пушить в registry
-
деплоить куда угодно
-
гонять тесты внутри контейнера
Частые проблемы (и как не беситься)
Порт занят
→ поменяй 5000:5000 на 5001:5000
Каждый раз долго ставится pip
→ ты сломал кэш Dockerfile (смотри порядок COPY)
База «забывает» данные
→ нет volume. Добавь pgdata
Нет связи между сервисами
→ используй имя сервиса (db), а не localhost
Как встроить Docker в повседневку
Вот реальный минимум, который даст тебе буст:
-
Добавь
docker-compose upв README -
Работай через volumes (без пересборок)
-
Настрой
.dockerignore -
Запускай тесты в контейнере
Честно про будущее
Если ты:
-
делаешь pet-проекты
-
работаешь в команде
-
хочешь масштабироваться
— без Docker ты упрешься в потолок очень быстро.
А если освоишь:
-
multi-stage сборки
-
оптимизацию образов
-
оркестрацию (K8s позже)
— это уже уровень, где ты начинаешь играть в «другую лигу».
