Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Управление контейнерами
containers

Управление контейнерами

Запуск, остановка, мониторинг и логирование контейнеров

Управление контейнерами

Контейнеры — это запущенные экземпляры образов. Научитесь управлять их жизненным циклом, мониторить и анализировать логи.

#Запуск контейнеров

#Базовый запуск

# Запуск в интерактивном режиме docker run -it ubuntu:22.04 bash # Запуск в фоновом режиме (detached) docker run -d nginx:latest # Запуск с именем docker run -d --name web-server nginx:latest # Запуск с автоматическим удалением после завершения docker run --rm ubuntu:22.04 echo "Hello"

#Публикация портов

# Публикация порта на все интерфейсы docker run -d -p 8080:80 nginx # Публикация на конкретный интерфейс docker run -d -p 127.0.0.1:8080:80 nginx # Публикация нескольких портов docker run -d -p 80:80 -p 443:443 nginx # Динамическое выделение порта docker run -d -p 80 nginx # Порт будет назначен случайно, узнать: docker port container_id

Формат: -p [host_ip:]host_port:container_port

#Переменные окружения

# Установка переменной окружения docker run -d -e APP_ENV=production myapp # Несколько переменных docker run -d \ -e DB_HOST=localhost \ -e DB_PORT=5432 \ -e DB_NAME=myapp \ myapp # Загрузка из файла docker run -d --env-file .env myapp

Файл .env:

DB_HOST=localhost
DB_PORT=5432
DB_NAME=myapp

#Монтирование томов

# Volume (управляется Docker) docker run -d -v mydata:/data nginx # Bind mount (файл/директория хоста) docker run -d -v /home/user/app:/app nginx # Read-only монтирование docker run -d -v /config:/app/config:ro nginx # Временная файловая система в памяти docker run -d --tmpfs /tmp:size=100m nginx

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

# Ограничение памяти docker run -d --memory=512m nginx # Ограничение CPU docker run -d --cpus=1.5 nginx # Комбинированное ограничение docker run -d \ --memory=1g \ --cpus=2 \ --memory-reservation=512m \ nginx # Ограничение количества процессов docker run -d --pids-limit=100 nginx

#Restart Policies

Политики автоматического перезапуска:

# Никогда не перезапускать (по умолчанию) docker run -d --restart=no nginx # Всегда перезапускать docker run -d --restart=always nginx # Перезапускать, если упал с ошибкой docker run -d --restart=on-failure nginx # Перезапускать максимум 3 раза docker run -d --restart=on-failure:3 nginx # Перезапускать, кроме ручной остановки docker run -d --restart=unless-stopped nginx

Когда использовать:

  • always — для production-сервисов, которые должны работать всегда
  • on-failure — для задач, которые могут завершаться успешно
  • unless-stopped — аналог always, но уважает ручную остановку

#Жизненный цикл контейнера

Created → Running → (Paused) → Running → Stopped → Removed

#Создание и запуск

# Создание без запуска docker create --name my-container nginx:latest # Запуск созданного контейнера docker start my-container # Создание и запуск одной командой docker run -d --name my-container nginx:latest

#Остановка

# Грациозная остановка (SIGTERM, затем SIGKILL через 10с) docker stop my-container # Грациозная остановка с таймаутом docker stop --time=30 my-container # Принудительная остановка (SIGKILL) docker kill my-container # Остановка с сигналом docker kill --signal=SIGINT my-container

#Перезапуск

# Перезапуск docker restart my-container # Перезапуск с таймаутом docker restart --time=30 my-container

#Пауза и возобновление

# Пауза всех процессов в контейнере docker pause my-container # Возобновление docker unpause my-container

Важно: Пауза использует cgroups и приостанавливает все процессы. Контейнер остаётся в памяти.

#Удаление

# Удаление остановленного контейнера docker rm my-container # Удаление запущенного контейнера (принудительно) docker rm -f my-container # Удаление всех остановленных контейнеров docker container prune # Удаление с автоматической очисткой после завершения docker run --rm nginx

#Просмотр информации

#Список контейнеров

# Запущенные контейнеры docker ps # Все контейнеры (включая остановленные) docker ps -a # Только ID контейнеров docker ps -q # С фильтром docker ps --filter "status=running" docker ps --filter "name=web" docker ps --filter "label=env=production" # С форматированием вывода docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" docker ps --format "{{.Names}}: {{.Ports}}"

#Детальная информация

# Полная информация в JSON docker inspect my-container # Конкретные поля docker inspect --format='{{.State.Status}}' my-container docker inspect --format='{{.NetworkSettings.IPAddress}}' my-container docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container # Размер контейнера docker inspect --format='{{.SizeRw}}' my-container

#Логи

# Вывод логов docker logs my-container # Follow режим (как tail -f) docker logs -f my-container # С таймстампами docker logs -t my-container # Последние N строк docker logs --tail=100 my-container # Логи за период docker logs --since=2024-01-01 my-container docker logs --until=2024-01-02 my-container # Комбинирование docker logs -f --tail=50 -t my-container

Настройка логирования:

# Ограничение размера логов docker run -d \ --log-opt max-size=10m \ --log-opt max-file=3 \ nginx # Глобальная настройка в /etc/docker/daemon.json { "log-opts": { "max-size": "10m", "max-file": "3" } }

#Мониторинг ресурсов

# Статистика использования ресурсов в реальном времени docker stats # Статистика конкретного контейнера docker stats my-container # Однократный вывод docker stats --no-stream my-container # Статистика всех контейнеров, включая остановленные docker stats --all

Пример вывода:

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O     PIDS
abc123         web       0.02%     45.3MiB / 512MiB    8.85%     1.2kB / 648B  0B / 0B       2

#Процессы внутри контейнера

# Список процессов в контейнере docker top my-container # Подробная информация о процессах docker top my-container aux

#Выполнение команд в контейнере

#docker exec

# Выполнение команды docker exec my-container ls -la # Интерактивная оболочка docker exec -it my-container bash # От имени конкретного пользователя docker exec -u root my-container apt update # С переменными окружения docker exec -e MY_VAR=value my-container env # В рабочей директории docker exec -w /app my-container pwd

Разница между docker exec и docker run:

  • exec выполняет команду в существующем контейнере
  • run создаёт новый контейнер для команды

#Копирование файлов

# Из контейнера на хост docker cp my-container:/app/logs/app.log ./app.log # С хоста в контейнер docker cp ./config.json my-container:/app/config.json # Копирование директории docker cp my-container:/app/data ./data # Копирование из запущенного контейнера в другой docker cp my-container:/app/data.tar.gz other-container:/tmp/ docker exec other-container tar -xzf /tmp/data.tar.gz -C /app/

#Очистка

#Удаление контейнеров

# Удаление одного контейнера docker rm my-container # Удаление нескольких docker rm container1 container2 container3 # Удаление всех остановленных контейнеров docker container prune # Удаление по фильтру docker rm $(docker ps -a -q --filter "status=exited") # Принудительное удаление запущенных docker rm -f $(docker ps -aq)

#Очистка всего (ядерная опция)

# Остановить все контейнеры docker stop $(docker ps -aq) # Удалить все контейнеры docker rm $(docker ps -aq) # Удалить все образы docker rmi $(docker images -q) # Удалить все volumes docker volume prune -a # Или одной командой (Docker 20.10+) docker system prune -a --volumes

Предупреждение: Это удалит все данные Docker на системе!

#Best Practices

#1. Используйте --rm для одноразовых контейнеров

# ✅ Хорошо — контейнер удалится автоматически docker run --rm ubuntu:22.04 echo "Hello" # ❌ Плохо — контейнер останется в статусе Exited docker run ubuntu:22.04 echo "Hello"

#2. Давайте контейнерам имена

# ✅ Хорошо docker run -d --name postgres-db postgres:15 # ❌ Плохо — придётся использовать ID или случайное имя docker run -d postgres:15

#3. Используйте health checks

docker run -d \ --name web \ --health-cmd="curl -f http://localhost/ || exit 1" \ --health-interval=30s \ --health-timeout=3s \ --health-retries=3 \ nginx

#4. Ограничивайте ресурсы

# ✅ Хорошо — защита от потребления всех ресурсов docker run -d \ --memory=512m \ --cpus=1 \ myapp # ❌ Плохо — может занять все ресурсы docker run -d myapp

#5. Логируйте в stdout/stderr

Не пишите логи в файлы внутри контейнера — используйте stdout/stderr. Docker перехватит их и отправит в logging driver.

# ✅ Хорошо import logging logging.basicConfig(level=logging.INFO) logging.info("Application started") # ❌ Плохо with open('/var/log/app.log', 'w') as f: f.write("Application started")

#6. Обрабатывайте сигналы корректно

Ваше приложение должно корректно обрабатывать SIGTERM для грациозной остановки.

# Python пример import signal import sys def signal_handler(sig, frame): # Завершение соединений, сохранение данных sys.exit(0) signal.signal(signal.SIGTERM, signal_handler)

#7. Используйте read-only файловую систему

docker run -d --read-only \ --tmpfs /tmp \ --tmpfs /var/run \ nginx

Это предотвращает запись в файловую систему контейнера, повышая безопасность.

#Troubleshooting

#Контейнер не запускается

# Проверить статус docker ps -a --filter "name=my-container" # Посмотреть логи docker logs my-container # Проверить exit code docker inspect --format='{{.State.ExitCode}}' my-container # 0 — успех, !=0 — ошибка

#Контейнер падает сразу после запуска

# Запустить в интерактивном режиме для отладки docker run -it --entrypoint bash myapp # Проверить переменные окружения docker run --rm myapp env # Запустить с другой командой docker run --rm myapp python --version

#Контейнер потребляет слишком много памяти

# Проверить статистику docker stats my-container # Ограничить память docker update --memory=512m my-container # Перезапустить с ограничениями docker stop my-container docker rm my-container docker run -d --memory=512m --name my-container myapp

#Контейнер не отвечает на запросы

# Проверить health status docker ps --format "{{.Names}}: {{.Status}}" # Проверить порты docker port my-container # Выполнить команду внутри docker exec my-container curl -f http://localhost:8000/health # Перезапустить docker restart my-container

#Практика: полный рабочий цикл

#Запуск PostgreSQL с веб-приложением

# Создать сеть docker network create app-network # Запустить базу данных docker run -d \ --name postgres \ --network app-network \ -e POSTGRES_USER=myuser \ -e POSTGRES_PASSWORD=mypassword \ -e POSTGRES_DB=myapp \ -v postgres-data:/var/lib/postgresql/data \ --restart unless-stopped \ postgres:15 # Запустить приложение docker run -d \ --name myapp \ --network app-network \ -e DATABASE_URL=postgresql://myuser:mypassword@postgres:5432/myapp \ -p 8000:8000 \ --restart unless-stopped \ myapp:latest # Проверить логи docker logs -f myapp # Проверить статистику docker stats postgres myapp # Остановка docker stop myapp postgres docker stop $(docker ps -aq)

Далее: Сеть в Docker