Docker для начинающих: пошаговое руководство с примерами
2

Docker для начинающих: пошаговое руководство с примерами

Автор: admin

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-скрипта

Цель: Написать простой скрипт, который зависит от внешней библиотеки.

2 минут Начинающий

Что потребуется

Установленный Python (необязательно, Docker сделает всё сам)

1. Создание скрипта

Создайте файл app.py и напишите в нём:

Внимание!

Убедитесь, что файл называется именно app.py — это важно для следующих шагов.

python
# 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 минут Начинающий

Что потребуется

Созданный app.py

1. Создание requirements.txt

Создайте файл requirements.txt в той же папке:

Внимание!

Всегда указывайте точные версии библиотек — это гарантирует стабильность.

plaintext
requests==2.28.1

Результат

Зависимости описаны: Docker будет знать, что устанавливать.

Шаг 3. Пишем рецепт для Docker (Dockerfile)

Создание Dockerfile

Цель: Написать инструкцию для Docker, как собрать контейнер с вашим приложением.

3 минут Начинающий

Что потребуется

Файлы app.py и requirements.txt

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. Строим и запускаем контейнер

Сборка и запуск

Цель: Собрать образ и запустить контейнер с вашим приложением.

3 минут Начинающий

Что потребуется

Установленный Docker

1. Сборка образа

Откройте терминал в папке с файлами и выполните:

Внимание!

Если вы на Windows, используйте PowerShell или CMD от имени администратора.

bash
docker build -t my-python-app .

2. Запуск контейнера

Запустите контейнер из собранного образа:

Внимание!

Точка в конце команды означает «текущая папка».

bash
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 внутри контейнера.

3 минут Начинающий

Что потребуется

Docker установлен

1. Flask-приложение

Создайте app.py для веб-сервера:

Внимание!

Flask нужно добавить в requirements.txt.

python
# 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 нужен, чтобы видеть сайт в браузере.

bash
docker run -p 5000:5000 my-python-app

Результат

Сайт работает: Откройте браузер на localhost:5000 и увидите ваше приложение!

Сложные проекты: когда нужен не только Python

В реальных проектах редко бывает только Python. Обычно есть база данных, Redis для кеша, может быть, какой-нибудь Nginx.

Тут на помощь приходит docker-compose.

Мультиконтейнерные проекты

Цель: Запустить Python-приложение и базу данных PostgreSQL в отдельных контейнерах.

5 минут Средний

Что потребуется

Docker и Docker Compose установлены

1. docker-compose.yml

Создайте файл docker-compose.yml:

Внимание!

Контейнеры видят друг друга по имени сервиса (например, db).

yaml
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 поднимет все сервисы разом.

bash
docker-compose up

Результат

Всё работает: Приложение и база данных запущены и общаются друг с другом.

Что вы получаете как новичок

  1. Чистый компьютер. Никакого мусора от десятков библиотек и баз данных. Удалил контейнер — и система как новая.
  2. Портабельность. Ваш проект — это просто папка с Dockerfile и requirements.txt. Залил на сервер, запустил docker build — и оно работает.
  3. Быстрый старт. Нужно попробовать новую библиотеку? Просто добавьте её в requirements.txt, пересоберите контейнер — и всё. Без риска сломать другие проекты.

5 команд Docker, которые нужно знать новичку

Команды docker
Команда
Что делает
docker build -t myapp .
Собрать образ из Dockerfile
docker run myapp
Запустить контейнер из образа
docker ps
Посмотреть, какие контейнеры сейчас работают
docker stop
Остановить контейнер
docker rmi
Удалить образ (если он больше не нужен)

Итог

Docker — это способ сказать компьютеру: «Сделай для этой Python-программы отдельную чистую комнату, дай ей именно ту версию интерпретатора и те библиотеки, которые она любит, и не трогай то, что работает у меня на основном столе».

Начните с малого: возьмите любой свой скрипт, добавьте requirements.txt и самый простой Dockerfile. Потратьте на это 15 минут. Как только вы увидите, как ваш код запускается в изолированном контейнере — вы почувствуете себя настоящим инженером и больше никогда не захотите мучиться с настройкой окружения вручную!

Docker — это не сложно. Это просто новый способ думать о разработке. Удачи!