Docker Basics
Основные команды
Заголовок раздела «Основные команды»Управление образами
Заголовок раздела «Управление образами»# Скачивание образаdocker pull <image>:<tag>docker pull python:3.10
# Поиск образаdocker search <image>docker search python
# Список локальных образовdocker imagesdocker image ls
# Удаление образаdocker rmi <image-id>
# Удаление неиспользуемых образовdocker image prune
# Создание образа из Dockerfiledocker build -t <image-name> .docker build -t my-app:1.0 .Управление контейнерами
Заголовок раздела «Управление контейнерами»# Запуск контейнераdocker run <image>docker run python:3.10 python --version
# Запуск в фоновом режимеdocker run -d <image>
# Запуск с пробросом портаdocker run -p 8080:80 nginx
# Запуск с именемdocker run --name my-container python:3.10
# Запуск интерактивного контейнераdocker run -it python:3.10 bash
# Запуск с пробросом volumesdocker run -v /host/path:/container/path python:3.10
# Список запущенных контейнеровdocker ps
# Список всех контейнеровdocker ps -a
# Остановка контейнераdocker stop <container-id>
# Запуск остановленного контейнераdocker start <container-id>
# Перезапуск контейнераdocker restart <container-id>
# Удаление контейнераdocker rm <container-id>
# Удаление остановленных контейнеровdocker container prune
# Просмотр логовdocker logs <container-id>docker logs -f <container-id> # follow mode
# Подключение к работающему контейнеруdocker exec -it <container-id> bash
# Копирование файловdocker cp <local-file> <container-id>:/path/docker cp <container-id>:/path/file <local-path>Инспектирование
Заголовок раздела «Инспектирование»# Информация о контейнереdocker inspect <container-id>
# Информация об образеdocker inspect <image-id>
# Просмотр процессов в контейнереdocker top <container-id>
# Просмотр статистики использования ресурсовdocker stats <container-id>Dockerfile
Заголовок раздела «Dockerfile»Базовый Dockerfile
Заголовок раздела «Базовый Dockerfile»# Базовый образFROM python:3.10-slim
# Рабочая директорияWORKDIR /app
# Копирование файловCOPY requirements.txt .
# Установка зависимостейRUN pip install --no-cache-dir -r requirements.txt
# Копирование исходного кодаCOPY . .
# Команда при запускеCMD ["python", "main.py"]Расширенный Dockerfile
Заголовок раздела «Расширенный Dockerfile»# Базовый образFROM python:3.10-slim
# МетаданныеLABEL maintainer="your.email@example.com"LABEL version="1.0"LABEL description="Web scraper application"
# Переменные окруженияENV PYTHONUNBUFFERED=1ENV APP_HOME=/app
# Рабочая директорияWORKDIR $APP_HOME
# Установка системных зависимостейRUN apt-get update && apt-get install -y \ curl \ && rm -rf /var/lib/apt/lists/*
# Копирование и установка зависимостейCOPY requirements.txt .RUN pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir -r requirements.txt
# Копирование исходного кодаCOPY . .
# Создание пользователяRUN useradd -m appuser && chown -R appuser $APP_HOMEUSER appuser
# Команда при запускеCMD ["python", "main.py"]Dockerfile для многопроцессорной сборки
Заголовок раздела «Dockerfile для многопроцессорной сборки»# Этап сборкиFROM python:3.10 AS builder
WORKDIR /appCOPY requirements.txt .RUN pip install --user --no-cache-dir -r requirements.txt
# Этап запускаFROM python:3.10-slim
WORKDIR /appCOPY --from=builder /root/.local /root/.localCOPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "main.py"]Docker Compose
Заголовок раздела «Docker Compose»docker-compose.yml
Заголовок раздела «docker-compose.yml»version: '3.8'
services: # Веб-приложение app: build: . container_name: web-app ports: - "8000:8000" volumes: - ./data:/app/data - ./logs:/app/logs environment: - DEBUG=False - DATABASE_URL=postgresql://user:pass@db:5432/mydb depends_on: - db restart: unless-stopped
# База данных db: image: postgres:13 container_name: postgres-db environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" restart: unless-stopped
# Redis redis: image: redis:7 container_name: redis ports: - "6379:6379" volumes: - redis_data:/data restart: unless-stopped
volumes: postgres_data: redis_data:Команды Docker Compose
Заголовок раздела «Команды Docker Compose»# Запуск всех сервисовdocker-compose up
# Запуск в фоновом режимеdocker-compose up -d
# Остановка всех сервисовdocker-compose down
# Остановка с удалением volumesdocker-compose down -v
# Просмотр логовdocker-compose logsdocker-compose logs -f <service-name>
# Пересборка и запускdocker-compose up --build
# Перезапуск сервисаdocker-compose restart <service-name>
# Просмотр состояния сервисовdocker-compose ps
# Выполнение команды в контейнереdocker-compose exec <service-name> bash
# Масштабирование сервисаdocker-compose up -d --scale <service-name>=3
# Остановка сервисовdocker-compose stop
# Запуск остановленных сервисовdocker-compose startПолезные примеры
Заголовок раздела «Полезные примеры»Python + PostgreSQL
Заголовок раздела «Python + PostgreSQL»version: '3.8'
services: app: build: . environment: DATABASE_URL: postgresql://user:pass@db:5432/mydb depends_on: db: condition: service_healthy
db: image: postgres:13 environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb healthcheck: test: ["CMD-SHELL", "pg_isready -U user"] interval: 5s timeout: 5s retries: 5Airflow + PostgreSQL + Redis
Заголовок раздела «Airflow + PostgreSQL + Redis»version: '3.8'
services: airflow: image: apache/airflow:2.7.0-python3.10 depends_on: - postgres - redis environment: AIRFLOW__CORE__EXECUTOR: CeleryExecutor AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres:5432/airflow AIRFLOW__CELERY__BROKER_URL: redis://redis:6379/0 volumes: - ./dags:/opt/airflow/dags ports: - "8080:8080"
postgres: image: postgres:13 environment: POSTGRES_USER: airflow POSTGRES_PASSWORD: airflow POSTGRES_DB: airflow volumes: - postgres_data:/var/lib/postgresql/data
redis: image: redis:7
volumes: postgres_data:Multi-stage build для Python приложения
Заголовок раздела «Multi-stage build для Python приложения»# Stage 1: BuildFROM python:3.10 AS builder
WORKDIR /appCOPY requirements.txt .RUN pip install --user --no-cache-dir -r requirements.txt
# Stage 2: RuntimeFROM python:3.10-slim
WORKDIR /appCOPY --from=builder /root/.local /root/.localCOPY . .
# Создание пользователяRUN useradd -m appuser && chown -R appuser /appUSER appuser
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "main.py"]Оптимизация
Заголовок раздела «Оптимизация».dockerignore
Заголовок раздела «.dockerignore»# Python__pycache__/*.py[cod]*$py.class*.so
# Virtual Environmentvenv/env/.venv
# IDE.vscode/.idea/
# OS.DS_StoreThumbs.db
# Git.git/.gitignore
# DockerDockerfiledocker-compose.yml.dockerignore
# Documentation*.mddocs/
# Teststests/.pytest_cache/
# Logs*.loglogs/Многослойный кэш
Заголовок раздела «Многослойный кэш»FROM python:3.10-slim
WORKDIR /app
# Сначала копируем requirements.txtCOPY requirements.txt .
# Устанавливаем зависимости (кэшируется, если requirements.txt не изменился)RUN pip install --no-cache-dir -r requirements.txt
# Затем копируем кодCOPY . .
CMD ["python", "main.py"]Безопасность
Заголовок раздела «Безопасность»Безопасный Dockerfile
Заголовок раздела «Безопасный Dockerfile»# Используйте конкретную версию тегаFROM python:3.10-slim # Хорошо# FROM python:latest # Плохо
# Не используйте root пользователяRUN useradd -m appuserUSER appuser
# Не сохраняйте секреты в образе# Используйте переменные окруженияENV DATABASE_URL=${DATABASE_URL}
# Уменьшайте размер образа# Удаляйте кэш после установкиRUN apt-get update && apt-get install -y \ package \ && rm -rf /var/lib/apt/lists/*
# Сканируйте образ на уязвимости# docker scan <image-name>Отладка
Заголовок раздела «Отладка»Диагностика
Заголовок раздела «Диагностика»# Проверка использования ресурсовdocker stats
# Просмотр процессовdocker top <container-id>
# Проверка журналовdocker logs <container-id>
# Проверка сетевого подключенияdocker network inspect <network-name>
# Проверка volumesdocker volume inspect <volume-name>Режим отладки
Заголовок раздела «Режим отладки»# Запуск с отладкойdocker run --rm -it \ -e DEBUG=True \ -v $(pwd):/app \ python:3.10 \ bash
# Подключение к контейнеруdocker exec -it <container-id> bash
# Запуск с одноразовым контейнеромdocker run --rm python:3.10 python --version