Перейти к содержимому

Docker Basics

Окно терминала
# Скачивание образа
docker pull <image>:<tag>
docker pull python:3.10
# Поиск образа
docker search <image>
docker search python
# Список локальных образов
docker images
docker image ls
# Удаление образа
docker rmi <image-id>
# Удаление неиспользуемых образов
docker image prune
# Создание образа из Dockerfile
docker 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
# Запуск с пробросом volumes
docker 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>
# Базовый образ
FROM python:3.10-slim
# Рабочая директория
WORKDIR /app
# Копирование файлов
COPY requirements.txt .
# Установка зависимостей
RUN pip install --no-cache-dir -r requirements.txt
# Копирование исходного кода
COPY . .
# Команда при запуске
CMD ["python", "main.py"]
# Базовый образ
FROM python:3.10-slim
# Метаданные
LABEL maintainer="your.email@example.com"
LABEL version="1.0"
LABEL description="Web scraper application"
# Переменные окружения
ENV PYTHONUNBUFFERED=1
ENV 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_HOME
USER appuser
# Команда при запуске
CMD ["python", "main.py"]
# Этап сборки
FROM python:3.10 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
# Этап запуска
FROM python:3.10-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "main.py"]
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 up
# Запуск в фоновом режиме
docker-compose up -d
# Остановка всех сервисов
docker-compose down
# Остановка с удалением volumes
docker-compose down -v
# Просмотр логов
docker-compose logs
docker-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
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: 5
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:
# Stage 1: Build
FROM python:3.10 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
# Stage 2: Runtime
FROM python:3.10-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
# Создание пользователя
RUN useradd -m appuser && chown -R appuser /app
USER appuser
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "main.py"]
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
# Virtual Environment
venv/
env/
.venv
# IDE
.vscode/
.idea/
# OS
.DS_Store
Thumbs.db
# Git
.git/
.gitignore
# Docker
Dockerfile
docker-compose.yml
.dockerignore
# Documentation
*.md
docs/
# Tests
tests/
.pytest_cache/
# Logs
*.log
logs/
FROM python:3.10-slim
WORKDIR /app
# Сначала копируем requirements.txt
COPY requirements.txt .
# Устанавливаем зависимости (кэшируется, если requirements.txt не изменился)
RUN pip install --no-cache-dir -r requirements.txt
# Затем копируем код
COPY . .
CMD ["python", "main.py"]
# Используйте конкретную версию тега
FROM python:3.10-slim # Хорошо
# FROM python:latest # Плохо
# Не используйте root пользователя
RUN useradd -m appuser
USER 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>
# Проверка volumes
docker 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