Шпаргалка по основным командам Docker, которая поможет вам в работе с платформой

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:latest

docker 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.0

docker 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 встроен в основной CLI и вызывается как 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.