или «Как не слышать “У меня не работает, хотя я скопировал твой код”»
"Если бы каждый запуск проекта не требовал установки десятка зависимостей — мир был бы добрее."
— каждый разработчик, у которого горело
💡 Зачем вообще нужен Docker?
Docker — это как «магический чемоданчик», в который ты кладёшь свой код, зависимости, окружение и даже систему.
Кто угодно потом открывает чемоданчик — и всё работает точно так же.
📦 Что сделаем в статье?
- Запустим первый Python-скрипт в Docker
- Контейнеризируем Flask-приложение
- Подключим БД (PostgreSQL)
- Используем docker-compose
- Разберём Dockerfile на запчасти
- Потренируемся в деплое
- И всё это с реальными примерами и пояснениями к коду
🧪 Пример 1: Первый скрипт в Docker
main.py
print("Привет из Docker!")
🐳 Dockerfile
# Базовый образ с Python
FROM python:3.10-slim
# Кладём файл внутрь контейнера
COPY main.py .
# Команда по умолчанию
CMD ["python", "main.py"]
📦 Построим образ и запустим
docker build -t hello-docker .
docker run hello-docker
🗣️ Комментарий:
Ты только что запустил Python-скрипт внутри своего личного контейнера. Добро пожаловать в клуб!
🧪 Пример 2: Контейнеризируем Flask-приложение
📁 Структура:
flask_app/
├── app.py
├── requirements.txt
├── Dockerfile
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Привет из Flask в контейнере!"
requirements.txt
Flask==2.3.2
🐳 Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
🚀 Запуск
docker build -t flask-docker .
docker run -p 5000:5000 flask-docker
Открой в браузере: http://localhost:5000
🗣️ Комментарий:
Ты только что поднял веб-сервер в контейнере. Flask работает не у тебя локально, а в карманной виртуальной машине.
🧪 Пример 3: Flask + PostgreSQL = ❤️
📁 Структура проекта:
project/
├── app/
│ ├── app.py
│ └── requirements.txt
├── docker-compose.yml
├── Dockerfile
app/app.py
from flask import Flask
import psycopg2
app = Flask(__name__)
@app.route("/")
def hello():
conn = psycopg2.connect(
host="db", database="mydb", user="user", password="pass"
)
cur = conn.cursor()
cur.execute("SELECT version();")
version = cur.fetchone()
return f"PostgreSQL версия: {version[0]}"
app/requirements.txt
Flask
psycopg2-binary
🐳 Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY app/requirements.txt .
RUN pip install -r requirements.txt
COPY app .
CMD ["python", "app.py"]
⚙️ docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
🚀 Запуск
docker-compose up --build
🗣️ Комментарий:
Теперь у тебя полноценный стек Flask + PostgreSQL в контейнерах. Ты управляешь всем проектом одной командой.
🧪 Пример 4: Разделяем dev и prod окружения
Dockerfile.dev
FROM python:3.10
WORKDIR /code
COPY app/requirements.txt .
RUN pip install -r requirements.txt
COPY app .
CMD ["flask", "run", "--host=0.0.0.0"]
Dockerfile.prod
FROM python:3.10-slim
WORKDIR /app
COPY app/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app .
CMD ["gunicorn", "app:app", "-b", "0.0.0.0:5000"]
🗣️ Комментарий:
На деве можно позволить себе больше логов, debug=True и перезапуск по сохранению. В проде — только надёжность и Gunicorn.
🧪 Пример 5: Собираем фронт + бэкенд в одном Docker Compose
version: "3.9"
services:
backend:
build:
context: .
dockerfile: Dockerfile.backend
ports:
- "5000:5000"
frontend:
build:
context: ./frontend
ports:
- "3000:3000"
🗣️ Комментарий:
Хочешь React + Flask — Docker помогает держать и фронт, и бэк в порядке.
🛠 Советы по Docker’у:
✅ Каждый проект — свой образ. Не бойся иметь 100 образов
✅ Тестируй внутри контейнера (docker exec -it контейнер bash)
✅ Не храни секреты в Dockerfile — используй .env, secrets
✅ Меньше слоёв = быстрее билд
✅ .dockerignore — как .gitignore, только для сборки
🧾 Резюме
🔚 А дальше?
Хочешь больше? Могу подготовить:
- Шаблон продакшн-сборки (Flask + Nginx + Gunicorn + Postgres)
- Как деплоить Docker-контейнеры на сервер
- Как делать CI/CD с GitHub Actions и Docker
- Или перейти к Kubernetes — и открыть ящик Пандоры
Если интересно, оставляй комментарий — напишу 😄