
Docker — это программа для создания и запуска приложений в изолированных блоках, которые называются контейнерами. Главные части Docker — это контейнеры, образы и Dockerfile.
Если вы только начинаете путь в IT и пишете на Python, вы наверняка сталкивались с этим: вы написали бота или веб-приложение, оно отлично бегает у вас на ноутбуке, а когда вы отправляете его коллеге или заливаете на сервер — всё падает с ошибками. Знакомо? Тогда давайте разбираться с Docker. И сделаем это на живом примере.
Docker для чайников: Как подружить Python-код с контейнерами (и забыть о слове «у меня не работает»)
Проблема: «У меня же работало!»
Представьте, что вы повар. Вы приготовили идеальный суп на своей кухне. У вас есть своя плита, свои специи, свои кастрюли. Вы даете рецепт другу, а у него газовая плита, другая сковорода, и он вместо соли сыплет сахар. Суп испорчен.
В программировании то же самое:
- У вас Python 3.11, а на сервере — 3.8 (и ваш код с
match-caseсыпется). - У вас Windows, а на сервере Linux (и пути к папкам разные).
- Вы используете библиотеку
requestsверсии 2.28, а сервер поставил 2.20 (и методjson()работает иначе).
Итог: код работает у одного — ломается у другого. Это называется «проблема воспроизводимости».
Решение: Docker упаковывает всё с собой
Docker говорит: «Не полагайся на кухню! Бери с собой не только суп, но и всю плиту, и даже воздух». Он упаковывает ваше Python-приложение + все библиотеки + нужную версию Python + системные настройки в изолированный бокс — контейнер.
И этот контейнер работает одинаково на любом компьютере: у вас дома, у коллеги и на сервере в облаке.
Практика: Ваш первый Python-код в Docker
Давайте напишем простой скрипт и «законтейнерим» его. Никакой магии, только 4 простых шага.
Шаг 1. Напишем простой Python-скрипт
Создание Python-скрипта
Цель: Написать простой скрипт, который зависит от внешней библиотеки.
Что потребуется
1. Создание скрипта
Создайте файл app.py и напишите в нём:
Внимание!
Убедитесь, что файл называется именно app.py — это важно для следующих шагов.
# app.py
import requests
from datetime import datetime
def get_weather():
"""Простая функция, которая говорит, какая погода (всегда хорошая)"""
current_time = datetime.now().strftime("%H:%M")
response = requests.get("https://api.github.com/zen")
return f"Время: {current_time}. Сегодня отличный день для кода! Мудрость от GitHub: {response.text}"
if __name__ == "__main__":
print(get_weather())
Результат
Скрипт создан: Готов к упаковке в Docker.
Шаг 2. Скажем Python, какие библиотеки нужны
Создание зависимостей
Цель: Зафиксировать версии библиотек, чтобы окружение было воспроизводимым.
Что потребуется
1. Создание requirements.txt
Создайте файл requirements.txt в той же папке:
Внимание!
Всегда указывайте точные версии библиотек — это гарантирует стабильность.
requests==2.28.1
Результат
Зависимости описаны: Docker будет знать, что устанавливать.
Шаг 3. Пишем рецепт для Docker (Dockerfile)
Создание Dockerfile
Цель: Написать инструкцию для Docker, как собрать контейнер с вашим приложением.
Что потребуется
1. Создание Dockerfile
Создайте файл Dockerfile (без расширения) и напишите:
Внимание!
Имя файла должно быть точно Dockerfile — без расширения.
# Берём официальный образ Python
FROM python:3.11-slim
# Создаём папку внутри контейнера
WORKDIR /app
# Копируем файл с зависимостями
COPY requirements.txt .
# Устанавливаем библиотеки внутри контейнера
RUN pip install --no-cache-dir -r requirements.txt
# Копируем весь код
COPY . .
# Запускаем скрипт
CMD ["python", "app.py"]
Результат
Рецепт готов: Docker знает, что делать.
Шаг 4. Строим и запускаем контейнер
Сборка и запуск
Цель: Собрать образ и запустить контейнер с вашим приложением.
Что потребуется
1. Сборка образа
Откройте терминал в папке с файлами и выполните:
Внимание!
Если вы на Windows, используйте PowerShell или CMD от имени администратора.
docker build -t my-python-app .
2. Запуск контейнера
Запустите контейнер из собранного образа:
Внимание!
Точка в конце команды означает «текущая папка».
docker run my-python-app
Результат
Контейнер запущен: Ваш Python-скрипт работает внутри изолированной среды!
Вот и всё! Вы увидите вывод вашей программы. Попробуйте изменить код или зависимости — пересоберите образ заново, и всё будет работать.
Что произошло под капотом?
FROM python:3.11-slim— Docker скачал с Docker Hub (бесплатный магазин образов) легкий Linux + Python 3.11. Всего 100 МБ — и у вас уже готовая среда.COPY . .— ваш код оказался внутри контейнера.RUN pip install— библиотеки установились внутри контейнера, не трогая ваш основной компьютер.docker run— контейнер запустился и выполнил скрипт.
Жизненный пример: Ваш чат-бот на Flask
Допустим, вы написали простой веб-сервер на Flask:
Flask в контейнере
Цель: Запустить веб-приложение на Flask внутри контейнера.
Что потребуется
1. Flask-приложение
Создайте app.py для веб-сервера:
Внимание!
Flask нужно добавить в requirements.txt.
# app.py для веб-сервера
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Привет! Я работаю внутри Docker-контейнера!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
2. Запуск Flask в Docker
Добавьте в requirements.txt строчку flask==2.2.3 и запустите контейнер с пробросом порта:
Внимание!
Проброс порта -p 5000:5000 нужен, чтобы видеть сайт в браузере.
docker run -p 5000:5000 my-python-app
Результат
Сайт работает: Откройте браузер на localhost:5000 и увидите ваше приложение!
Сложные проекты: когда нужен не только Python
В реальных проектах редко бывает только Python. Обычно есть база данных, Redis для кеша, может быть, какой-нибудь Nginx.
Тут на помощь приходит docker-compose.
Мультиконтейнерные проекты
Цель: Запустить Python-приложение и базу данных PostgreSQL в отдельных контейнерах.
Что потребуется
1. docker-compose.yml
Создайте файл docker-compose.yml:
Внимание!
Контейнеры видят друг друга по имени сервиса (например, db).
version: '3'
services:
app:
build: .
ports:
- "5000:5000"
depends_on:
- db
environment:
- DB_HOST=db
db:
image: postgres:14
environment:
POSTGRES_PASSWORD: secret
POSTGRES_DB: mydb
2. Запуск всех сервисов
Запустите всё одной командой:
Внимание!
Команда docker-compose up поднимет все сервисы разом.
docker-compose up
Результат
Всё работает: Приложение и база данных запущены и общаются друг с другом.
Что вы получаете как новичок
- Чистый компьютер. Никакого мусора от десятков библиотек и баз данных. Удалил контейнер — и система как новая.
- Портабельность. Ваш проект — это просто папка с
Dockerfileиrequirements.txt. Залил на сервер, запустилdocker build— и оно работает. - Быстрый старт. Нужно попробовать новую библиотеку? Просто добавьте её в
requirements.txt, пересоберите контейнер — и всё. Без риска сломать другие проекты.
5 команд Docker, которые нужно знать новичку
|
Команда
|
Что делает
|
|---|---|
|
docker build -t myapp .
|
Собрать образ из Dockerfile
|
|
docker run myapp
|
Запустить контейнер из образа
|
|
docker ps
|
Посмотреть, какие контейнеры сейчас работают
|
|
docker stop
|
Остановить контейнер
|
|
docker rmi
|
Удалить образ (если он больше не нужен)
|
Итог
Docker — это способ сказать компьютеру: «Сделай для этой Python-программы отдельную чистую комнату, дай ей именно ту версию интерпретатора и те библиотеки, которые она любит, и не трогай то, что работает у меня на основном столе».
Начните с малого: возьмите любой свой скрипт, добавьте requirements.txt и самый простой Dockerfile. Потратьте на это 15 минут. Как только вы увидите, как ваш код запускается в изолированном контейнере — вы почувствуете себя настоящим инженером и больше никогда не захотите мучиться с настройкой окружения вручную!
Docker — это не сложно. Это просто новый способ думать о разработке. Удачи!



