Docker контейнеры: основы, образы, Dockerfile и Docker Compose
Docker революционизировал разработку ПО благодаря контейнеризации. Он обеспечивает согласованность окружения от разработки до production и решает проблему “у меня на машине это работает”.
Основы Docker
Что такое контейнеризация?
Контейнеризация - это технология виртуализации на уровне операционной системы, которая запускает приложения со всеми зависимостями в изолированных окружениях.
Docker против виртуальных машин
# Виртуальная машина (VM)
# - Полная операционная система
# - Требуется гипервизор
# - Высокое потребление ресурсов
# - Медленный старт
# Docker контейнер
# - Общее ядро ОС
# - Гипервизор не требуется
# - Низкое потребление ресурсов
# - Быстрый старт
Архитектура Docker
# Компоненты Docker
# 1. Docker Daemon (dockerd)
# - Управляет контейнерами, образами, сетями, томами
# - Работает в фоне
# - API endpoint для клиентов
# 2. Docker Client (docker)
# - Интерфейс командной строки
# - Взаимодействует с Docker Daemon
# - Взаимодействие пользователя
# 3. Docker Registry
# - Хранилище образов (Docker Hub)
# - Публичные и приватные реестры
# 4. Docker Objects
# - Images: шаблоны для контейнеров
# - Containers: работающие экземпляры
# - Networks: коммуникация контейнеров
# - Volumes: хранилище данных
Установка и настройка Docker
Установка
# Ubuntu/Debian
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
# CentOS/RHEL
sudo yum install docker
sudo systemctl start docker
sudo systemctl enable docker
# Docker Desktop (Windows/Mac)
# Загрузите с https://www.docker.com/products/docker-desktop
# Добавление пользователя в группу docker
sudo usermod -aG docker $USER
newgrp docker
# Проверка установки
docker --version
docker info
Основные команды
# Версия Docker и информация о системе
docker version
docker info
docker system df
# Управление образами
docker images
docker pull ubuntu:latest
docker search nginx
docker rmi nginx:latest
# Управление контейнерами
docker ps # Работающие контейнеры
docker ps -a # Все контейнеры
docker run nginx # Запуск контейнера
docker stop container_id # Остановка контейнера
docker rm container_id # Удаление контейнера
# Логи и инспекция
docker logs container_id
docker inspect container_id
docker exec -it container_id bash
Docker образы
Что такое Docker образы?
Docker образы - это защищённые от записи шаблоны для создания контейнеров. Они состоят из нескольких слоёв (layers).
Структура образа
# Структура слоёв Docker образа
# 1. Base Layer (например Ubuntu)
# 2. Dependencies Layer (например Python)
# 3. Application Layer (например веб-приложение)
# 4. Configuration Layer (например переменные окружения)
# Просмотр слоёв
docker history nginx:latest
# Информация об образе
docker inspect nginx:latest
Dockerfile
Dockerfile - это текстовый файл с инструкциями для создания Docker образа.
# Пример Dockerfile для Node.js приложения
# Базовый образ
FROM node:16-alpine
# Метаданные
LABEL maintainer="max@example.com"
LABEL version="1.0"
LABEL description="Node.js web application"
# Рабочая директория
WORKDIR /app
# Переменные окружения
ENV NODE_ENV=production
ENV PORT=3000
# Копирование файлов
COPY package*.json ./
RUN npm install --production
# Копирование кода приложения
COPY . .
# Создание пользователя (best practice для безопасности)
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
USER nodejs
# Открытие порта
EXPOSE 3000
# Health Check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
# Команда запуска
CMD ["node", "server.js"]
Best practices для Dockerfile
# Best practices для Dockerfile
# 1. Минималистичный базовый образ
FROM alpine:latest
# 2. Использование специфичных тегов (не latest)
FROM node:16.14.2-alpine
# 3. Использование .dockerignore
# .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
# 4. Оптимизация кеша слоёв
COPY package*.json ./
RUN npm install
COPY . .
# 5. Multi-stage builds
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:16-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]
# 6. Best practices для безопасности
USER nonrootuser
RUN rm -rf /var/cache/apk/*
Создание и управление образами
# Построение образа
docker build -t myapp:1.0 .
docker build -t myapp:latest -f Dockerfile.prod .
# Образ с build-args
docker build --build-arg NODE_ENV=production -t myapp:prod .
# Multi-platform build
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:multi .
# Тегирование образов
docker tag myapp:1.0 myregistry/myapp:1.0
docker tag myapp:latest myregistry/myapp:latest
# Push образов
docker login myregistry.com
docker push myregistry/myapp:1.0
docker push myregistry/myapp:latest
# Очистка образов
docker image prune -f
docker image prune -a -f
Docker контейнеры
Жизненный цикл контейнера
# Создание и запуск контейнера
docker run --name mywebserver -d -p 8080:80 nginx
# Контейнер с томами
docker run --name mydb -v /data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql:8.0
# Контейнер с сетью
docker network create mynetwork
docker run --name myapp --network mynetwork -d myapp:latest
# Управление контейнерами
docker start mywebserver
docker stop mywebserver
docker restart mywebserver
docker pause mywebserver
docker unpause mywebserver
# Инспекция контейнера
docker logs mywebserver
docker logs -f mywebserver # Следить за логами
docker stats mywebserver # Использование ресурсов
docker exec -it mywebserver bash
Конфигурация контейнера
# Ограничения ресурсов
docker run --memory="512m" --cpus="1.0" myapp:latest
# Переменные окружения
docker run -e NODE_ENV=production -e PORT=3000 myapp:latest
# Тома
docker run -v /host/path:/container/path myapp:latest
docker run -v myvolume:/container/path myapp:latest
# Порты
docker run -p 8080:80 -p 8443:443 myapp:latest
# Сети
docker run --network bridge myapp:latest
docker run --network host myapp:latest
docker run --network none myapp:latest
# Политики перезапуска
docker run --restart=always myapp:latest
docker run --restart=on-failure:5 myapp:latest
docker run --restart=unless-stopped myapp:latest
Docker тома
# Типы томов
# 1. Bind Mounts: файловая система хоста
docker run -v /host/data:/container/data myapp:latest
# 2. Named Volumes: управляется Docker
docker volume create mydata
docker run -v mydata:/container/data myapp:latest
# 3. Anonymous Volumes: создаётся автоматически
docker run -v /container/data myapp:latest
# Управление томами
docker volume ls
docker volume inspect mydata
docker volume rm mydata
docker volume prune
# Резервная копия и восстановление
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/mydata-backup.tar.gz /data
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar xzf /backup/mydata-backup.tar.gz -C /
Docker сети
Типы сетей
# Bridge Network (стандартный)
docker network create mybridge
docker run --network mybridge myapp:latest
# Host Network
docker run --network host myapp:latest
# None Network
docker run --network none myapp:latest
# Overlay Network (мультиузловой)
docker network create --driver overlay myoverlay
Конфигурация сети
# Создание сети
docker network create --driver bridge --subnet 192.168.1.0/24 mynetwork
# Запуск контейнера в сети
docker run --network mynetwork --ip 192.168.1.10 myapp:latest
# Управление подключениями
docker network connect mynetwork mycontainer
docker network disconnect mynetwork mycontainer
# Просмотр информации о сети
docker network inspect mynetwork
docker network ls
docker network prune
Docker Compose
Основы Docker Compose
Docker Compose позволяет определять и управлять приложениями с несколькими контейнерами в едином файле конфигурации.
# docker-compose.yml
version: '3.8'
services:
# Веб-сервис
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:password@db:5432/myapp
depends_on:
- db
- redis
volumes:
- ./logs:/app/logs
restart: unless-stopped
networks:
- app-network
# Сервис базы данных
db:
image: postgres:13
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
restart: unless-stopped
networks:
- app-network
# Redis кэш
redis:
image: redis:6-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
restart: unless-stopped
networks:
- app-network
# Nginx обратный прокси
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- web
restart: unless-stopped
networks:
- app-network
# Тома
volumes:
postgres_data:
redis_data:
# Сети
networks:
app-network:
driver: bridge
Команды Docker Compose
# Запуск сервисов
docker-compose up
docker-compose up -d # Фоновый режим
docker-compose up --build # С пересборкой
# Остановка сервисов
docker-compose down
docker-compose down -v # С удалением томов
# Просмотр логов
docker-compose logs
docker-compose logs -f web
docker-compose logs --tail=100 web
# Управление сервисами
docker-compose ps
docker-compose restart web
docker-compose stop web
docker-compose start web
# Масштабирование
docker-compose up -d --scale web=3
# Построение образов
docker-compose build
docker-compose build --no-cache
docker-compose build web
# Переменные окружения
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
Конфигурация для разных окружений
# docker-compose.override.yml (разработка)
version: '3.8'
services:
web:
environment:
- NODE_ENV=development
volumes:
- .:/app
- /app/node_modules
command: npm run dev
db:
ports:
- "5432:5432"
# docker-compose.prod.yml (продакшн)
version: '3.8'
services:
web:
environment:
- NODE_ENV=production
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
nginx:
ports:
- "80:80"
- "443:443"
Docker Security
Лучшие практики безопасности
# 1. Минималистичный базовый образ
FROM alpine:latest
# 2. Непривилегированный пользователь
RUN addgroup -g 1001 -S appgroup && \
adduser -S appuser -u 1001 -G appgroup
USER appuser
# 3. Использование secrets (не в образе)
# docker run --secret=mysecret myapp:latest
# 4. Файловая система только для чтения
docker run --read-only --tmpfs /tmp myapp:latest
# 5. Ограничение ресурсов
docker run --memory=512m --cpus=1.0 myapp:latest
Сканирование образов на уязвимости
# Сканирование с Trivy
trivy image myapp:latest
# Docker Scout (официальный инструмент)
docker scout cves myapp:latest
# Проверка Dockerfile
hadolint Dockerfile
Мониторинг и логирование Docker
Стратегии логирования
# docker-compose.yml с конфигурацией логирования
version: '3.8'
services:
web:
image: myapp:latest
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
labels:
- "logging=promtail"
# ELK Stack для логирования
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
environment:
- discovery.type=single-node
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:7.14.0
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
kibana:
image: docker.elastic.co/kibana/kibana:7.14.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
Мониторинг с Prometheus
# docker-compose.monitoring.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/dashboards:/etc/grafana/provisioning/dashboards
node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
volumes:
prometheus_data:
grafana_data:
Docker и Kubernetes
Основы Kubernetes
# kubernetes/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myregistry/myapp:1.0
ports:
- containerPort: 3000
env:
- name: NODE_ENV
value: "production"
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
Миграция с Docker на Kubernetes
# Конвертация с Kompose
kompose convert -f docker-compose.yml
# Применение манифестов Kubernetes
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
# Управление развёртыванием
kubectl get deployments
kubectl get pods
kubectl logs -f deployment/myapp-deployment
kubectl scale deployment myapp-deployment --replicas=5
Лучшие практики Docker
Оптимизация производительности
# Multi-stage build для уменьшения размера образа
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
COPY . .
RUN npm run build
FROM node:16-alpine AS runtime
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]
Production-развертывание
# docker-compose.prod.yml
version: '3.8'
services:
web:
image: myregistry/myapp:${VERSION}
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Устранение неполадок
Типичные проблемы
# 1. Контейнер не запускается
docker logs container_id
docker inspect container_id
# 2. Недостаточно места
docker system df
docker system prune -a -f
docker volume prune -f
# 3. Проблемы с сетью
docker network inspect network_name
docker exec -it container_id ping other_container
# 4. Ошибки прав доступа
sudo chown -R $USER:$USER /var/run/docker.sock
# 5. Ошибки загрузки образов
docker system prune -f
docker pull --no-cache image_name
Техники отладки
# Исследование контейнера
docker exec -it container_id /bin/sh
docker exec -it container_id /bin/bash
# Копирование файлов
docker cp container_id:/path/file.txt .
docker cp file.txt container_id:/path/
# Анализ слоёв образа
docker history image_name
dive image_name
# Анализ производительности
docker stats
docker top container_id
Ключевые концепции для проверки знаний
Основные команды Docker
| Команда | Описание | Применение |
|---|---|---|
docker build | Создание образа | Из Dockerfile |
docker run | Запуск контейнера | Выполнение приложения |
docker-compose up | Запуск multi-контейнерных приложений | Среда разработки |
docker push | Загрузка образа | Upload в реестр |
docker pull | Загрузка образа | Download из реестра |
Типовые экзаменационные задачи
- Напишите Dockerfile для различных приложений
- Настройте Docker Compose для multi-контейнерных приложений
- Внедрите best practices по безопасности
- Оптимизируйте Docker-образы для production
- Мигрируйте приложения в Kubernetes
Итоги
Docker стал базовым инструментом современной разработки:
- Контейнеризация: одинаковые окружения везде
- Образы: переиспользуемые шаблоны для приложений
- Dockerfile: автоматизация процессов сборки
- Docker Compose: управление multi-контейнерными приложениями
- Kubernetes: оркестрация для масштабируемых развёртываний
Эффективная работа с Docker требует понимания концепций контейнеризации, практик безопасности и техник оркестрации.
Рекомендуемые книги
Docker легко начать использовать для простых развёртываний, но платформа предлагает намного больше возможностей для повышения производительности и безопасности. Вложите время в изучение специальной литературы, чтобы раскрыть полный потенциал контейнеров. Рекомендуемые книги охватывают всё: от основ до продвинутых корпоративных решений и помогут вам проектировать и эксплуатировать профессиональные Docker-архитектуры.
Docker: Das Praxisbuch für Entwickler und DevOps-Teams. Grundlagen, Einstieg, Konzepte. Für Windows, macOS und Linux. Ausgabe 2026
44,99 €
Bei Amazon ansehenAffiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.
Das Komplette Docker Handbuch: Containerisierte Anwendungen Erstellen, Verteilen, Ausführen
39,99 €
Bei Amazon ansehenAffiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.



