Шпаргалка 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 ciRUNобъединяйте через&&(меньше слоёв)- Не запускайте контейнер от 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
Типовые ошибки
- Контейнер запускается и сразу падает →
CMDвыполнилась и завершилась. Нужен долгоживущий процесс (веб-сервер,tail -f /dev/null) - Bind mount перезаписывает node_modules → используйте анонимный том:
-v /app/node_modules - Не видно портов с хоста → не забыли
-p 8080:80? - Образ занимает 1.5GB → используйте
alpine, multi-stage builds,.dockerignore - Permission denied внутри контейнера → запускаете не от root, а файлы созданы root'ом. Добавьте
RUN chown -R node:node /app - COPY не видит файлы → файл не в контексте сборки (директория, где лежит Dockerfile) или не пропущен
.dockerignore
Другие шпаргалки: Linux, Git, curl, AWK
- DevOps: принципы и внедрение — CI/CD, контейнеризация, оркестрация