В этой статье мы рассмотрим основные команды Docker, которые используются в повседневной работе: от запуска и остановки контейнеров до управления образами и диагностикой. Такой набор даст прочную основу: читатель сможет управлять контейнерами, создавать простые образы, а также узнает про логирование и Docker Compose.
Общий синтаксис для любой команды выглядит так:
docker [команда] [флаги с параметрами] [название образа] [команды, которые передаются в контейнер]Зная эту формулу, можно работать с любой функциональностью Docker.
Проверка работы Docker
Перед тем, как двигаться дальше, нужно установить Docker. Написали руководство по установке для Ubuntu, которое подходит и для других дистрибутивов Linux. Для Windows можете использовать Docker Desktop, который сам настроит WSL-2 — инструмент для Windows, позволяющий запускать дистрибутивы Linux поверх Windows, так как Docker не умеет развертывать Linux-контейнеры напрямую на этой ОС.
Теперь начнем проверку работоспособности сервиса. Первый способ — узнать версию. Актуальная на момент создания статьи — v29. Проверить версию на актуальность всегда можно в документации.
Сокращенный вариант команды:
docker -vПолный вариант этой же команды, который также выводит номер версии:
docker --versionДополнительно можно вывести общую информацию о системе с помощью docker info. Команда выводит общее число контейнеров, образов, версии, используемый драйвер, имя узла, ОС и т. д.
Также можно использовать полный вариант этой же команды, который выводит тот же самый результат:
docker system infoПримеры выше подходят, чтобы удостовериться, что Docker запущен и теоретически готов к работе. Однако стоит также проверить, что система может скачивать образы из репозитория и запускать контейнеры. Поэтому хорошей практикой будет установить демонстративный Docker-образ.
Для этого сперва устанавливаем образ:
docker pull hello-worldЗапускаем контейнер:
docker run hello-worldПриложение выведет приветственное сообщение и завершит работу.

Базовую проверку Docker прошли. Далее рассмотрим основные команды для работы с контейнерами, образами и Docker Compose.
Работа с контейнерами
В этой части рассмотрим работу с группой docker container — специальная «папка», куда входят команды для создания и взаимодействия с контейнерами.
Run — запускаем первый контейнер
Это основная команда для создания и немедленного запуска контейнера из образа. Для примера попробуем установить NginX. Для этого выполним команду:
docker run -p 80:80 nginxЗатем в браузере переходим по localhost:80 — должна открыться приветственная страница NginX. При этом в самой консоли будут выводиться логи сервера, а ввод в консоль заблокируется.
Nginx — образ, который берется из Docker Hub. Это публичный реестр образов. Если нужного образа нет локально, Docker автоматически скачает его оттуда — по сути, выполнит docker pull. Про эту команду расскажем дальше.
Теперь разберем флаги для run:
-p 80:80— пробрасывает порт из контейнера на нашу машину. Например, можем указать-p 1234:80, тогда сервер будет открываться наlocalhost:1234, хотя сам nginx будет запущен на 80-ом порту. Если не указывать этот флаг, к запущенному контейнеру нельзя будет обратиться извне.--name web— задает понятное имя контейнеру, без этого флага присваивается случайное. Полезно для дальнейшего управления, скажем, docker stop web.-d— запускает в фоновом режиме (detached), выводит ID. Используется, чтобы консоль «отцепилась» от запущенного контейнера. Без нее будут выводиться логи NginX, а ввод будет заблокирован.
Команда с учетом всех флагов:
docker run –name web -p 1234:80 -d nginxТакже показана ниже на скрине. Такой вывод выглядит гораздо аккуратнее предыдущего:

Дополнительно могут пригодиться флаги:
-i— держит STDIN консоли открытым, то есть пользователь сможет вводить команды.-t— выделяет псевдотерминал для этого контейнера.
В итоге мы сможем посылать контейнеру любые команды, например, systemctl, nginx reload и другие.

Также часто используются:
--rm— удаляет контейнер после остановки.-e— передает переменную окружения, например, пароль для БД.-v— монтирует директорию в контейнер, чтобы данные после остановки не пропадали.
Attach — подключаемся к контейнеру
В предыдущем блоке мы рассмотрели run -d, который «отцепляет» терминал от контейнера и запускает его в фоновом режиме. Команда docker attach делает противоположное — снова подключается к уже запущенному сервису, чтобы пользователь мог взаимодействовать с его стандартными потоками ввода и вывода.
Пример:
docker attach --detach-keys="ctrl-x" webweb — имя, --detach-keys="ctrl-x" — комбинация для «отсоединения» контейнера.
Exec — передаем команды
Команда docker exec используется для выполнения новых инструкций внутри уже запущенного контейнера. Например, в случае с NginX мы можем войти в bash. Для этого запустите контейнер из предыдущего примера и выполните:
docker exec -i -t web bashЗдесь web — имя запущенного приложения, bash — команда, которую мы хотим выполнить. Дополнительно используются флаги -i -t, которые разбирали выше. В итоге попадем в контейнер и запустим новую bash-сессию.
Например, на скрине ниже выполняем стандартные операции: pwd, ls, cd:

Rm — удаляем лишнее
Это команда удаляет один или несколько контейнеров, имена которых указываются после флагов. Пример:
docker rm -f -v condescending_agnesicondescending_agnesi — это имя контейнера. Также здесь используются флаги:
-f— если запущен контейнер, флаг принудительно останавливает его перед удалением.-v— удаляет связанные с контейнером анонимные тома.
Вывод:

start, stop, restart, pause, unpause — основные команды для управления жизненным циклом контейнера
Эти команды используются для управления состоянием контейнеров. Они позволяют запускать, останавливать, перезапускать или временно приостанавливать выполнение без удаления:
docker stop -t 10 web
docker start -a web
docker restart -t 5 web
docker pause web
docker unpause webweb — имя контейнера, флаги означают следующее:
-t— дляstopиrestartзадает время в секундах, через которое контейнер будет принудительно остановлен.-a— подключает стандартный ввод/вывод к контейнеру аналогично командеattach. Работает только дляstart.
Kill — еще один вариант остановки
Используется для остановки контейнера с помощью сигнала (флаг --signal). Сигнал указывает, должно приложение закрыться немедленно (SIGKILL) или у него есть время на корректное завершение работы (SIGTERM):
docker kill --signal=SIGTERMВ случае успеха выводит имя контейнера:

Дополнительно здесь использован флаг -signal=SIGTERM, который передает сигнал SIGTERM. Запущенная программа может перехватить этот сигнал и корректно сохранить открытые файлы, закрыть соединение с БД и т. д.
Можно передать SIGKILL, который принудительно «убивает» любой процесс без возможности сохранения.
Docker stop — это обертка над командой kill, которая выполняет:
kill --signal=SIGTERM;- ждет 10 секунд;
- если контейнер не закрылся, выполняет
kill --signal=SIGKILL.
Остальные команды
В этот раздел вошли команды для управления контейнерами, которые имеют простой синтаксис или используются реже базовых. Они могут понадобиться для автоматизации с помощью bash-скриптов, при написании Dockerfile и в других специфичных сценариях.
docker ps
Пример:
docker psВыводит информацию о запущенных контейнерах. Флаги:
-a— показывает как остановленные, так и запущенные приложения.-q— показывает только ID.
docker commit
Используется для создания нового образа на основе текущего состояния сервиса. Команда сохраняет все изменения, сделанные внутри контейнера, например установленные пакеты, в виде нового image.
Синтаксис:
docker commit [контейнер] [образ]Пример:
docker commit web new-web:version2docker diff
Показывает изменения в файловой системе контейнера по сравнению с его исходным образом.
Синтаксис:
docker diff [контейнер]Пример:
docker diff webdocker port
Показывает проброс портов для конкретного контейнера.
Синтаксис:
docker port [контейнер] [номер порта/протокол]Пример:
docker port webДля конкретного порта:
docker port web 80/tcpПример вывода:

docker container prune
Находит все контейнеры, которые находятся в статусе exited (остановлены) или created (созданы), и удаляет их.
Флаги:
-f— удаляет без подтверждения.--filter— удаляет только то, что подходит под фильтр.
docker rename
Переименовывает контейнер.
Синтаксис:
docker rename [старое имя] [новое имя]Пример:
docker rename myApp new_myAppdocker top
Показывает все запущенные на контейнере процессы.
Синтаксис:
docker top [имя контейнера]Пример:
docker top My_Nginxdocker wait
Используется для ожидания завершения работы контейнера. Команда блокирует выполнение до тех пор, пока контейнер не остановится, и после этого возвращает код выхода.
Синтаксис:
docker wait [имя контейнера]Пример:
docker wait my_containerРабота с образами
Перейдём к работе с образами.
Делаем сборку с image build
Для примера создадим NginX-приложение со статичной HTML-страницей. Для этого вам понадобится создать директорию, открыть ее в терминале. Еще нужно поместить в каталог html-разметку и заполненный Dockerfile. Вот как это может выглядеть:

Запустим сборку командой:
docker build . -t html-appРазберем её:
- точка после build означает рабочую директорию, в которой находится Dockerfile.
-t— флаг тега, чтобы задать имя.
Если нет никаких ошибок, появится образ:

Дополнительно можно использовать флаги:
-f .\config\Dockerfiles\example— указывает путь к Dockerfile.--no-cache— заставляет Docker построить каждый слой образа с нуля, не используя кэшированную информацию. Пригодится, если при новой сборке нужно обновить пакеты.--build-arg VERSION=1.0— передает переменные, которые были объявлены в инструкции ARG.
Скачиваем сборку — image pull
Команда используется для загрузки образа (image) из удаленного реестра, например, Docker Hub, на локальную машину. Используется редко, так как если нужного образа нет локально, docker run автоматически выполнит pull.
Пример:
docker image pull ubuntu:latestЗдесь: ubuntu — имя образа, который будет скачан из реестра; latest — тег последней версии. Если собираете image заново, используйте флаг --no-cashe.
Импорт и экспорт в tar-архив image export и image import
Команда image export используется, чтобы получить .tar-архив из работающего контейнера. Ее можно применить, если во время работы появляется бинарник, который сложно пересоздать.
Для примера запустим Ubuntu-образ и создадим в нем любой файл.
Запускаем контейнер с Ubuntu
docker run --rm -it ubuntu— запускаем контейнер с Ubuntu;cd ./tmp— переходим в папку tmp;echo =====Test===== >> test.txt— создаем в ней текстовый файл.
После чего выполняем:
docker export -o tar-ubuntu.tar e91455e99e45Здесь:
-o tar-ubuntu.tar— флаг, который задает выходной архив.e91455e99e45— ID контейнера, узнать можно с помощьюdocker ps.
Вот как это выглядит в консоли:

Кроме того, в рабочем каталоге появится tar-архив. Если распаковать его, то в папке «tmp» должен находиться наш файл test.txt.
Теперь используем команду docker import, которая создает image на основе архива:
docker import tar-ubuntu.tar ubuntu-from-tarЗдесь:
tar-ubuntu.tar— имя архива, на основе которого мы хотим сделать образ. Здесь можно указать URL, например, example.com/images/some.tar.ubuntu-from-tar— название нового образа.
Теперь проверим. Для этого выведем список всех образов через docker images, запустим docker run -it ubuntu-from-tar bash и проверим содержимое файла test.txt.
В консоли это выглядит так:

Проверяем сборку с помощью image ls и image inspect
Для проверки можно вывести список всех образов:
docker image ls Сокращенная форма:
docker imagesВ результате получим список всего, что было создано:

Также можно вывести всю информацию о файле в JSON-формате с помощью:
docker image inspectРабота с томами
Тома — это механизм для хранения данных вне контейнера. Они позволяют сохранять информацию при пересоздании контейнера и обмениваться ею между разными контейнерами.
Ниже — примеры базовых команд. Создать новый том:
docker volume create my_volumeПоказать список всех томов:
docker volume lsПодробно команды работы с томами уже разобраны в другой статье — перейдите по ссылке, чтобы посмотреть полный разбор.
Логирование
Логи позволяют увидеть, что происходит с контейнером в реальном времени. Команда выглядит так:
docker logs fc198c50ace3fc198c50ace3 — ID запущенного приложения, в нашем случае — это NginX.
В результате в консоли появятся все события, которые произошли с контейнером. Например, мы можем увидеть, что к нашему серверу отправлялись GET-запросы:

Также можно наблюдать за логами в реальном времени. Для этого используется флаг -f:
docker logs -f fc198c50ace3Полезные флаги
В Докере довольно много флагов, вот наиболее популярные:
| Флаг | Описание | Команды |
|---|---|---|
--help | Выводит справку по команде и список доступных флагов | Все |
-q, --quiet | Показывает только ID объектов без дополнительной информации | ps, images, volume ls, network ls и другие |
-f, --filter | Фильтрует результаты по заданным условиям | ps, images, volume ls, network ls, events и другие |
--format | Позволяет задать формат вывода (например, таблица или шаблон) | ps, images, inspect, volume ls, network ls и другие |
-a, --all | Показывает все объекты, включая остановленные | ps, images |
-n, --last | Ограничивает количество выводимых результатов | ps, events |
-l, --latest | Выбирает последний созданный объект | ps, inspect |
Рассмотрим наиболее интересные.
--fillter
Найти нужный контейнер среди сотен сервисов может быть сложно, поэтому в Docker есть фильтры. Пример:
docker ps -a --filter name=webВ данном случае команда покажет все контейнеры, в теге name которых встречается web:

Также можно использовать несколько фильтров. Например, найдем контейнеры, сделанные на основе образа NginX и с названием web:
docker ps -a --filter name=web --filter ancestor=nginxДополнительно можно использовать символы:
- «^» — поиск в начале строки. Пример:
--filter name=^web— найдет сервисы, имя которых начинается сweb. - «&» — поиск в конце строки. Пример:
--filter name=web$— ищет сервисы, имя которых заканчивается наweb.
--format
Некоторые команды поддерживают форматированный вывод, с помощью которого можно показывать только нужную информацию. Пример:
docker ps --filter "status=running" --format "table {{.Names}}\t{{.Image}}"Эта команда выводит информацию о запущенных контейнерах. Разберем флаг подробнее:
table— задает формат таблицы.{{.Names}}— указывает, что первый столбец — имя контейнера.\t— табуляция между столбцами.{{.Image}}— второй столбец — это название образа.
На скрине результат вывода: сверху — без форматирования, снизу — с форматированием.

Docker Compose
Это инструмент для управления многоконтейнерными приложениями, который позволяет описать все сервисы, сети и тома в одном конфигурационном файле .yaml. С его помощью можно одной командой запускать, останавливать и пересоздавать сразу несколько связанных контейнеров.
Проверка версии:
docker compose versionСборка Docker Compose. Конфигурационный файл должен находиться в той же директории:
docker compose up --build -dПросмотр логов:
docker compose logsПосмотреть запущенные в рамках Compose сервисы:
docker compose psОстановить и удалить контейнеры:
docker compose downДля удобства собрали все основные команды в таблицу:
| Команда | Что делает | Пример | |
|---|---|---|---|
docker run | Создаёт и запускает контейнер
| docker run -d -p 80:80 --name my_container nginx | |
docker ps | Показывает запущенные контейнеры | docker ps -a | |
docker stop / start | Останавливает / запускает контейнер | docker stop my_container | |
docker restart | Перезапускает контейнер | docker restart -t 5 my_container | |
docker kill | Останавливает контейнер сигналом (SIGTERM/SIGKILL) | docker kill --signal=SIGTERM my_container | |
docker pause / unpause | Приостанавливает / возобновляет работу контейнера | docker pause my_container | |
docker rm | Удаляет контейнер (с флагом -f — даже работающий) | docker rm -f my_container | |
docker exec | Выполняет команду внутри работающего контейнера | docker exec -it my_container bash | |
docker logs | Показывает логи контейнера | docker logs -f my_container | |
docker images | Показывает список образов | docker images | |
docker build | Собирает образ из Dockerfile | docker build . -t my-app | |
docker pull | Скачивает образ из реестра | docker pull ubuntu:latest | |
docker rmi | Удаляет образ | docker rmi my-old-image | |
docker commit | Создаёт образ из изменённого контейнера | docker commit my_container new-my_container:version2 | |
docker compose up | Запускает многоконтейнерное приложение | docker compose up -d | |
docker compose down | Останавливает и удаляет контейнеры Compose-проекта | docker compose down |
Лучшие практики
При работе с Docker важно не просто уметь собирать образы, но и делать это эффективно и безопасно. Вот несколько советов:
- Используйте multi-stage сборку. Это подход, при котором один Dockerfile содержит несколько стадий сборки. Например, вначале происходит установка зависимостей, затем — компиляция. Разделение файла на несколько этапов позволяет включить в финальный вариант только необходимое для запуска приложения. Кроме того, multi-stage сборку, если стадии не зависят друг от друга, можно запускать параллельно с помощью BuildKit.
- Выделяйте общие стадии сборки. Благодаря этому, Докеру понадобится собрать стадию только один раз. Это особенно полезно на больших приложениях, где можно выделить общие компоненты.
- Выбирайте правильный образ. Удостоверьтесь, что источнику, из которого вы получаете Image, можно доверять. Проверьте страницу образа в Docker Hub: наличие значка Official или Verified Publisher, количество загрузок, активность обновлений и документацию. Также полезно изучить Dockerfile и убедиться, что в нем нет лишних компонентов.
- Чаще пересобирайте образы. Проверяйте обновление в репозитории. Если зависимости внутри базового образа или установленных пакетов изменились или получили обновления, нужно пересобирать сборку заново. Чтобы узнать, что изменилось, смотрите в Docker Hub раздел Tags.
- Используйте .dockerignore. С его помощью можно указать файлы, которые не будут включены в конечную сборку.
Docker — мощный инструмент, но только при условии, что вы действительно понимаете, как он работает, а самый простой способ изучить эту систему — практика.
Попробуйте собрать простое приложение — например, сайт с фронтендом, бэкендом и базой данных. Упакуйте каждую часть в контейнер, настройте их взаимодействие и разверните весь стек на VDS. В процессе вы сможете закрепить навыки работы с контейнерами. А это — основа для уверенного использования Docker в реальных проектах.