Docker: основные команды с примерами

14.04.2026
10:00

Зачем знать базовые команды Docker

Docker стал стандартом для упаковки и запуска приложений в изолированных средах. Под капотом он использует механизмы ядра Linux - пространства имён (namespaces) для изоляции процессов и контрольные группы (cgroups) для ограничения ресурсов. Это позволяет запускать десятки приложений на одном сервере без конфликтов зависимостей и предсказуемо воспроизводить окружение от разработки до продакшна.

Образы Docker устроены слоями (layers): каждая инструкция в Dockerfile добавляет новый слой поверх предыдущего. Это делает сборку быстрой - если слой не изменился, Docker берёт его из кэша. Контейнер - это запущенный экземпляр образа, процесс с собственной файловой системой, сетью и набором переменных окружения.

Практика показывает: разработчик, который знает два десятка команд Docker наизусть, тратит на отладку и деплой в разы меньше времени. В этой статье разобраны все ключевые команды с реальными примерами - от загрузки образа до инспекции сети и очистки системы.

Управление образами

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

docker pull - загружает образ из реестра (по умолчанию Docker Hub). Если тег не указан, загружается тег latest.

docker pull nginx
docker pull nginx:1.25-alpine
docker pull ubuntu:22.04

docker build - собирает образ из Dockerfile в текущей директории или по указанному пути. Флаг -t задаёт имя и тег образа, флаг -f позволяет указать нестандартное имя файла.

docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.prod .
docker build -t registry.example.com/myapp:latest .

docker images - выводит список всех локально доступных образов с именем, тегом, идентификатором, датой создания и размером.

docker images
docker images nginx
docker images --filter "dangling=true"

docker rmi - удаляет образ по имени или идентификатору. Если на образ ссылается контейнер, потребуется сначала остановить и удалить контейнер или использовать флаг -f.

docker rmi nginx:1.25-alpine
docker rmi a1b2c3d4e5f6
docker rmi -f myapp:1.0

docker tag - создаёт новый тег для существующего образа. Часто используется перед отправкой образа в приватный реестр.

docker tag myapp:1.0 registry.example.com/myapp:1.0
docker tag myapp:1.0 myapp:latest

docker push - отправляет образ в реестр. Перед отправкой необходимо выполнить docker login, если реестр требует авторизацию.

docker login registry.example.com
docker push registry.example.com/myapp:1.0
docker push myuser/myapp:latest

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

Контейнеры - это рабочие единицы Docker. Их жизненный цикл охватывает создание, запуск, остановку, перезапуск, удаление и просмотр состояния.

docker run - создаёт и сразу запускает контейнер из образа. Это одна из самых многофункциональных команд: она принимает десятки флагов для настройки изоляции, ресурсов, сети и хранилища.

docker run nginx
docker run -d nginx
docker run -d -p 8080:80 --name my-nginx nginx
docker run -it ubuntu:22.04 bash
docker run --rm -e DB_HOST=localhost myapp:1.0

Наиболее часто используемые флаги команды docker run:

-d - запуск в фоновом режиме (detached)

-p host_port:container_port - проброс порта с хоста в контейнер

--name - задать имя контейнера

-e KEY=VALUE - передать переменную окружения

-v /host/path:/container/path - примонтировать директорию с хоста

--rm - автоматически удалить контейнер после завершения

-it - интерактивный режим с псевдотерминалом

--memory 512m - ограничить потребление памяти

--cpus 1.5 - ограничить использование процессора

docker ps - выводит список запущенных контейнеров. Флаг -a показывает все контейнеры, включая остановленные.

docker ps
docker ps -a
docker ps -a --filter "status=exited"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

docker stop - останавливает контейнер, отправляя сигнал SIGTERM. Если контейнер не завершился через 10 секунд (по умолчанию), отправляется SIGKILL. Таймаут можно изменить флагом -t.

docker stop my-nginx
docker stop -t 30 my-nginx
docker stop container1 container2 container3

docker start - запускает ранее остановленный контейнер. В отличие от docker run, не создаёт новый контейнер, а использует уже существующий со всеми его настройками.

docker start my-nginx
docker start -i my-container

docker restart - останавливает контейнер и сразу запускает его заново. Удобно при изменении конфигурации или после обновления переменных окружения.

docker restart my-nginx
docker restart -t 5 my-nginx

docker rm - удаляет остановленный контейнер. Флаг -f принудительно останавливает и удаляет работающий контейнер. Флаг -v удаляет анонимные тома, привязанные к контейнеру.

docker rm my-nginx
docker rm -f my-nginx
docker rm -v old-container
docker rm $(docker ps -aq -f status=exited)

docker logs - выводит стандартный вывод (stdout) и поток ошибок (stderr) контейнера. Особенно полезна при отладке.

docker logs my-nginx
docker logs -f my-nginx
docker logs --tail 100 my-nginx
docker logs --since 2h my-nginx
docker logs -t my-nginx

Флаг -f включает режим отслеживания новых записей в реальном времени, аналогично tail -f. Флаг -t добавляет временные метки к каждой строке.

docker exec - выполняет команду внутри работающего контейнера. Используется для отладки, ручного изменения файлов или запуска вспомогательных утилит.

docker exec my-nginx nginx -t
docker exec -it my-nginx bash
docker exec -it my-nginx sh
docker exec -e DEBUG=true my-app python manage.py migrate

Флаг -it открывает интерактивную сессию. Если в образе нет bash, можно попробовать sh - он присутствует практически в любом образе.

Сети и тома

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

Сети (docker network)

По умолчанию Docker создаёт три сети: bridge (стандартная для большинства контейнеров), host (контейнер использует сеть хоста напрямую) и none (без сети).

docker network ls - выводит список всех сетей.

docker network ls

docker network create - создаёт пользовательскую сеть. Контейнеры в одной пользовательской сети могут обращаться друг к другу по имени контейнера.

docker network create mynet
docker network create --driver bridge --subnet 172.20.0.0/16 mynet

docker network connect / disconnect - подключает или отключает работающий контейнер от сети без перезапуска.

docker network connect mynet my-nginx
docker network disconnect mynet my-nginx

docker network inspect - выводит подробную информацию о сети в формате JSON: параметры драйвера, подсеть, список подключённых контейнеров и их IP-адреса.

docker network inspect mynet
docker network inspect bridge

docker network rm - удаляет сеть. Нельзя удалить сеть, к которой подключены контейнеры.

docker network rm mynet

Тома (docker volume)

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

docker volume create - создаёт именованный том.

docker volume create mydata

docker volume ls - выводит список всех томов.

docker volume ls
docker volume ls --filter "dangling=true"

docker volume inspect - показывает путь к тому на хосте и другие параметры.

docker volume inspect mydata

docker volume rm - удаляет том. Данные будут потеряны безвозвратно.

docker volume rm mydata
docker volume prune

Подключение тома при запуске контейнера выполняется флагом -v или --mount:

docker run -d -v mydаta:/var/lib/postgresql/data postgres:16
docker run -d --mount source=mydata,target=/var/lib/postgresql/data postgres:16

Docker inspect и системные команды

Инспекция и мониторинг помогают понять, что происходит внутри контейнеров и как используются ресурсы системы.

docker inspect - возвращает полный JSON с конфигурацией и состоянием объекта: контейнера, образа, тома или сети. Незаменима при отладке проблем с сетью, томами или переменными окружения.

docker inspect my-nginx
docker inspect --format '{{.NetworkSettings.IPAddress}}' my-nginx
docker inspect --format '{{.State.Status}}' my-nginx
docker inspect mydata

docker stats - показывает потребление ресурсов в реальном времени: CPU, память, сетевой трафик, дисковые операции. По умолчанию обновляется каждую секунду.

docker stats
docker stats my-nginx
docker stats --no-stream
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

Флаг --no-stream выводит один снимок без интерактивного обновления - удобно для скриптов.

docker info - выводит системную информацию о Docker: версия, количество контейнеров и образов, используемый драйвер хранилища, параметры ядра, объём доступной памяти.

docker info
docker info --format '{{.ServerVersion}}'

docker system prune - удаляет все неиспользуемые объекты: остановленные контейнеры, сети без контейнеров, висячие образы (dangling) и кэш сборки. Флаг -a также удаляет образы, на которые не ссылается ни один контейнер.

docker system prune
docker system prune -a
docker system prune -a --volumes

docker system df - показывает, сколько дискового пространства занимают образы, контейнеры, тома и кэш сборки.

docker system df
docker system df -v

docker version - выводит версии клиента и сервера Docker.

docker version

Практический пример: запуск nginx с маппингом порта и томом

Рассмотрим реальный сценарий: нужно запустить nginx, отдающий статику из локальной директории, на порту 8080 хоста. Контейнер должен работать в фоне, иметь имя и автоматически перезапускаться при падении.

Сначала создадим директорию с тестовой страницей на хосте:

mkdir -p /srv/nginx-static
echo "<h1>It works</h1>" > /srv/nginx-static/index.html

Теперь запустим контейнер с монтированием директории, пробросом порта и политикой перезапуска:

docker run -d \
--name static-web \
-p 8080:80 \
-v /srv/nginx-static:/usr/share/nginx/html:ro \
--restart unless-stopped \
nginx:1.25-alpine

Флаг :ro монтирует директорию в режиме только для чтения - контейнер не сможет изменить файлы на хосте. Политика unless-stopped означает, что контейнер будет автоматически запускаться при перезагрузке системы, если только не был остановлен вручную.

Проверяем, что контейнер работает:

docker ps --filter "name=static-web"

Проверяем доступность через curl:

curl http://localhost:8080

Смотрим логи доступа в реальном времени:

docker logs -f static-web

Если нужно заменить конфигурацию nginx без пересборки образа, копируем файл в контейнер командой docker cp:

docker cp ./nginx.conf static-web:/etc/nginx/nginx.conf
docker exec static-web nginx -t
docker restart static-web

По окончании работы останавливаем и удаляем контейнер:

docker stop static-web && docker rm static-web

FAQ

В чём разница между docker stop и docker kill?

docker stop отправляет сигнал SIGTERM и ждёт завершения процесса (по умолчанию 10 секунд), давая приложению время корректно закрыть соединения и записать данные. docker kill немедленно отправляет SIGKILL без ожидания. Для продакшн-контейнеров предпочтительнее docker stop.

Как посмотреть, какие порты проброшены у контейнера?

Самый быстрый способ - команда docker port my-container. Также эта информация есть в выводе docker ps в колонке PORTS и в docker inspect по пути .NetworkSettings.Ports.

Можно ли изменить переменные окружения у работающего контейнера?

Нет. Переменные окружения задаются при создании контейнера и не могут быть изменены на ходу. Нужно остановить контейнер, удалить его и создать заново с новыми значениями через docker run -e.

Что такое "висячие" образы (dangling images) и как от них избавиться?

Висячие образы - это промежуточные слои или образы без тега, которые остаются после пересборки. Удалить их можно командой docker image prune или через docker system prune. Они не мешают работе, но занимают место на диске.

Как передать несколько переменных окружения в контейнер?

Есть два способа. Первый - несколько флагов -e в одной команде: docker run -e KEY1=val1 -e KEY2=val2 myapp. Второй - файл с переменными: docker run --env-file .env myapp. Файл содержит по одной записи KEY=VALUE на строку.

Как ограничить ресурсы контейнера?

При запуске через docker run используются флаги: --memory 512m ограничивает память, --cpus 1.5 ограничивает использование процессора (1.5 означает полтора ядра). Текущее потребление можно отслеживать через docker stats.

Как скопировать файл из контейнера на хост?

Команда docker cp работает в обоих направлениях. Для копирования из контейнера: docker cp container_name:/path/inside/container /path/on/host. Команда работает как с запущенными, так и с остановленными контейнерами.

Другие статьи