Docker и контейнеры: Практическое руководство для разработчиков
Привет! Если ты читаешь это, скорее всего, ты устал от фразы «у меня на машине работает». Ты — разработчик ПО, который хочет упаковать своё приложение со всеми зависимостями в аккуратный «чемодан», чтобы оно запускалось одинаково где угодно: на твоём ноутбуке, на сервере коллеги или в облаке. Этот «чемодан» и есть контейнер, а Docker — самый популярный инструмент для работы с ними.
В этой статье мы не будем углубляться в теорию виртуализации. Вместо этого я дам тебе чёткий, практический чек-лист и пошаговое руководство, как начать использовать Docker в своих проектах уже сегодня. К концу чтения у тебя будет работающее приложение в контейнере и понимание базового рабочего процесса.
Что тебе понадобится для старта
Прежде чем перейти к шагам, убедись, что у тебя есть следующее. Это наш фундамент.
- Базовые навыки командной строки (терминала). Не нужно быть гуру, но умение перемещаться по папкам и запускать команды обязательно.
- Установленный Docker. Перейди на официальный сайт Docker и скачай Docker Desktop для своей операционной системы (Windows, macOS, Linux). Установка интуитивно понятна — просто следуй инструкциям мастера.
- Проверка установки. Открой терминал и выполни команду:
docker --version
```
Если ты видишь номер версии (например, `Docker version 20.10.12`), значит, всё установлено корректно. Также проверь:
```bash
docker run hello-world
```
Эта команда скачает тестовый образ и запустит контейнер, который выведет приветственное сообщение. Если ты его видишь — Docker работает!
- Твой проект. Любое простое приложение, например, на Python (Flask/Django), Node.js или даже статический HTML-сайт. Мы будем использовать его для примера.
Готов? Отлично. Теперь перейдём к самому интересному.
Шаг 1: Создаём Dockerfile — инструкцию по сборке
Всё начинается с `Dockerfile`. Это текстовый файл без расширения, который содержит пошаговые инструкции для Docker о том, как собрать твой образ. Образ — это шаблон, а контейнер — это запущенный экземпляр этого образа.
Создай в корне своего проекта файл с именем `Dockerfile` и открой его в редакторе кода.
Пример для простого веб-приложения на Python (Flask):
```dockerfile
1. Базовый образ. Берём официальный легковесный образ Python.
FROM python:3.9-slim
2. Устанавливаем рабочую директорию внутри контейнера.
WORKDIR /app
3. Копируем файл с зависимостями в контейнер.
COPY requirements.txt .
4. Устанавливаем зависимости.
RUN pip install --no-cache-dir -r requirements.txt
5. Копируем весь остальной код проекта в рабочую директорию.
COPY . .
6. Объявляем порт, который будет использовать приложение.
EXPOSE 5000
7. Команда для запуска приложения при старте контейнера.
CMD ["python", "app.py"]
```
Что здесь происходит? Мы начинаем с готового образа (`python:3.9-slim`), настраиваем окружение, копируем код и указываем, как запустить приложение. Это основа 90% Dockerfile.
Шаг 2: Собираем Docker-образ
Теперь, имея инструкцию, нужно создать сам образ. В терминале, находясь в папке с твоим `Dockerfile`, выполни команду:
```bash
docker build -t my-python-app .
```
`docker build` — команда сборки.
`-t my-python-app` — флаг `-t` задаёт имя и тег твоего образа (здесь `my-python-app` — имя, тег по умолчанию `latest`).
`.` — точка в конце указывает на текущую директорию как на контекст сборки (где искать `Dockerfile` и файлы для `COPY`).
Docker будет выполнять инструкции из файла шаг за шагом. В конце ты увидишь сообщение об успешной сборке.
Проверь, что образ создался:
```bash
docker images
```
Ты увидишь список образов, включая `my-python-app`.
Шаг 3: Запускаем контейнер из образа
Образ готов — время его запустить! Контейнер — это живой, работающий процесс.
```bash
docker run -d -p 5000:5000 --name my-running-app my-python-app
```
`docker run` — команда запуска.
`-d` — запустить контейнер в фоновом режиме (detached).
`-p 5000:5000` — пробросить порт. Левая часть (`5000`) — порт на твоей машине, правая (`5000`) — порт внутри контейнера (который мы объявили в `EXPOSE`). Теперь твоё приложение доступно по адресу `http://localhost:5000`.
`--name my-running-app` — дать контейнеру удобное имя. Без этого Docker присвоит случайное (вроде `festive_mcclintock`).
`my-python-app` — имя образа, из которого нужно создать контейнер.
Проверь работающие контейнеры:
```bash
docker ps
```
Ты увидишь контейнер `my-running-app` в статусе `Up`. Зайди в браузере на `http://localhost:5000` — должно работать!
Шаг 4: Основные команды для управления контейнерами
Работа с Docker — это постоянное взаимодействие через терминал. Вот базовый набор команд:
Остановить контейнер:
```bash
docker stop my-running-app
```
Запустить остановленный контейнер:
```bash
docker start my-running-app
```
Перезапустить контейнер:
```bash
docker restart my-running-app
```
Посмотреть логи (вывод) контейнера: Незаменимо для отладки.
```bash
docker logs my-running-app
```
Зайти внутрь запущенного контейнера (как будто подключаешься к удалённому серверу):
```bash
docker exec -it my-running-app /bin/bash
```
(Чтобы выйти, набери `exit`).
Удалить остановленный контейнер:
```bash
docker rm my-running-app
```
Удалить образ:
```bash
docker rmi my-python-app
```
Шаг 5: Работа с томами (Volumes) для сохранения данных
Контейнеры по своей природе эфемерны: все изменения файловой системы внутри них теряются при удалении контейнера. Для сохранения данных (базы данных, загруженные файлы, логи) используются тома (volumes).
Самый простой способ — примонтировать папку с твоего компьютера в контейнер:
```bash
docker run -d -p 5000:5000 -v /путь/на/твоём/компьютере:/путь/в/контейнере --name my-app-with-data my-python-app
```
Например, чтобы сохранять логи приложения в папку `logs` на рабочем столе:
```bash
docker run -d -p 5000:5000 -v ~/Desktop/logs:/app/logs --name my-app my-python-app
```
Теперь всё, что приложение пишет в `/app/logs` внутри контейнера, будет сохраняться в `~/Desktop/logs` на твоём компьютере, даже если контейнер удалить.
Про-советы и частые ошибки
- Используй `.dockerignore`. Создай в корне проекта файл `.dockerignore` (аналогично `.gitignore`). Укажи в нём папки и файлы, которые не нужно копировать в образ (например, `node_modules`, `.git`, `.venv`, локальные конфиги). Это ускорит сборку и уменьшит размер образа.
__pycache__
.pyc
.env
.git
node_modules
Dockerfile
README.md
```
- Выбирай правильный базовый образ. Не бери `latest` или огромные образы вроде `ubuntu:latest` для простых задач. Используй официальные, минималистичные образы (`-alpine`, `-slim`). Это сильно сократит размер и уменьшит поверхность для потенциальных атак, что важно с точки зрения кибербезопасности.
- Объединяй команды RUN. Каждая инструкция `RUN` в `Dockerfile` создаёт новый слой. Вместо:
RUN apt-get update
RUN apt-get install -y package1
RUN apt-get install -y package2
```
Пиши так:
```dockerfile
RUN apt-get update && apt-get install -y \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/
```
Это уменьшит количество слоёв и итоговый размер образа.
- Не храни секреты в образах. Никогда не копируй пароли, API-ключи или токены напрямую в `Dockerfile` или в код. Используй переменные окружения (`ENV` в Dockerfile, а лучше `--env` при `docker run`) или специальные решения Docker для секретов (Docker Secrets) для продакшена.
- Останавливай и удаляй ненужное. Регулярно чисти систему:
# Удалить все остановленные контейнеры
docker container prune
# Удалить все неиспользуемые образы
docker image prune -a
# Удалить всё неиспользуемое (образы, контейнеры, тома, сети)
docker system prune -a
```
Это сэкономит гигабайты на диске.
Чек-лист: Docker с нуля за 5 шагов
Вот краткая выжимка всего руководства. Пройди по этому списку, и твой первый контейнер будет готов.
[ ] Установил Docker и проверил командой `docker --version` и `docker run hello-world`.
[ ] Создал `Dockerfile` в корне проекта с инструкциями по сборке (FROM, COPY, RUN, CMD).
[ ] Создал `.dockerignore`, чтобы не копировать в образ лишние файлы.
[ ] Собрал образ командой `docker build -t <имя-образа> .`.
[ ] Запустил контейнер с пробросом портов: `docker run -d -p <хост-порт>:<контейнер-порт> --name <имя-контейнера> <имя-образа>`.
[ ] Проверил работу через `docker ps` и зайдя на `http://localhost:<хост-порт>` в браузере.
[ ] Изучил базовые команды: `docker stop/start/logs/exec`.
* [ ] Понял важность томов (`-v`) для сохранения данных.
Docker — это мощный инструмент, который стандартизирует процесс разработки и деплоя. Начни с этого простого чек-листа, набей руку на своих проектах, а затем уже углубляйся в более сложные темы: Docker Compose для управления несколькими контейнерами, оркестрацию с Kubernetes или интеграцию Docker в процессы CI/CD.
Удачи в освоении контейнеров! Помни, лучший способ научиться — это делать. Создай, запусти, сломай, поправь — и всё получится.
Комментарии (1)