Bezdepbonusu7Программирование: статьи и ответы

DevOps с нуля

Docker для начинающих: от первого контейнера до Compose

Редакция Bezdepbonusu78 мин чтения

Docker для начинающих проще, чем кажется: это способ упаковать приложение со всеми зависимостями в контейнер, который везде запускается одинаково. Разбираем установку, образы и контейнеры, базовые команды, пишем Dockerfile и поднимаем приложение с базой через Docker Compose.

Грузовые контейнеры в порту как образ контейнеров Docker для начинающих
Фото: AgainErick, CC BY-SA 4.0, Wikimedia Commons
Содержание
  1. Зачем Docker
  2. Установка
  3. Образы и контейнеры
  4. Базовые команды
  5. Dockerfile
  6. Docker Compose
  7. Тома и данные
  8. Частые ошибки
  9. Частые вопросы

Что такое Docker и зачем он новичку

Docker - платформа, которая упаковывает приложение вместе со всем, что ему нужно для работы: версией языка, библиотеками, системными пакетами, настройками. Такая упаковка называется контейнером и запускается одинаково на ноутбуке разработчика, на тестовом сервере и в продакшене. Фраза "у меня всё работает" перестаёт быть отговоркой.

Что Docker даёт на практике уже на первом курсе или в первом пет-проекте:

  • PostgreSQL, Redis или RabbitMQ поднимаются одной командой, без установки в систему;
  • можно держать рядом проекты на Python 3.9 и 3.13, и они не мешают друг другу;
  • новый участник команды запускает проект за минуты, а не за день;
  • деплой сводится к "собери образ и запусти его на сервере".

Контейнер часто путают с виртуальной машиной. Разница принципиальная: виртуальная машина эмулирует целый компьютер со своим ядром ОС, а контейнеры используют ядро хоста и изолируют только процессы, файлы и сеть. Поэтому контейнер стартует за секунды и весит десятки мегабайт, а не гигабайты.

Как установить Docker и проверить, что он работает

  1. Windows и macOS. Скачайте Docker Desktop с docs.docker.com. На Windows 10/11 он работает поверх WSL 2: установщик предложит включить его, либо выполните в PowerShell от администратора wsl --install и перезагрузитесь.
  2. Linux. Ставьте Docker Engine из официального репозитория Docker по инструкции для вашего дистрибутива. Пакет docker.io из стандартных репозиториев Ubuntu тоже работает, но обычно отстаёт по версии.
  3. Проверка. Выполните в терминале:
    docker --version
    docker compose version
    docker run hello-world
    Последняя команда скачает крошечный тестовый образ и выведет приветствие. Если оно появилось, всё установлено правильно.

Docker Desktop бесплатен для личного использования, обучения и небольших компаний; для крупных организаций нужна платная подписка. Точные пороги по численности и выручке смотрите в актуальных условиях на сайте Docker. Docker Engine в Linux распространяется свободно.

Из России загрузка образов с Docker Hub временами бывает медленной или нестабильной. Если docker pull зависает, пропишите зеркало реестра в параметре registry-mirrors файла daemon.json (в Docker Desktop - в Settings, раздел Docker Engine) и перезапустите Docker.

Образ, контейнер, реестр: три главных понятия

Всё в Docker держится на трёх словах:

  • Образ (image) - шаблон только для чтения: файловая система с ОС-основой, зависимостями и кодом. Состоит из слоёв, каждый слой - результат одной инструкции сборки. Образы различаются тегами: python:3.13-slim, postgres:17, nginx:latest.
  • Контейнер (container) - запущенный экземпляр образа. Из одного образа можно запустить сколько угодно независимых контейнеров. Изменения внутри контейнера живут, пока он существует, и пропадают после удаления.
  • Реестр (registry) - хранилище образов. Главный публичный - Docker Hub, есть GitHub Container Registry, облачные реестры и собственные.

Аналогия из программирования: образ - это класс, контейнер - объект этого класса. Аналогия из жизни: образ - установочный диск, контейнер - установленная с него программа, а реестр - магазин дисков.

Тег latest не значит "самый свежий". Это просто тег по умолчанию, и он может указывать на что угодно. В проектах всегда фиксируйте конкретную версию, иначе через полгода сборка внезапно поменяет поведение.

Основные команды Docker

Для старта хватит полутора десятков команд. Остальное ищется через docker КОМАНДА --help.

КомандаЧто делает
docker pull nginx:1.27Скачать образ из реестра
docker imagesСписок локальных образов
docker run -d -p 8080:80 nginxСоздать и запустить контейнер в фоне
docker ps / docker ps -aРаботающие / все контейнеры, включая остановленные
docker logs -f webЛоги контейнера в реальном времени
docker exec -it web shОткрыть оболочку внутри работающего контейнера
docker stop web / docker start webОстановить / снова запустить
docker rm webУдалить остановленный контейнер
docker rmi nginx:1.27Удалить образ
docker build -t myapp:1.0 .Собрать образ из Dockerfile в текущей папке
docker system pruneУдалить остановленные контейнеры, неиспользуемые сети и висячие образы

Самые нужные флаги docker run:

  • -d - запустить в фоне;
  • -p 8080:80 - пробросить порт: слева порт на вашем компьютере, справа порт внутри контейнера;
  • --name web - дать контейнеру имя, чтобы не копировать ID;
  • -e KEY=value - передать переменную окружения;
  • -v - подключить том или папку;
  • --rm - удалить контейнер сразу после остановки.

Пример: docker run -d --name web -p 8080:80 nginx, затем откройте http://localhost:8080 и увидите стартовую страницу nginx.

Dockerfile: собираем свой образ

Dockerfile - текстовый файл с инструкциями, как собрать образ. Пусть есть маленькое приложение на Flask: файл app.py и requirements.txt со строкой flask. Dockerfile для него:

FROM python:3.13-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5000
CMD ["flask", "--app", "app", "run", "--host=0.0.0.0"]

Что делает каждая строка:

  1. FROM - базовый образ. Вариант slim заметно легче полного.
  2. WORKDIR - рабочая папка внутри образа, дальнейшие команды выполняются в ней.
  3. COPY requirements.txt . и RUN pip install - сначала только зависимости. Docker кеширует слои: пока requirements.txt не менялся, пакеты не будут переустанавливаться при каждой правке кода.
  4. COPY . . - копирование остального кода.
  5. EXPOSE - документирует порт; сам порт наружу не открывает, это делает -p.
  6. CMD - команда запуска контейнера. --host=0.0.0.0 обязателен: приложение, слушающее 127.0.0.1, недоступно снаружи контейнера.

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

docker build -t flask-demo:1.0 .
docker run --rm -p 5000:5000 flask-demo:1.0

Рядом положите файл .dockerignore со строками .git, .venv, __pycache__, .env. Так в образ не попадут лишние мегабайты и секреты. Зачем вообще нужен requirements.txt, рассказано в статье про venv и pip.

Docker Compose: несколько контейнеров одной командой

Реальному приложению почти всегда нужна база данных, иногда кеш и очередь. Запускать каждый контейнер руками с десятком флагов неудобно. Docker Compose описывает все сервисы в одном YAML-файле compose.yaml (старое имя docker-compose.yml тоже поддерживается):

services:
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      DATABASE_URL: postgresql://app:secret@db:5432/app
    depends_on:
      - db
  db:
    image: postgres:17
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: app
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Обратите внимание на адрес базы: хост называется db, по имени сервиса. Compose создаёт общую сеть, и контейнеры находят друг друга по именам. Строка version: "3.8" в начале файла, которую до сих пор копируют из старых туториалов, не нужна: по документации Docker этот ключ устарел, игнорируется и вызывает предупреждение.

Команды Compose:

docker compose up -d      # собрать и запустить всё в фоне
docker compose ps         # статус сервисов
docker compose logs -f web
docker compose down       # остановить и удалить контейнеры
docker compose down -v    # то же плюс удалить тома с данными

Пишите docker compose через пробел. Отдельная утилита docker-compose через дефис - первая версия Compose, которая больше не поддерживается.

Где хранить данные: тома и bind mount

Файловая система контейнера временная. Удалили контейнер с PostgreSQL без тома - потеряли базу. Для постоянных данных есть два механизма:

  • Том (volume) - хранилище, которым управляет Docker: -v pgdata:/var/lib/postgresql/data. Подходит для баз данных и всего, что должно пережить пересоздание контейнера. Список томов - docker volume ls.
  • Bind mount - папка с вашего компьютера, подключённая внутрь: -v ./src:/app/src. Удобно при разработке: правите код в редакторе, контейнер сразу видит изменения.

Команда docker compose down -v удаляет тома вместе с данными базы. Привычка добавлять -v "для чистоты" однажды сотрёт вашу локальную базу с тестовыми данными. Без флага тома сохраняются, и после up всё будет на месте.

Типичные ошибки новичков в Docker

  • port is already allocated. Порт на хосте занят другим контейнером или программой. Смените левую часть: -p 8081:80, или найдите занявший процесс.
  • permission denied ... /var/run/docker.sock в Linux. Пользователь не в группе docker. Выполните sudo usermod -aG docker $USER и перелогиньтесь. Учтите, что членство в этой группе фактически даёт права root.
  • Контейнер сразу завершается. Контейнер живёт, пока работает главный процесс. Смотрите docker logs имя: чаще всего приложение упало при старте или команда завершилась сама.
  • Из контейнера не подключиться к localhost. Внутри контейнера localhost - это сам контейнер. Обращайтесь к соседнему сервису по имени из Compose, а к хосту из Docker Desktop - через host.docker.internal.
  • Образ весит гигабайт. Используйте slim- или alpine-образы, .dockerignore и флаг --no-cache-dir у pip.
  • Закончилось место на диске. Старые образы и слои копятся. Посмотреть - docker system df, почистить - docker system prune.

Docker тесно связан с Linux: внутри контейнеров почти всегда Linux, и без базовых команд терминала не обойтись. Освежите их по шпаргалке команд Linux, а если приложение за прокси отдаёт ошибку 502, загляните в разбор кодов ответов HTTP. Больше материалов - в разделе Docker.

Частые вопросы

Чем Docker отличается от виртуальной машины?

Виртуальная машина эмулирует компьютер целиком со своим ядром ОС. Контейнер использует ядро хоста и изолирует только процессы, файлы и сеть, поэтому запускается за секунды и занимает намного меньше места.

Нужно ли знать Linux, чтобы работать с Docker?

Базовые команды терминала нужны: внутри большинства контейнеров Linux, а Dockerfile состоит из shell-команд. Глубокое администрирование для старта не требуется.

Чем docker compose отличается от docker-compose?

docker compose через пробел - актуальный Compose v2, встроенный в Docker как плагин. docker-compose через дефис - отдельная утилита первой версии, которая больше не поддерживается. Синтаксис файлов у них почти одинаковый.

Docker Desktop платный?

Для личного использования, обучения и небольших компаний он бесплатен. Крупным организациям нужна платная подписка, пороги указаны в условиях на сайте Docker. Docker Engine в Linux бесплатен.

Почему данные пропали после перезапуска контейнера?

Скорее всего, контейнер был удалён и создан заново без тома. Подключите том через -v или секцию volumes в compose.yaml, тогда данные переживут пересоздание контейнера.

Как зайти внутрь работающего контейнера?

Командой docker exec -it имя_контейнера sh (или bash, если он есть в образе). Выйти можно командой exit, контейнер при этом продолжит работать.

Источники

  • Get started with Docker, Docker Docs, 2026
  • Dockerfile reference, Docker Docs, 2026
  • Version and name top-level elements, Docker Docs, 2026
  • Install Docker Desktop on Windows, Docker Docs, 2026

DockerLinuxDevOps

Похожие материалы

Версии программ и команды проверены на дату публикации. Если что-то изменилось, сверяйтесь с официальной документацией. Нашли неточность? Напишите на admin@bezdepbonusu7.win.