Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½ΡƒΠŸΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ
Найти Π² Π”Π·Π΅Π½Π΅
Анастасия Π‘ΠΎΡ„Ρ‚

🐳 Docker для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²: ΠΊΠ°ΠΊ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ своё ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

ΠΈΠ»ΠΈ «Как Π½Π΅ ΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ β€œΠ£ мСня Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, хотя я скопировал Ρ‚Π²ΠΎΠΉ код”» "Если Π±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запуск ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π» установки дСсятка зависимостСй β€” ΠΌΠΈΡ€ Π±Ρ‹Π» Π±Ρ‹ Π΄ΠΎΠ±Ρ€Π΅Π΅."
β€” ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π³ΠΎΡ€Π΅Π»ΠΎ Docker β€” это ΠΊΠ°ΠΊ «магичСский Ρ‡Π΅ΠΌΠΎΠ΄Π°Π½Ρ‡ΠΈΠΊΒ», Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Ρ‹ ΠΊΠ»Π°Π΄Ρ‘ΡˆΡŒ свой ΠΊΠΎΠ΄, зависимости, ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π°ΠΆΠ΅ систСму.
ΠšΡ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ‡Π΅ΠΌΠΎΠ΄Π°Π½Ρ‡ΠΈΠΊ β€” ΠΈ всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅. print("ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΈΠ· Docker!") # Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· с Python
FROM python:3.10-slim
# ΠšΠ»Π°Π΄Ρ‘ΠΌ Ρ„Π°ΠΉΠ» Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°
COPY main.py .
# Команда ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
CMD ["python", "main.py"] docker build -t hello-docker .
docker run hello-docker πŸ—£οΈ ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ:
Π’Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ запустил Python-скрипт Π²Π½ΡƒΡ‚Ρ€ΠΈ своСго Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠ»ΡƒΠ±! flask_app/
β”œβ”€β”€ app.py
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ Dockerfile from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΈΠ· Flask Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅!" Flask==2.3.2 FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r
ОглавлСниС

ΠΈΠ»ΠΈ «Как Π½Π΅ ΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ β€œΠ£ мСня Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, хотя я скопировал Ρ‚Π²ΠΎΠΉ код”»

 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 β€” ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ящик ΠŸΠ°Π½Π΄ΠΎΡ€Ρ‹

Если интСрСсно, оставляй ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ β€” Π½Π°ΠΏΠΈΡˆΡƒ πŸ˜„