Команды, которые покрывают 95% ежедневной работы с контейнерами. Сделай закладку. Подробные разборы - в статьях Docker для новичка, пишем Dockerfile и docker compose.

Контейнеры

Команда Что делает
docker run -d -p 8080:80 nginx Запустить в фоне, проброс порта
docker run -it --rm ubuntu bash Интерактивно, удалить после выхода
docker ps / docker ps -a Запущенные / все контейнеры
docker logs -f <id> Логи в реальном времени
docker exec -it <id> sh Шелл внутри контейнера
docker stop <id> / docker start <id> Остановить / запустить
docker rm <id> Удалить контейнер
docker stats Использование CPU/RAM в реальном времени

Образы

docker images                    # список образов
docker build -t myapp:1.0 .      # собрать из Dockerfile
docker pull postgres:16          # скачать
docker tag myapp:1.0 myapp:latest
docker push registry/myapp:1.0   # загрузить в реестр
docker rmi <image>               # удалить образ
docker history myapp:1.0         # слои образа и их размер

Dockerfile - основное

FROM node:22-alpine
WORKDIR /app
COPY package*.json ./           # сначала зависимости - для кэша слоёв
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
USER node                       # не root в проде
CMD ["node", "server.js"]

Порядок важен: то, что меняется реже - выше. Подробно: пишем Dockerfile.

docker compose

docker compose up -d             # поднять стек в фоне
docker compose down              # остановить и удалить
docker compose down -v           # + удалить тома (осторожно!)
docker compose ps                # статус сервисов
docker compose logs -f <сервис>  # логи одного сервиса
docker compose exec <сервис> sh  # шелл в сервисе
docker compose build --no-cache  # пересобрать с нуля
docker compose pull              # обновить образы

Тома и данные

docker volume ls
docker volume create mydata
docker run -v mydata:/var/lib/postgresql/data postgres:16   # именованный том
docker run -v $(pwd):/app node:22                            # bind mount (код с хоста)
docker volume rm mydata
docker volume prune              # удалить неиспользуемые тома

Сети

docker network ls
docker network create mynet
docker run --network mynet --name db postgres:16    # контейнеры видят друг друга по имени
docker network inspect mynet

Отладка

docker inspect <id>              # вся метадата (JSON)
docker inspect -f '{% raw %}{{.State.Status}}{% endraw %}' <id>   # одно поле
docker logs --tail 100 <id>      # последние 100 строк
docker cp <id>:/app/log.txt .    # скопировать файл из контейнера
docker diff <id>                 # что изменилось в файловой системе
docker top <id>                  # процессы внутри

Очистка (освободить место)

docker system df                 # сколько занято
docker container prune           # удалить остановленные контейнеры
docker image prune               # удалить «висячие» образы
docker image prune -a            # удалить все неиспользуемые образы
docker system prune -a --volumes # удалить ВСЁ неиспользуемое (агрессивно)

.dockerignore

node_modules
.git
.env
dist
*.log

Без него COPY . . тащит в образ мусор и ломает кэш. Деплой на сервер с нуля - в статье про VPS.