Запуск, остановка, мониторинг и логирование контейнеров
Контейнеры — это запущенные экземпляры образов. Научитесь управлять их жизненным циклом, мониторить и анализировать логи.
# Запуск в интерактивном режиме
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Политики автоматического перезапуска:
# Никогда не перезапускать (по умолчанию)
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 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 на системе!
# ✅ Хорошо — контейнер удалится автоматически
docker run --rm ubuntu:22.04 echo "Hello"
# ❌ Плохо — контейнер останется в статусе Exited
docker run ubuntu:22.04 echo "Hello"# ✅ Хорошо
docker run -d --name postgres-db postgres:15
# ❌ Плохо — придётся использовать ID или случайное имя
docker run -d postgres:15docker run -d \
--name web \
--health-cmd="curl -f http://localhost/ || exit 1" \
--health-interval=30s \
--health-timeout=3s \
--health-retries=3 \
nginx# ✅ Хорошо — защита от потребления всех ресурсов
docker run -d \
--memory=512m \
--cpus=1 \
myapp
# ❌ Плохо — может занять все ресурсы
docker run -d myappНе пишите логи в файлы внутри контейнера — используйте 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")Ваше приложение должно корректно обрабатывать SIGTERM для грациозной остановки.
# Python пример
import signal
import sys
def signal_handler(sig, frame):
# Завершение соединений, сохранение данных
sys.exit(0)
signal.signal(signal.SIGTERM, signal_handler)docker run -d --read-only \
--tmpfs /tmp \
--tmpfs /var/run \
nginxЭто предотвращает запись в файловую систему контейнера, повышая безопасность.
# Проверить статус
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# Создать сеть
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: типы сетей, изоляцию, коммуникацию между контейнерами и публикацию портов.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.