Skip to content
IRC-CodingIRC-Coding
DockerContainerImagesDockerfileDocker ComposeKubernetesDevOpsконтейнеризация

Docker Container: основы, Images, Dockerfile и Compose

Docker Container: основы, Images, Dockerfile, Docker Compose и Kubernetes. Практические примеры контейнеризации.

S

schutzgeist

10 min read
Docker Container: основы, Images, Dockerfile и Compose

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 из реестра

Типовые экзаменационные задачи

  1. Напишите Dockerfile для различных приложений
  2. Настройте Docker Compose для multi-контейнерных приложений
  3. Внедрите best practices по безопасности
  4. Оптимизируйте Docker-образы для production
  5. Мигрируйте приложения в Kubernetes

Итоги

Docker стал базовым инструментом современной разработки:

  • Контейнеризация: одинаковые окружения везде
  • Образы: переиспользуемые шаблоны для приложений
  • Dockerfile: автоматизация процессов сборки
  • Docker Compose: управление multi-контейнерными приложениями
  • Kubernetes: оркестрация для масштабируемых развёртываний

Эффективная работа с Docker требует понимания концепций контейнеризации, практик безопасности и техник оркестрации.

Рекомендуемые книги

Docker легко начать использовать для простых развёртываний, но платформа предлагает намного больше возможностей для повышения производительности и безопасности. Вложите время в изучение специальной литературы, чтобы раскрыть полный потенциал контейнеров. Рекомендуемые книги охватывают всё: от основ до продвинутых корпоративных решений и помогут вам проектировать и эксплуатировать профессиональные Docker-архитектуры.

Das Komplette Docker Handbuch: Containerisierte Anwendungen Erstellen, Verteilen, Ausführen

Das Komplette Docker Handbuch: Containerisierte Anwendungen Erstellen, Verteilen, Ausführen

39,99 €

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Назад к блогу
Share:

Похожие статьи