Тариф успешно добавлен в корзину
В корзину
url image

Основные команды Docker: работа с контейнерами, образами, логированием и Docker Compose

В этой статье мы рассмотрим основные команды 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. При этом в самой консоли будут выводиться логи сервера, а ввод в консоль заблокируется.

Запущенный с помощью Docker сервер 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" web

web — имя, --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_agnesi

condescending_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 web

web — имя контейнера, флаги означают следующее:

  • -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:version2

docker diff

Показывает изменения в файловой системе контейнера по сравнению с его исходным образом.

Синтаксис:

docker diff [контейнер]

Пример:

docker diff web

docker 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_myApp

docker top

Показывает все запущенные на контейнере процессы.

Синтаксис:

docker top [имя контейнера]

Пример:

docker top My_Nginx

docker 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 fc198c50ace3

fc198c50ace3 — ID запущенного приложения, в нашем случае — это NginX.

В результате в консоли появятся все события, которые произошли с контейнером. Например, мы можем увидеть, что к нашему серверу отправлялись GET-запросы:

Также можно наблюдать за логами в реальном времени. Для этого используется флаг -f:

docker logs -f fc198c50ace3

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

В Докере довольно много флагов, вот наиболее популярные:

ФлагОписаниеКоманды
--helpВыводит справку по команде и список доступных флаговВсе
-q, --quietПоказывает только ID объектов без дополнительной информацииps, imagesvolume ls, network ls и другие
-f, --filterФильтрует результаты по заданным условиямpsimagesvolume lsnetwork lsevents и другие
--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Собирает образ из Dockerfiledocker 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 важно не просто уметь собирать образы, но и делать это эффективно и безопасно. Вот несколько советов:

  1. Используйте multi-stage сборку. Это подход, при котором один Dockerfile содержит несколько стадий сборки. Например, вначале происходит установка зависимостей, затем — компиляция. Разделение файла на несколько этапов позволяет включить в финальный вариант только необходимое для запуска приложения. Кроме того, multi-stage сборку, если стадии не зависят друг от друга, можно запускать параллельно с помощью BuildKit.
  2. Выделяйте общие стадии сборки. Благодаря этому, Докеру понадобится собрать стадию только один раз. Это особенно полезно на больших приложениях, где можно выделить общие компоненты.
  3. Выбирайте правильный образ. Удостоверьтесь, что источнику, из которого вы получаете Image, можно доверять. Проверьте страницу образа в Docker Hub: наличие значка Official или Verified Publisher, количество загрузок, активность обновлений и документацию. Также полезно изучить Dockerfile и убедиться, что в нем нет лишних компонентов.
  4. Чаще пересобирайте образы. Проверяйте обновление в репозитории. Если зависимости внутри базового образа или установленных пакетов изменились или получили обновления, нужно пересобирать сборку заново. Чтобы узнать, что изменилось, смотрите в Docker Hub раздел Tags.
  5. Используйте .dockerignore. С его помощью можно указать файлы, которые не будут включены в конечную сборку.

 

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

Попробуйте собрать простое приложение — например, сайт с фронтендом, бэкендом и базой данных. Упакуйте каждую часть в контейнер, настройте их взаимодействие и разверните весь стек на VDS. В процессе вы сможете закрепить навыки работы с контейнерами. А это — основа для уверенного использования Docker в реальных проектах.

Этот материал был полезен?

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