Docker решает одну из самых распространённых проблем в разработке: «У меня работает, а на сервере нет».
Корень проблемы
Когда ты запускаешь код локально, он работает в конкретном окружении: своя версия Python, свои библиотеки, своя ОС. На сервере — другая версия Python, другие версии пакетов, другая ОС. Код «упадёт» даже если ты ничего не сломал.
Классический сценарий: ты написал приложение на Python 3.11, у коллеги стоит Python 3.9, на CI — 3.10, на проде — 3.8. Где-то match не работает, где-то нет нужного пакета, где-то systemd блокирует порт. Каждое окружение — отдельный источник сюрпризов.
Что такое Docker
Docker — это инструмент для запуска приложений в контейнерах. Контейнер содержит всё необходимое: код, runtime, библиотеки, системные зависимости. Одна и та же коробка запускается одинаково везде — на твоём Mac, на сервере коллеги и в облаке.
Аналогия: грузовой контейнер. Всё упаковано внутри. Перевози хоть на корабле, хоть на поезде, хоть на грузовике — содержимое не изменится.
Образ и контейнер
- Образ (image) — неизменяемый шаблон. Как класс в ООП или установочный диск.
- Контейнер — запущенный экземпляр образа. Как объект, созданный из класса.
Один образ → много контейнеров. Удалил контейнер — образ остался.
Контейнер vs Виртуальная машина
| Виртуальная машина | Docker контейнер | |
|---|---|---|
| Что изолирует | Целый компьютер (ядро, память, диск) | Только процессы |
| Размер | Гигабайты | Мегабайты |
| Запуск | Минуты | Секунды |
| Использует ядро хоста | Нет | Да |
Контейнер не эмулирует железо — он использует ядро хост-системы, изолируя только процессы. Поэтому быстрее и легче.
Кратко о разнице:
- ВМ запускает полноценную ОС со своим ядром — изоляция максимальная, но цена — гигабайты RAM и минуты старта
- Docker использует ядро хоста, изолирует только пространство процессов — легко, быстро, достаточно для большинства задач
- ВМ нужна когда требуется другая ОС (Windows-контейнер на Linux-хосте); Docker — когда нужно изолировать приложение
Docker vs virtualenv
virtualenv изолирует только Python-библиотеки. Docker изолирует всё: версию Python, системные пакеты, порты, файловую систему. Docker работает не только с Python.
Простой 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"]
Собрать образ и запустить контейнер:
# Собрать образ с тегом myapp
docker build -t myapp .
# Запустить контейнер, пробросить порт 8000 хоста → 8000 контейнера
docker run -p 8000:8000 myapp
Флаг -p 8000:8000 означает: трафик на порт 8000 твоей машины перенаправляется в порт 8000 контейнера. Без этого флага приложение работает, но недоступно снаружи контейнера.
Реальный сценарий
Ты разрабатываешь Django-приложение. Без Docker:
- Новый разработчик клонирует репо
- Устанавливает Python (возможно, не ту версию)
- Создаёт virtualenv, ставит зависимости
- Устанавливает PostgreSQL, настраивает пользователя и базу
- Прописывает переменные окружения
- Где-то на шаге 3–4 что-то идёт не так
С Docker:
git clone https://github.com/example/myapp
docker compose up
Готово. Та же версия Python, та же PostgreSQL, те же переменные — у всех в команде.
Что даёт Docker разработчику
- Одинаковое окружение у всей команды
- Мгновенный запуск баз данных и сервисов
- Безопасные эксперименты — сломал контейнер, удалил, создал новый
- Простой деплой: собрал образ, отправил, запустил
- Новый участник команды onboarding сводится к одной команде
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!