Docker — это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнеры позволяют упаковать приложение со всеми его зависимостями в стандартизированный блок, который гарантированно работает одинаково в любом окружении — от ноутбука разработчика до продакшн-сервера.
Образ — это неизменяемый шаблон для создания контейнеров. Он содержит операционную систему, приложение и все необходимые зависимости. Образы строятся слоями, где каждый слой представляет изменения от предыдущего.
Контейнер — это запущенный экземпляр образа. Контейнеры изолированы друг от друга и от хост-системы, но могут обмениваться данными через сети и тома.
Текстовый файл с инструкциями для построения образа. Каждая инструкция создаёт новый слой образа.
Инструмент для определения и запуска многоконтейнерных приложений с помощью YAML-файла.
# Установка Docker Engine
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Добавление пользователя в группу docker
sudo usermod -aG docker $USER
newgrp docker
# Проверка установки
docker --version
docker run hello-world
Установите Docker Desktop с официального сайта docker.com. Приложение включает Docker Engine, Docker CLI, Docker Compose и Kubernetes.
# Скачать образ из Docker Hub
docker pull nginx:latest
docker pull python:3.12-slim
# Список локальных образов
docker images
# Построить образ из Dockerfile
docker build -t myapp:1.0 .
docker build -f Dockerfile.prod -t myapp:prod .
# Удалить образ
docker rmi nginx:latest
# Пушнуть образ в registry
docker tag myapp:1.0 username/myapp:1.0
docker push username/myapp:1.0
# Запуск контейнера
docker run nginx
docker run -d nginx # фоновый режим
docker run -d -p 8080:80 nginx # проброс порта
docker run -d --name web nginx # с именем
docker run -it ubuntu bash # интерактивный режим
# Список контейнеров
docker ps # запущенные
docker ps -a # все
# Управление контейнерами
docker stop web
docker start web
docker restart web
docker rm web # удалить
docker rm -f web # принудительно
# Логи и отладка
docker logs web
docker logs -f web # follow
docker logs --tail 100 web # последние 100 строк
# Выполнение команды внутри контейнера
docker exec -it web bash
docker exec web cat /etc/nginx/nginx.conf
# Используем официальный slim-образ
FROM python:3.12-slim as builder
# Устанавливаем зависимости для сборки
RUN apt-get update && apt-get install -y \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# Создаём виртуальное окружение
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# Копируем и устанавливаем зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Финальный образ
FROM python:3.12-slim
# Копируем виртуальное окружение из builder
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# Создаём непривилегированного пользователя
RUN useradd --create-home appuser
WORKDIR /home/appuser/app
USER appuser
# Копируем код приложения
COPY --chown=appuser:appuser . .
# Healthcheck
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8000/health || exit 1
# Запуск
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
volumes:
- ./app:/home/appuser/app
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/nginx/certs:ro
depends_on:
- app
volumes:
postgres_data:
redis_data:
# Запуск всех сервисов
docker compose up -d
# Пересборка и запуск
docker compose up -d --build
# Просмотр логов
docker compose logs -f
docker compose logs app
# Остановка
docker compose down
docker compose down -v # удалить volumes
# Масштабирование
docker compose up -d --scale app=3
# Создание сети
docker network create mynetwork
# Запуск в сети
docker run -d --network mynetwork --name app myapp
# Список сетей
docker network ls
# Инспекция
docker network inspect mynetwork
# Named volumes (рекомендуется)
docker volume create mydata
docker run -v mydata:/app/data myapp
# Bind mounts (для разработки)
docker run -v $(pwd)/src:/app/src myapp
# Список томов
docker volume ls
# Удаление неиспользуемых
docker volume prune
# Ограничение ресурсов
docker run -d \
--memory="512m" \
--cpus="1.0" \
--read-only \
--security-opt=no-new-privileges \
myapp
# Очистка системы
docker system prune -a
# Статистика ресурсов
docker stats
# Информация о системе
docker info
# История образа
docker history myapp:latest