Skip to content

Взаимодействие с docker

Обо мне / Подготовка к assesment

Docker - открытая платформа для разработки, доставки и запуска приложений в контейнерах

Список команд для работы с docker

Команда Описание Дополнительные параметры (с пояснением) Пример команды
docker run Создать и запустить контейнер из образа -d (detached), --name <name>, -p host:container (порт-маппинг), -v host:container (том), --rm (удалить после выхода), -e KEY=VAL (env) docker run -d --name web -p 8080:80 nginx
docker build Построить образ из Dockerfile -t name:tag (имя/тег), -f <Dockerfile> (файл), --build-arg KEY=VAL docker build -t myapp:1.0 .
docker pull Скачать образ из реестра <image>:<tag> (по умолчанию latest) docker pull redis:6.2
docker push Отправить образ в реестр Требует docker login и корректного имени репозитория docker push myrepo/myapp:1.0
docker ps Показать запущенные контейнеры -a (включая остановленные), --format (кастомный вывод) docker ps -a --format '{{.ID}}\t{{.Names}}\t{{.Status}}'
docker images Показать локальные образы --format, -a (включая промежуточные) docker images --format '{{.Repository}}:{{.Tag}}\t{{.Size}}'
docker stop Остановить запущенный контейнер (graceful) -t <secs> (таймаут перед SIGKILL) docker stop -t 10 web
docker start Запустить ранее созданный/остановленный контейнер docker start web
docker restart Перезапустить контейнер (stop + start) -t <secs> docker restart -t 5 web
docker rm Удалить один или несколько контейнеров -f (force), -v (удалить связанные тома) docker rm -f old_container
docker rmi Удалить локальный образ -f (принудительно) docker rmi myapp:1.0
docker exec Выполнить команду внутри запущенного контейнера -it (интерактивный терминал), -u (пользователь) docker exec -it web bash
docker logs Просмотреть логи контейнера -f (follow), --since, --tail <n> docker logs -f --tail 100 web
docker inspect Полная JSON‑информация о контейнере/образе/сети --format '{{.Config}}' для конкретных полей docker inspect --format '{{.NetworkSettings.IPAddress}}' web
docker stats Живые метрики (CPU, память) контейнеров --no-stream (одноразовый снимок), указывать контейнеры docker stats --no-stream web db
docker network ls Показать сети Docker docker network inspect <network> для деталей docker network ls / docker network inspect bridge
docker volume ls Показать тома Docker docker volume inspect <volume> docker volume ls
docker-compose up (docker-compose) Поднять multi‑container приложение -d (detached), --build, --scale svc=n docker-compose up -d --build
docker system prune Очистить неиспользуемые объекты -a (удалить все неиспользуемые образы), --volumes docker system prune -a --volumes

Практики по работе с Docker образами

Решение Описание Преимущества Команда
Multi-stage build Сборка артефакта в одном этапе, копирование только runtime-артефактов в финальный образ Существенно меньше размер, нет инструментов сборки в финале # builder\nFROM golang:1.20 AS builder\nWORKDIR /app\n... \n# final\nFROM gcr.io/distroless/static\nCOPY --from=builder /app/bin/myapp /myapp
Минимальные базовые образы (Alpine/Distroless/Scratch) Использовать лёгкие или пустые образы вместо полноценных дистрибутивов Меньше слоёв, меньший размер, меньше атакуемой поверхности FROM python:3.11-slim или FROM gcr.io/distroless/base
Удаление build-зависимостей и кешей После установки пакетов удалять списки apt/pip кеши и dev-пакеты Уменьшение размера слоя после установки RUN apt-get install -y build-essential && make && apt-get purge -y build-essential && rm -rf /var/lib/apt/lists/*
.dockerignore Исключать ненужные файлы/папки из контекста сборки Меньший контекст → быстрее билд, меньше случайных файлов в образе .dockerignore:\nnode_modules\n.git\nDockerfile
Правильный порядок слоёв Помещать часто меняющиеся файлы позже, зависимые от них слои invalidируются реже Лучшая кэшируемость билдов → быстрее сборки в CI Сначала COPY package.json / RUN npm ci, потом COPY . .
BuildKit и кеши слоёв Включить BuildKit и использовать --cache-from/inline cache Быстрые и повторяемые сборки в CI, уменьшение сетевого трафика DOCKER_BUILDKIT=1 docker build --cache-from myrepo/myimage:cache -t myrepo/myimage:latest .
Минимизация количества слоёв Объединять команды в одном RUN, использовать && и очистку в том же слое Меньше слоёв → меньше метаданных и небольшая экономия места RUN apt-get update && apt-get install -y ... && rm -rf /var/lib/apt/lists/*
Стриппинг и сжатие бинарей Удаление символов отладки и сжатие (strip / upx) для собственных бинарей Меньше размер исполняемого файла RUN strip /app/bin/myapp или RUN upx --best /app/bin/myapp
Использование runtime-only образа Перенос только runtime-артефактов (бинарий/зависимостей) в чистый образ Минимальный финальный образ без инструментов сборки См. пример multi-stage (copy только бинарей)
Кэширование зависимостей (CI) Кешировать слои с зависимостями между сборками в CI Быстрая сборка при неизменных зависимостях Использовать --cache-from или кэш runner (GitLab/Actions)
Установка без рекомендаций apt-get install --no-install-recommends / pip install --no-cache-dir Уменьшает установку лишних пакетов/файлов RUN apt-get install -y --no-install-recommends curl
Сканирование и оптимизация уязвимостей Trivy/Grype/Clair для поиска уязвимостей и удаления ненужных пакетов Безопасность + удаление ненужного софта trivy image myrepo/myapp:latest
Сжатие слоёв / squash (опционально) Объединение слоёв в один (редко нужно при BuildKit) Меньше метаданных; иногда помогает при legacy workflow docker build --squash (экспериментально)
Артефактная упаковка / distroless + шифрование Использовать distroless и подписывать/сканировать образы Минимизация векторов атаки и ЦСР/подписи образов FROM gcr.io/distroless/static + cosign/podman sign

Команды и ключевые понятия docker compose

Компонент / команда Описание Параметры Пример
docker-compose.yml Файл описания стека: services, networks, volumes, configs version / services / volumes / networks / deploy и т.д. version: "3.8"\nservices:\n web:\n image: nginx
docker compose up Создать и запустить все сервисы из конфигурации -d (detached), --build, --remove-orphans docker compose up -d --build
docker compose down Остановить и удалить контейнеры/сети/тома (опционально) --volumes, --rmi local|all docker compose down --volumes
docker compose build Построить образы по настройкам в compose --no-cache, --pull docker compose build --no-cache
docker compose logs Просмотреть логи сервисов -f (follow), --tail <n> docker compose logs -f web
docker compose ps Показать состояние сервисов и контейнеров -a (все) docker compose ps
docker compose exec Выполнить команду в запущенном контейнере -T (без псевдотерминала), -u (user) docker compose exec web sh
docker compose run Создать и запустить одноразовый контейнер в контексте сервиса --rm, --no-deps, -e docker compose run --rm web pytest
docker compose pull / push Скачать / отправить образы из/в registry docker compose pull
docker compose config Валидация и вывод итогового объединённого конфига --services, --volumes docker compose config --services
profiles / depends_on Контроль порядка запуска и условные профили depends_on — порядок; profiles — включение сервисов В compose: depends_on: - db
volumes Том для хранения данных между перезапусками driver, driver_opts, external volumes:\n dbdata:\n driver: local
networks Настройка сетей между сервисами (bridge, overlay) driver, driver_opts, external networks:\n front:\n back:
restart policy Политика рестарта контейнера no|always|on-failure|unless-stopped restart: unless-stopped
env_file / environment Передача переменных окружения в сервис env_file: .env или environment: environment:\n - DB_HOST=db

Что такое docker compose

Docker Compose — инструмент для определения и запуска многоконтейнерных Docker‑приложений через YAML‑файл (обычно docker-compose.yml). Описывает сервисы, сети и тома в декларативном виде; позволяет поднимать/остановливать стек одной командой.