Забудьте о том, что Docker — это некий таинственный инструмент исключительно для DevOps-инженеров. В современном мире разработки Docker стал таким же незаменимым швейцарским ножом, как Git или ваш любимый редактор кода. Он п��зволяет любому разработчику писать код, который будет одинаково работать на машине коллеги, на тестовом стенде и в продакшене, забыв о кошмаре "а у меня на машине все работает". Если вы еще не погрузились в мир контейнеризации или вам нужен удобный источник команд, эта статья — ваш экспресс-билет.

Сразу скажу, что эта статья скорее шпаргалка, нежели сложный разбор. Вместо долгого объяснения "зачем Docker", скажем кратко: он решает головную боль с окружениями. У коллеги другая ОС? Проект требует специфической версии Python, Node.js и PostgreSQL одновременно? Нужно быстро поднять тестовую базу данных, не засоряя систему? Docker инкапсулирует ваше приложение и все его зависимости в легковесные, изолированные контейнеры, которые запускаются одинаково где угодно из образов. Образ — это неизменяемый шаблон , содержащий все необходимое: код, рантайм, библиотеки, переменные окружения и конфигурационные файлы. Контейнер — это запущенный экземпляр образа. Вы можете запускать множество контейнеров из одного образа.

Если вам интересен процесс и вы хотите следить за дальнейшими материалами, буду признателен за подписку на мой телеграм-канал. Там я публикую полезныe материалы по разработке, разборы сложных концепций, советы как быть продуктивным и конечно же отборные мемы: https://t.me/nullPointerDotEXE.

Ключевые команды Docker

Начнем с основ, но быстро перейдем к более продвинутым и часто используемым командам.

Работа с образами (Images)

Образ — это шаблон, содержащий приложение и все необходимое для его запуска. Контейнеры создаются именно на основе образов.

Просмотр списка образов

docker images

Или

docker image ls

Выводит список локально сохранённых образов с информацией: репозиторий, тег, ID образа, дата создания, размер.

Пример вывода:

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   3 months ago   141MB
postgres     15-alpine 01f814948801   2 months ago   241MB

Загрузка образа из Docker Hub

docker pull <имя_образа>:<тег>

Тег указывает конкретную версию (например, redis:7-alpine). Если тег не указан, по умолчанию скачивается latest.

Пример с загрузкой образа редис:

docker pull redis:7-alpine

Удаление образа

docker rmi <ID_образа_или_имя:тег>

Удаляет локальный образ. Образ нельзя удалить, если от него зависят контейнеры (д��же остановленные), если не использовать принудительный флаг.

Для принудительного удаления:

docker rmi -f <ID_образа_или_имя:тег>

Пример удаления:

docker rmi redis:7-alpine

Очистка подвисших образов

docker image prune

Удаляет образы без тегов, которые остаются после пересборок. Чтобы удалить все неиспользуемые образы:

docker image prune -a

Для пропуска подтверждения:

docker image prune -f

Просмотр истории образа

docker history <имя_образа>:<тег>

Показывает историю слоев образа. Это полезно для понимания, как образ был собран, какие команды выполнялись на каждом этапе, и какой вклад в размер внес каждый слой.

Получение подробной информации об образе

docker inspect <имя_образа>:<тег>

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

Работа с контейнерами (Containers)

Контейнер — это запущенный экземпляр образа, изолированное окружение, в котором выполняется приложение с заданными зависимостями. Он работает независимо от хост-системы и других контейнеров, что упрощает развертывание и масштабирование. Основные команды для управления контейнерами:

Просмотр контейнеров

docker ps

Отображает список только запущенных в данный момент контейнеров. Для просмотра всех контейнеров, включая остановленные, используется флаг -a или --all.

docker ps -a

Пример вывода:

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
a1b2c3d4e5f6   nginx:latest   "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes               80/tcp    web_server

Запуск нового контейнера

docker run [ФЛАГ] <ИМЯ_ОБРАЗА> [КОМАНДА] [АРГУМЕНТЫ...]

Основные флаги:

  • -d — Запускает контейнер в фоновом (detached) режиме. Терминал освобождается, а контейнер продолжает работать.

  • -p <порт_хоста>:<порт_контейнера> —  Пробрасывает порт с хост-машины на порт внутри контейнера. Например, -p 8080:80 сделает приложение, работающее на 80 порту контейнера, доступным на localhost:8080.

  • -v <путь_на_хосте>:<путь_в_контейнере> —Монтирует том или директорию с хоста внутрь контейнера. Это критически важно для разработки (чтобы изменения в коде сразу отражались в контейнере) или для сохранения данных (например, базы данных).

  • --name <имя_контейнера> — Присваивает контейнеру человекочитаемое имя для удобства обращения.

  • -it —  Запускает контейнер в интерактивном режиме с подключением псевдотерминала. Обычно используется для запуска командной оболочки внутри контейнера, например, docker run -it ubuntu:latest /bin/bash.

  • --rm —  Автоматически удаляет контейнер после его остановки. Очень удобно для выполнения разовых задач или скриптов.

  • -e <переменная>=<значение> — задать переменную окружения внутри контейнера.

  • --network <имя_сети> — Подключает контейнер к указанной Docker-сети. Полезно для организации взаимодействия между несколькими контейнерами по их именам.

  • -w <путь> —  Устанавливает рабочую директорию внутри контейнера для выполняемой команды.

Примеры запуска:

# Запуск Nginx в фоне, с пробросом порта и именем
docker run -d -p 8080:80 --name my_nginx nginx

# Запуск Node.js приложения с монтированием кода и автоматическим удалением после остановки
docker run --rm -d -p 3000:3000 -v $(pwd):/app --name my_node_app node:18-alpine

Управление контейнерами

Запуск остановленного контейнера:

docker start <ID_контейнера_или_имя>

Остановка работающего контейнера:

docker stop <ID_контейнера_или_имя>

Перезапуск контейнера:

docker restart <ID_контейнера_или_имя>

Удаление остановленного контейнера:

docker rm <ID_контейнера_или_имя>

Для принудительного удаления работающего контейнера:

docker rm -f <ID_контейнера_или_имя>

Удаление всех остановлен��ых контейнеров:

docker container prune

С пропуском подтверждения:

docker container prune -f

Просмотр логов контейнера

docker logs <ID_контейнера_или_имя>

Показывает логи (стандартный вывод и вывод ошибок) контейнера.

Полезные флаги:

  • -f — следить за логами в реальном времени.

  • --tail <N> — показать последние N строк.

Пример:

docker logs -f --tail 50 my_nginx

Выполнение команд внутри работающего контейнера

docker exec -it <ID_контейнера_или_имя> <команда>

Флаги -it обеспечивают интерактивный режим с терминалом. Незаменимая команда для отладки и выполнения административных задач внутри контейнера.

Примеры:

Подключиться к PostgreSQL внутри контейнера:

docker exec -it my_postgres psql -U postgres

Запустить shell в контейнере с Node.js:

docker exec -it my_node_app /bin/sh

Копирование файлов между хостом и контейнером

docker cp <путь_на_хосте> <ID_контейнера_или_имя>:<путь_в_контейнере>

Копирует файлы или директории с хост-машины в файловую систему контейнера.

docker cp <ID_контейнера_или_имя>:<путь_в_контейнере> <путь_на_хосте>

Копирует файлы или директории из контейнера на хост-машину.

Получение подробной информации о контейнере

docker inspect <ID_контейнера_или_имя>

Выводит подробную информацию о контейнере в формате JSON, включая его IP-адрес в сети Docker, смонтированные тома, проброшенные порты, переменные окружения и многое другое.

Сборка образов с помощью Dockerfile

Темы Dockerfile и docker-compose требуют отдельного рассмотрения, так как являются крайне ёмкими и важными для полноценной работы с Docker. В данной статье упомянуты лишь основные команды, которые часто используются. Если вы хотите подробно ознакомиться с написанием этих файлов, то вот хорошие статьи на мой взгляд:

Статья-гайд про докерфайлы: https://habr.com/ru/companies/ruvds/articles/439980/

Cтатья-гайд про докер-компос: https://habr.com/ru/companies/ruvds/articles/450312/

docker build [флаг] <ПУТЬ_К_КОНТЕКСТУ_СБОРКИ>

Эта команда используется для создания Docker-образа на основе инструкций из файла Dockerfile.

-t <имя>:<тег>: Задает имя и тег для создаваемого образа (например, my_app:1.0).

-f <путь_к_Dockerfile>: Указывает путь к файлу Dockerfile, если он называется иначе или находится не в корне контекста сборки.

--no-cache: Собирает образ без использования кеша слоев. Полезно, если кеш приводит к неожиданному поведению.

--build-arg <переменная>=<значение>: Передает аргументы времени сборки в Dockerfile. Эти аргументы доступны через инструкцию ARG.

--platform <платформа>: Указывает целевую платформу для сборки (например, linux/amd64 или linux/arm64). Актуально при сборке на машинах с архитектурой ARM (например, Mac M1/M2) для деплоя на серверы с архитектурой x86.

# Сборка образа из Dockerfile в текущей директории с тегом my_app:1.0
docker build -t my_app:1.0 .

# Сборка для платформы linux/amd64
docker build --platform linux/amd64 -t my_app_amd64 .

Управление многоконтейнерными приложениями с Docker Compose

Docker Compose — это инструмент для определения и запуска многоконтейнерных Docker-приложений. Конфигурация описывается в файле docker-compose.yml.

docker-compose up Собирает (если необходимо), создает и запускает все сервисы, описанные в docker-compose.yml.

-d: Запустить сервисы в фоновом режиме.

--build: Принудительно пересобрать образы перед запуском сервисов.

--force-recreate: Пересоздать контейнеры, даже если их конфигурация или образ не изменились.

Пример:

docker-compose up -d --build web_server # Запустить web_server и его зависимости в фоне с пересборкой

docker-compose down Останавливает и удаляет контейнеры, сети и (опционально) тома, созданные командой up.

-v или --volumes: Удалить также именованные тома, связанные с сервисами.

docker-compose down -v # Остановить все и удалить тома

docker-compose ps показывает статус контейнеров, управляемых Docker Compose для текущего проекта.

docker-compose logs [имя_сервиса] отображает логи для указанного сервиса или для всех сервисов, если имя не указано.

-f или --follow: Следить за логами в реальном времени.

docker-compose logs -f backend_api

docker-compose exec <имя_сервиса> <команда>Выполняет команду в работающем контейнере указанного сервиса.

Пример

docker-compose exec db psql -U user -d mydatabase

Другие полезные команды docker-compose:

docker-compose build [имя_сервиса]: Собрать или пересобрать образы для сервисов.

docker-compose config: Проверить и отобразить скомпилированную конфигурацию Compose.

docker-compose pull [имя_серв��са]: Загрузить образы для сервисов.

docker-compose restart [имя_сервиса]: Перезапустить сервисы.

docker-compose stop [имя_сервиса]: Остановить сервисы без их удаления.

docker-compose start [имя_сервиса]: Запустить ранее остановленные сервисы.

Управление сетями:

Docker позволяет создавать изолированные сети для взаимодействия контейнеров.

docker network ls: Показывает список всех сетей.
docker network create <имя_сети>: Создает новую сеть (по умолчанию типа bridge). Контейнеры в одной такой сети могут обращаться друг к другу по именам.
docker network rm <имя_сети>: Удаляет сеть.
docker network inspect <имя_сети>: Отображает подробную информацию о сети, включая подключенные к ней контейнеры.
docker network connect <имя_сети> <имя_контейнера>: Подключает работающий контейнер к указанной сети.
docker network disconnect <имя_сети> <имя_контейнера>
: Отключает контейнер от сети.

Управление томами

Тома (volumes) — это предпочтительный способ для сохранения данных, генерируемых и используемых контейнерами, так как они управляются Docker и существуют независимо от жизненного цикла контейнера.

docker volume ls: Показывает список всех томов.

docker volume create <имя_тома>: Создает новый именованный том.

docker volume rm <имя_тома>: Удаляет том. Будьте предельно осторожны, так как это приведет к потере всех данных в томе.

docker volume inspect <имя_тома>: Отображает подробную информацию о томе, включая его точку монтирования на хост-системе.

docker volume prune: Удаляет все бесхозные тома (те, что не используются ни одним контейнером). Флаг -f или --force пропустит запрос на подтверждение.

Советы для эффективной работы с Docker в разработке:

Советы для эффективной работы с Docker в разработке:

  • Используйте .dockerignore: Чтобы уменьшить размер образа и время сборки, исключайте ненужные файлы и директории (например, .git, node_modules при копировании исходников, локальные артефакты сборки, директории IDE).

  • Оптимизируйте Dockerfile для кеширования слоев: Располагайте инструкции, которые меняются редко (например, установка системных зависимостей), в начале Dockerfile, а те, что меняются часто (например, COPY исходного кода), — ближе к концу.

  • Применяйте многостадийные сборки (multi-stage builds): Это позволяет создавать легковесные production-образы. На одной стадии вы собираете приложение со всеми dev-зависимостями, а на финальную стадию копируете только скомпилированные артефакты и runtime-зависимости.

  • Не запускайте процессы под root в контейнере без явной необходимости: Создавайте отдельного пользователя и переключайтесь на него в Dockerfile с помощью инструкции USER.

  • Регулярно очищайте систему: Используйте docker system prune -af (с осторожностью, так как флаг -a удалит все неиспользуемые образы, а не только подвисшие) и docker volume prune (очень осторожно, если есть важные неиспользуемые тома) или отдельные prune команды для образов, контейнеров и томов, чтобы освобождать место на диске.

  • Создавайте алиасы для часто используемых команд: Например, alias dps='docker ps -a'alias dlogs='docker-compose logs -f'.

Этот набор команд и принципов должен покрыть большинство повседневных задач разработчика при работе с Docker. Помните, что практика — лучший учитель. Начните использовать Docker в своих проектах, экспериментируйте, и очень скоро эти команды станут для вас привычными.