Docker – платформа для запуска приложений в контейнерах: изолированных окружениях, которые включают в себя код, зависимости и настройки, необходимые для работы приложения. В отличие от виртуальных машин, контейнеры не эмулируют отдельную операционную систему, а используют ядро хоста, поэтому запускаются быстрее и потребляют меньше ресурсов. Контейнер создается на основе образа – неизменяемого шаблона с файловой системой и инструкциями по запуску; один и тот же образ можно развернуть на любом сервере с Docker и получить идентичное окружение.
На VPS Beget Docker можно не устанавливать вручную: в маркетплейсе есть готовый образ Docker – сервер разворачивается с уже настроенными Docker и Docker Compose. Тем, кто предпочитает графический интерфейс вместо командной строки, подойдет Portainer – он тоже разворачивается в пару кликов из маркетплейса и разобран в отдельной статье о работе с Docker через Portainer.
Зная список команд Docker, можно запускать и останавливать контейнеры, управлять образами, хранить данные в томах, настраивать сети и следить за порядком в системе.
Ниже – шпаргалка: команды Docker с примерами, от первого запуска контейнера до автоматизации через Docker Compose.
Запуск, остановка и удаление контейнеров
docker run
docker run – главная команда, с которой начинается знакомство с Docker. Она создает контейнер Docker на основе образа и сразу запускает его. Если нужного образа нет локально, Docker автоматически скачает его из реестра.
docker run -d -p 8080:80 --name my-nginx nginxЗдесь -d запускает контейнер в фоновом режиме, -p 8080:80 пробрасывает 80-й порт контейнера на 8080-й порт хоста, а --name задает удобное имя вместо случайного идентификатора.
Часто используемые ключи:
-d– запуск в фоне (detached);-p host:container– проброс порта;-e VAR=value– передача переменной окружения;-v– подключение тома или директории хоста;--rm– автоматическое удаление контейнера после остановки;--restart=always– автоматический перезапуск при сбоях или перезагрузке хоста (alwaysподнимет контейнер Docker даже если остановить его вручную командойdocker stop);--restart=unless-stopped– то же самое что и--restart=always, но не перезапускает контейнер, если он был остановлен вручную. Этот вариант обычно предпочтительнееalways.--memory,--cpus– ограничение ресурсов.
Пример с ограничением ресурсов и автоперезапуском:
docker run -d --name app --memory=1g --cpus=1 --restart=always myapp:latestdocker ps
Команда docker ps показывает запущенные контейнеры: идентификатор, образ, статус, порты.
docker ps # только активные
docker ps -a # включая остановленные
docker ps -q # только идентификаторыdocker stop / docker start / docker restart
Управляют состоянием уже созданного контейнера, не удаляя его:
docker stop my-nginx # корректная остановка (SIGTERM, затем SIGKILL)
docker start my-nginx # запуск ранее остановленного контейнера
docker restart my-nginx # перезапускМожно передавать сразу несколько имен или ID через пробел, чтобы обработать несколько контейнеров Docker одной командой.
docker rm
Команда docker rm удаляет остановленные контейнеры и освобождает занятые ими ресурсы:
docker rm my-nginx # удаление остановленного контейнера;
docker rm -f my-nginx # принудительное удаление, даже если контейнер запущен
docker container prune # удалить все остановленные контейнеры разомРабота с уже запущенным контейнером
docker exec
Позволяет зайти в работающий контейнер Docker, не останавливая его, и выполнить произвольную команду. Например, открыть интерактивную оболочку для отладки.
docker exec -it my-nginx bash
docker exec my-nginx nginx -t # проверка конфигурации без входа в оболочкуФлаг -it подключает интерактивный терминал (-i – интерактивный режим ввода, -t – псевдотерминал). Если в образе нет bash (например, в alpine-образах), используйте sh: docker exec -it my-nginx sh.
docker logs
Позволяет просматривать логи работы контейнера:
docker logs my-nginxПримеры использования:
docker logs -f my-nginx– просмотр логов в реальном времени;docker logs --tail 100 my-nginx– просмотр последних 100 строк лога.
docker inspect
Выводит полную информацию об объекте Docker в формате JSON: сети, тома, переменные окружения, лимиты ресурсов. Команда работает не только с контейнерами, но и с образами, томами и сетями.
docker inspect my-nginxМожно передать сразу несколько объектов и получить массив с данными по каждому:
docker inspect my-nginx another-container
docker inspect nginx:latest
docker inspect db-dataФлаг -f (--format) позволяет вытащить из JSON конкретное поле по Go-шаблону, не читая весь вывод целиком:
docker inspect -f '{{.NetworkSettings.IPAddress}}' my-nginx # IP-адрес контейнера (только для сети bridge по умолчанию)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx # IP-адрес для контейнера в пользовательской сети
docker inspect -f '{{.State.Status}}' my-nginx # текущий статус
docker inspect -f '{{json .Config.Env}}' my-nginx # переменные окружения в JSON
docker inspect -f '{{.HostConfig.Memory}}' my-nginx # лимит памяти в байтахДля более сложной обработки удобно комбинировать вывод с jq:
docker inspect my-nginx | jq '.[0].Mounts'docker stats и docker top
Помогают следить за потреблением ресурсов и процессами внутри контейнера в реальном времени.
docker stats– CPU, память, сеть по всем контейнерамdocker top my-nginx– список процессов внутри контейнера
docker cp
Эта команда Docker копирует файлы между контейнером и файловой системой хоста в любом направлении, что делает ее универсальной для работы с файлами.
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./index.html my-nginx:/usr/share/nginx/html/
docker cp ./site/ my-nginx:/usr/share/nginx/html/ # копирование директории целикомФлаг -a сохраняет владельца файла и права доступа при копировании (по умолчанию Docker присваивает файлам владельца от пользователя, под которым выполняется команда):
docker cp -a my-nginx:/var/log/app ./app-logsУправление образами
docker pull
Эта команда скачивает образ из реестра – по умолчанию: Docker Hub – без запуска контейнера.
docker pull ubuntu # тег по умолчанию - latest
docker pull ubuntu:22.04 # конкретная версияdocker build
Собирает образ по инструкциям из файла Dockerfile – текстового файла, в котором по шагам описано, из какого базового образа собирать приложение, какие зависимости устанавливать в Docker Compose и какую команду запускать при старте контейнера.
docker build -t myapp:1.0 .Точка в конце команды Docker build указывает контекст сборки – текущую директорию. Флаг -t задает имя и тег образа.
Дополнительные полезные ключи:
-f Dockerfile.prod– использоватьDockerfileс нестандартным именем или путем;--no-cache– собрать образ заново, не используя кэш предыдущих слоев;--build-arg VAR=value– передать аргумент сборки, доступный внутриDockerfileчерез инструкциюARG.
docker build -t myapp:1.0 --build-arg NODE_ENV=production --no-cache .Для больших приложений стоит иметь в виду многоэтапную сборку (multi-stage build) – она позволяет собрать приложение в одном образе, а в финальный включить только результат сборки, заметно уменьшив итоговый размер.
docker images
Выводит список локальных образов.
docker images
docker images -f dangling=true # образы без тега («висячие»)
docker images --format "{{.Repository}}:{{.Tag}}\t{{.Size}}" # компактный вывод
docker image history myapp:1.0 # история слоев образа и их размерdocker tag и docker push
Перед публикацией образ обычно нужно пометить тегом с именем репозитория, а затем отправить в реестр. Если реестр требует авторизации (в том числе Docker Hub для приватных образов), перед push нужно выполнить вход:
docker loginПубликация образа:
docker tag myapp:1.0 username/myapp:1.0
docker push username/myapp:1.0Одному образу можно присвоить сразу несколько тегов, например, версию и latest:
docker tag myapp:1.0 username/myapp:latest
docker push username/myapp:latestОтправить сразу все теги образа одной командой:
docker push -a username/myappДля приватного реестра (не Docker Hub) в теге дополнительно указывается его адрес:
docker tag myapp:1.0 registry.example.com/myapp:1.0
docker push registry.example.com/myapp:1.0Проверить, что образ действительно опубликован, можно, скачав его на другой машине или локально под другим именем:
docker pull username/myapp:1.0docker rmi
Позволяет удалить образ.
docker rmi myapp:1.0
docker image prune -a # удалить все неиспользуемые образыТома и хранение данных
Контейнеры по умолчанию не сохраняют данные после удаления – для постоянного хранения используются тома (volumes) или монтирование директорий хоста (bind mounts).
docker volume create db-data # создать том
docker run -d -v db-data:/var/lib/mysql mysql # подключить том к контейнеру
docker volume ls # список томов
docker volume inspect db-data # подробности о томе
docker volume rm db-data # удалить том (данные будут потеряны; не сработает, пока том используется контейнером )Для монтирования конкретной папки с хоста вместо именованного тома используется абсолютный путь:
docker run -d -v /srv/site/html:/usr/share/nginx/html nginxСети Docker
Каждый контейнер по умолчанию подключается к сети bridge, но для взаимодействия нескольких сервисов удобнее создавать собственные сети. Это дает им возможность обращаться друг к другу по имени.
docker network create app-network # создать сеть
docker network ls # список сетей
docker run -d --network app-network --name backend myapp # запустить контейнер в сети
docker run -d --network app-network --name another-container myapp # запустить второй контейнер в той же сети
docker network connect app-network another-container # подключить существующий контейнер к сети
docker network inspect app-network # подробная информация о сети
docker network disconnect app-network another-container # отключить контейнер от сети
docker network rm app-network # удалить сеть
docker network prune # удалить все неиспользуемые сетиПри создании сети можно явно задать драйвер и диапазон адресов – это пригодится, если контейнерам нужно взаимодействовать по фиксированным IP или если сеть по умолчанию (bridge) конфликтует с адресацией хоста:
docker network create --driver bridge --subnet 172.20.0.0/16 app-networkПри подключении контейнера к сети можно задать ему дополнительный алиас. По нему другие контейнеры смогут обращаться к сервису, даже если у контейнера другое имя:
docker network connect --alias db app-network another-containerКроме bridge, у Docker есть и другие драйверы сетей: host (контейнер использует сетевой стек хоста напрямую), none (контейнер без сети) и overlay (для связи контейнеров между несколькими хостами в Docker Swarm).
docker compose
Когда приложение состоит из нескольких сервисов (например, backend, база данных и кэш), удобнее описать их в одном файле docker-compose.yml и управлять всем стеком – в этом помогает команда docker compose up.
docker compose up -d # запустить все сервисы в фоне
docker compose down # остановить и удалить контейнеры и сети
docker compose down -v # то же самое, но вместе с томами
docker compose ps # состояние сервисов
docker compose logs -f # логи всех сервисов
docker compose logs -f web # логи конкретного сервиса
docker compose build # пересобрать образы
docker compose up -d --build # пересобрать образы и сразу перезапустить сервисы
docker compose restart # перезапустить сервисы
docker compose stop # остановить сервисы без удаления
docker compose start # запустить ранее остановленные сервисы
docker compose exec web sh # зайти в контейнер конкретного сервиса
docker compose run --rm web python manage.py migrate # разовый запуск команды в сервисе
docker compose top # процессы по сервисам
docker compose config # проверить и вывести итоговую конфигурациюПеременные окружения для сервисов удобно выносить в отдельный файл .env рядом с docker-compose.yml. Docker Compose подхватывает его автоматически и подставляет значения в конфигурацию.
docker compose (через пробел), тогда как старый отдельный инструмент использовал написание через дефис – docker-compose. Обслуживание системы
Со временем на сервере накапливаются неиспользуемые образы, остановленные контейнеры, «висячие» тома и сети – это занимает место на диске.
docker system df # сколько места занимают образы, контейнеры, тома
docker system prune # удалить неиспользуемые данные (с подтверждением)
docker system prune -a --volumes # полная очистка, включая тома и все неиспользуемые образыПолную очистку стоит применять осторожно: флаг --volumes удаляет данные из неиспользуемых анонимных томов. Начиная с Docker 23 именованные тома (например, db-data) этой командой не затрагиваются – для их удаления нужен отдельный вызов docker volume prune -a.
Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить основные команды Docker или наши продукты с коллегами по цеху и сотрудниками Beget – ждем вас в нашем сообществе в Telegram.