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