Забудьте о том, что 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 в своих проектах, экспериментируйте, и очень скоро эти команды станут для вас привычными.

Комментарии (0)