Перейти к содержимому
TelegramGitHub

Шпаргалка и частые ошибки

Эта страница — справочник. Держите её открытой, пока работаете.

КомандаЧто делает
docker run IMAGEСоздаёт и запускает контейнер
docker run -d --name NAME -p 8080:80 IMAGEВ фоне, с именем, с портом
docker run --rm IMAGEУдаляет контейнер после выхода
docker run -it IMAGE shИнтерактивная оболочка
docker run -e KEY=value IMAGEПеременная окружения
docker run -v "$PWD/data:/data" IMAGEПодключить папку
docker psРаботающие контейнеры
docker ps -aВсе контейнеры, и остановленные тоже
docker logs NAMEЛоги. С -f — следить за ними
docker exec -it NAME shЗайти в работающий контейнер
docker stop NAMEОстановить
docker start NAMEЗапустить остановленный
docker rm NAMEУдалить остановленный контейнер
⚠️ docker rm -f NAMEОстановить и удалить
docker stats --no-streamПамять и процессор
docker inspect NAMEВсе детали контейнера
КомандаЧто делает
docker pull IMAGE:TAGСкачать образ
docker imagesСписок образов
docker build -t NAME:TAG .Собрать образ из Dockerfile
docker tag SRC NAME:TAGДобавить тег
docker push NAME:TAGОтправить в реестр
docker history NAME:TAGСлои образа
docker rmi NAME:TAGУдалить образ
КомандаЧто делает
docker volume lsСписок томов
docker volume create NAMEСоздать том
⚠️ docker volume rm NAMEУдалить том и данные в нём
docker network lsСписок сетей
docker network create NAMEСоздать сеть
docker network inspect NAMEКто подключён к сети
КомандаЧто делает
docker compose up -dЗапустить всё в фоне
docker compose up -d --waitЗапустить и дождаться, пока сервисы станут healthy
docker compose up --buildПересобрать образы и запустить
docker compose psСервисы. Остановленные видны с -a
docker compose logs -f SERVICEЛоги сервиса
docker compose exec SERVICE shЗайти в сервис
docker compose run --rm SERVICE CMDРазовый запуск сервиса
docker compose restart SERVICEПерезапуск
docker compose downУдалить контейнеры и сеть. Тома остаются
⚠️ docker compose down -vУдалить ещё и тома. Данные базы пропадут
docker compose config -qПроверить файл
docker compose config --servicesСписок сервисов
КомандаЧто делает
docker system dfСколько места занимает Docker
⚠️ docker system pruneУдаляет остановленные контейнеры, неиспользуемые сети и висячие образы
⚠️ docker volume pruneУдаляет тома, которые не использует ни один контейнер

Перед prune посмотрите docker ps -a и docker volume ls. Остановленный контейнер может хранить нужные данные. Том без контейнера может быть вашей базой.

СообщениеПричинаЧто делать
Bind for 0.0.0.0:8088 failed: port is already allocatedПорт на вашем компьютере занятВыберите другой порт слева: -p 8089:80. Или найдите владельца: docker ps
no matching manifest for linux/arm64/v8 in the manifest list entriesУ образа нет сборки для вашего процессора (Mac с Apple)Возьмите другой образ. Или --platform linux/amd64 (медленнее). Или соберите образ сами
connection to server at "127.0.0.1", port 5432 failed: Connection refusedПриложение в контейнере ищет базу в localhost. Это он самИспользуйте имя сервиса: DB_HOST=db. Контейнеры должны быть в одной сети
FileNotFoundError: [Errno 2] No such file or directory: '/data/orders.csv'Папку с данными не подключилиДобавьте -v "$PWD/data:/data"
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?Docker не запущенЗапустите Docker Desktop. На Linux: sudo systemctl start docker
pull access denied for postgress, repository does not exist or may require 'docker login'Опечатка в имени образа. Или образ приватныйПроверьте имя на Docker Hub. Для приватного образа сделайте docker login
no space left on deviceДиск Docker заполненdocker system df. Удалите ненужные образы и тома. Осторожно с prune
Контейнер сразу завершился (Exited (3))Главная команда вышла с ошибкойdocker logs NAME, затем docker inspect NAME --format '{{.State.ExitCode}}'
Database directory appears to contain a database; Skipping initializationЭто не ошибка. В томе уже есть базаЧитайте ниже: пароль не изменится

Postgres читает POSTGRES_PASSWORD только при первом запуске с пустым томом. Мы запустили контейнер с паролем one, удалили его и запустили снова с паролем two на том же томе. В логе:

PostgreSQL Database directory appears to contain a database; Skipping initialization

Пароль остался one. Чтобы получить новый, удалите том (⚠️ данные пропадут) или смените пароль командой ALTER USER в SQL.

  • 0 — программа завершилась успешно.
  • 1 и другие числа — ошибка в программе. Мы запустили exit 3 и получили Exited (3).
  • 137 — процесс убит. Часто из-за нехватки памяти.

Идите по лестнице сверху вниз:

  1. Что с контейнером? docker ps -a. Работает он, или завершился, и с каким кодом.
  2. Что он написал? docker logs NAME. Чаще всего ответ уже здесь.
  3. Как он настроен? docker inspect NAME. Проверьте переменные, порты, тома.
  4. Что внутри? docker exec -it NAME sh. Посмотрите файлы и сеть.
  5. Контейнер не стартует? Запустите образ с оболочкой вместо главной команды:
Окно терминала
docker run --rm -it --entrypoint sh IMAGE

Пример: образ alpine:3.22 с оболочкой вместо обычной команды:

Окно терминала
docker run --rm --entrypoint sh alpine:3.22 -c 'echo in-shell'

Ответ: in-shell.

В Compose то же самое: docker compose run --rm --entrypoint sh SERVICE.

Запустите два контейнера nginx:1.29 на одном порту 8120. Прочитайте ошибку второго.

Проверка: в ошибке есть port is already allocated.

Решение
Окно терминала
docker run -d --name web-a -p 8120:80 nginx:1.29
docker run -d --name web-b -p 8120:80 nginx:1.29

Второй контейнер не стартует: порт занят первым. Исправьте: -p 8121:80. Уберите за собой:

Окно терминала
docker rm -f web-a web-b

Запустите alpine:3.22 с командой sh -c 'echo boom; exit 3' и именем crash. Найдите код выхода двумя способами.

Проверка: в статусе Exited (3), а docker inspect печатает 3.

Решение
Окно терминала
docker run --name crash alpine:3.22 sh -c 'echo boom; exit 3'
docker ps -a --filter name=crash --format '{{.Status}}'
docker inspect crash --format '{{.State.ExitCode}}'
docker rm crash

Опечатайтесь в имени образа: docker pull postgress:17. Прочитайте сообщение.

Проверка: сообщение начинается с pull access denied for postgress.

Решение
Окно терминала
docker pull postgress:17

Правильное имя — postgres с одной s. Docker не отличает опечатку от приватного образа. Поэтому в сообщении есть слова про docker login.

Запустите отчёт без -v и прочитайте ошибку. Потом исправьте команду. Нужен образ orders-report:1.0 из урока про Dockerfile.

Проверка: сначала FileNotFoundError: ... '/data/orders.csv', потом вывод Заказов: 500.

Решение
Окно терминала
cd ~/docker-practice
docker run --rm orders-report:1.0
docker run --rm -v "$PWD/data:/data" orders-report:1.0

Вы прошли курс. Вернитесь к описанию курса, если хотите повторить тему.