Кладовочка

О разном, чтобы было под рукой онлайн

Шпаргалка Docker: команды, Dockerfile, Compose

Основные команды

docker --version                    # версия
docker info                         # информация о системе
docker run -d -p 8080:80 --name web nginx  # запустить контейнер
docker ps                           # запущенные контейнеры
docker ps -a                        # все контейнеры (включая остановленные)
docker stop web                     # остановить
docker start web                    # запустить остановленный
docker restart web                  # перезапустить
docker rm web                       # удалить контейнер
docker rm -f web                    # принудительно удалить
docker exec -it web bash            # войти в контейнер
docker logs -f web                  # логи в реальном времени
docker logs --tail 100 web          # последние 100 строк

Образы (Images)

docker images                       # список образов
docker pull nginx:alpine            # скачать образ
docker build -t myapp:1.0 .         # собрать образ (Dockerfile в текущей директории)
docker tag myapp:1.0 myapp:latest   # тег
docker push user/myapp:1.0          # отправить в registry
docker rmi nginx:alpine             # удалить образ
docker image prune                  # удалить неиспользуемые образы
docker history nginx                # слои образа
docker save -o myapp.tar myapp:1.0  # сохранить в файл
docker load -i myapp.tar            # загрузить из файла

Dockerfile

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Ключевые инструкции:

Инструкция Описание
FROM Базовый образ. Используйте alpine для маленьких образов
WORKDIR Рабочая директория
COPY Копирует файлы из контекста сборки
ADD Как COPY + распаковка архивов и URL (избегайте без нужды)
RUN Выполняет команду при сборке
CMD Команда по умолчанию при запуске контейнера
ENTRYPOINT Точка входа (CMD становится аргументом)
ENV Переменные окружения
ARG Аргументы сборки (не видны в контейнере)
EXPOSE Документирует порт (реально порты открываются через -p)
VOLUME Создаёт точку монтирования
USER Пользователь для RUN/CMD/ENTRYPOINT

Лучшие практики Dockerfile:

  • Используйте multi-stage builds (меньше итоговый образ)
  • COPY package*.json до COPY . — кэширование слоя npm ci
  • RUN объединяйте через && (меньше слоёв)
  • Не запускайте контейнер от root (USER node)
  • .dockerignore — исключите node_modules, .git, dist

Docker Compose

# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - ./src:/app/src
      - /app/node_modules    # анонимный том (не перезаписывать)
    environment:
      - NODE_ENV=development
      - DB_HOST=db
    depends_on:
      - db
    command: npm run dev

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  pgdata:

Команды Compose:

docker compose up -d                # запустить в фоне
docker compose down                 # остановить и удалить
docker compose down -v              # + удалить тома
docker compose logs -f app          # логи сервиса
docker compose exec app bash        # войти в сервис
docker compose ps                   # статус сервисов
docker compose build --no-cache     # пересобрать образы
docker compose restart app          # перезапустить сервис
docker compose up -d --scale app=3  # 3 реплики (без портов, нужен балансировщик)

Тома (Volumes)

docker volume ls                    # список томов
docker volume create mydata         # создать том
docker volume rm mydata             # удалить
docker volume prune                 # удалить неиспользуемые

# Запуск с томом
docker run -v mydata:/data nginx                    # именованный том
docker run -v $(pwd)/data:/data nginx               # bind mount (текущая директория)
docker run -v /data nginx                           # анонимный том
docker run --mount type=bind,src=$(pwd),dst=/app nginx  # явный синтаксис

Сети (Networks)

docker network ls                   # список сетей
docker network create mynet         # создать
docker network rm mynet             # удалить
docker network connect mynet web    # подключить контейнер к сети
docker network disconnect mynet web # отключить
docker network inspect mynet        # информация о сети

# Запуск в сети
docker run --network mynet --name app1 myapp
docker run --network mynet --name app2 myapp
# app1 и app2 видят друг друга по именам: ping app2

Очистка диска

docker system prune                 # удалить всё неиспользуемое
docker system prune -a              # включая неиспользуемые образы
docker system prune -a --volumes    # включая тома (осторожно!)
docker system df                    # использование диска
docker builder prune                # очистить кэш сборки

Продвинутые сценарии

Передача переменных окружения

docker run -e DB_HOST=localhost -e DB_PORT=5432 app
docker run --env-file .env app

Ограничение ресурсов

docker run --memory 512m --cpus 1.5 app
docker run --memory 256m --memory-swap 512m app  # RAM 256MB + swap 256MB

Healthcheck

HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

Вход в контейнер под другим пользователем

docker exec -it -u root web bash

Копирование файлов из/в контейнер

docker cp file.txt web:/app/
docker cp web:/app/file.txt .

Docker registry (приватный)

docker run -d -p 5000:5000 --name registry registry:2
docker tag myapp:1.0 localhost:5000/myapp:1.0
docker push localhost:5000/myapp:1.0

Типовые ошибки

  1. Контейнер запускается и сразу падает → CMD выполнилась и завершилась. Нужен долгоживущий процесс (веб-сервер, tail -f /dev/null)
  2. Bind mount перезаписывает node_modules → используйте анонимный том: -v /app/node_modules
  3. Не видно портов с хоста → не забыли -p 8080:80?
  4. Образ занимает 1.5GB → используйте alpine, multi-stage builds, .dockerignore
  5. Permission denied внутри контейнера → запускаете не от root, а файлы созданы root'ом. Добавьте RUN chown -R node:node /app
  6. COPY не видит файлы → файл не в контексте сборки (директория, где лежит Dockerfile) или не пропущен .dockerignore

Другие шпаргалки: Linux, Git, curl, AWK