Найти в Дзене
Анастасия Софт

🐳 Docker для разработчиков: как контейнеризировать своё приложение

Оглавление

или «Как не слышать “У меня не работает, хотя я скопировал твой код”»

 Docker для разработчиков: как контейнеризировать своё приложение
Docker для разработчиков: как контейнеризировать своё приложение

"Если бы каждый запуск проекта не требовал установки десятка зависимостей — мир был бы добрее."

— каждый разработчик, у которого горело

💡 Зачем вообще нужен 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, только для сборки

🧾 Резюме

-2

🔚 А дальше?

Хочешь больше? Могу подготовить:

  • Шаблон продакшн-сборки (Flask + Nginx + Gunicorn + Postgres)
  • Как деплоить Docker-контейнеры на сервер
  • Как делать CI/CD с GitHub Actions и Docker
  • Или перейти к Kubernetes — и открыть ящик Пандоры

Если интересно, оставляй комментарий — напишу 😄