Что такое Docker: концепция контейнеризации для системных администраторов и DevOps | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Что такое Docker: концепция контейнеризации для системных администраторов и DevOps

01 апреля 2026 12 мин. чтения
Содержание статьи

Проблемы, которые Docker решает для системного администратора и DevOps

Если вы системный администратор или DevOps-инженер, вы ежедневно сталкиваетесь с задачами, которые Docker решает эффективно и экономно. Основная проблема — невоспроизводимость среды: приложение, которое работает на машине разработчика, может не запуститься на тестовом или production сервере из-за различий в версиях библиотек, операционных систем или конфигураций. Docker устраняет эту проблему, упаковывая приложение со всеми его зависимостями в стандартизированный контейнер.

Конкретные сценарии, где Docker приносит пользу:

  • Развертывание сложных приложений: Например, для деплоя e-commerce платформы Reaction Commerce (Mailchimp Open Commerce) рекомендуется использовать Docker и Docker Compose. Это позволяет гарантированно запустить все компоненты (Node.js сервер, MongoDB, GraphQL API) в единой, управляемой среде.
  • Локальная разработка и тестирование: Docker можно использовать даже в мобильной среде Termux на Android для создания воспроизводимой среды для отладки серверless-функций, совместимых с AWS Lambda или OpenFaaS. Это позволяет разработчику тестировать код локально перед отправкой в облако.

Ключевые преимущества Docker для специалистов:

  • Изоляция: Контейнеры работают независимо друг от друга и от основной системы, что предотвращает конфликты и повышает безопасность.
  • Воспроизводимость: Образ Docker гарантирует одинаковое поведение приложения на любой машине — от локального компьютера разработчика до кластера в облаке.
  • Упрощение развертывания: Процесс деплоя сводится к команде docker run, что устраняет сложные ручные процедуры установки и настройки.
  • Управление зависимостями: Все библиотеки и службы, необходимые приложению, включены в образ, что устраняет проблему "сработает только на моей машине".

Архитектура Docker: как это работает на уровне ядра ОС

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

Демон, клиент и реестр: три ключевые компоненты платформы

Архитектура Docker состоит из трех основных компонентов:

  • Docker Daemon (демон): Это сервис (dockerd), который работает на хосте и управляет жизненным циклом контейнеров — их созданием, запуском, остановкой. Он отвечает за взаимодействие с ядром ОС.
  • Docker Client (клиент): Командная строка (docker) или другие инструменты (API), которые отправляют команды демону. Например, команда docker run nginx от клиента поступает демону, который затем выполняет ее.
  • Docker Registry (реестр): Сервис для хранения и распространения образов Docker. Самый известный — Docker Hub. Команда docker pull ubuntu скачивает образ из реестра на ваш локальный компьютер.

Примеры базовых команд для взаимодействия:

  • Запуск демона (обычно выполняется автоматически после установки): sudo systemctl start docker
  • Проверка связи клиента с демоном: docker version
  • Поиск образов в реестре: docker search nginx

Ядро Linux предоставляет две ключевые технологии для работы Docker:

  • Namespaces: Изолируют ресурсы контейнера (процессы, сеть, файловую систему) от других контейнеров и хоста.
  • cgroups (control groups): Ограничивают и отслеживают использование ресурсов (CPU, память, диск) для каждого контейнера.

Контейнер vs Виртуальная машина: сравнительная таблица для принятия решения

Выбор между контейнером и виртуальной машиной зависит от задачи. Для микросервисов, CI/CD и быстрого масштабирования Docker часто оказывается лучшим выбором.

Критерий Контейнер Docker Виртуальная машина (VM)
Уровень изоляции Изоляция процессов на уровне ядра ОС. Контейнеры используют одно ядро хоста. Полная изоляция через виртуализацию аппаратного обеспечения. Каждая VM имеет свою полноценную ОС.
Потребление ресурсов (RAM, CPU) Минимальное. Контейнеры — это просто процессы, они не требуют ресурсов для отдельной ОС. Высокое. Каждая VM требует выделения памяти и CPU для своей операционной системы.
Скорость запуска/остановки Мгновенная (секунды). Контейнер запускается как обычный процесс. Длительная (минуты). Запуск включает загрузку полноценной ОС.
Степень совместимости с ОС хоста Контейнеры требуют совместимого ядра (обычно Linux). Не могут запустить Windows-приложение на Linux хосте. Полная независимость. Можно запустить любую ОС на любом хосте.
Типичные use cases Микросервисы, веб-приложения, среды разработки, CI/CD пайплайны, быстрое масштабирование. Полная виртуализация серверов, запуск приложений с разными ОС, требования максимальной безопасности и изоляции.

Практические выгоды для сисадмина: экономия ресурсов сервера (можно запустить больше сервисов на одной машине) и быстрое масштабирование (новые контейнеры запускаются за секунды в ответ на нагрузку).

Основные операции Docker: от установки до первого контейнера

Давайте перейдем к практике. Ниже приведены проверенные инструкции для быстрого старта с Docker.

Установка Docker и первоначальная настройка

Для системных администраторов наиболее распространены установки на Linux. Вот команды для популярных дистрибутивов.

Ubuntu/Debian:

# Обновляем индекс пакетов
sudo apt update
# Устанавливаем необходимые пакеты для работы с репозиториями
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# Добавляем официальный GPG ключ Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Добавляем репозиторий Docker
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Устанавливаем Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# Добавляем текущего пользователя в группу docker, чтобы не использовать sudo для каждой команды
sudo usermod -aG docker $USER
# Проверяем установку
docker --version

CentOS/RHEL:

# Устанавливаем yum-utils
sudo yum install -y yum-utils
# Добавляем репозиторий Docker
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Устанавливаем Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io
# Запускаем и добавляем в автозагрузку демон Docker
sudo systemctl start docker
sudo systemctl enable docker
# Проверяем установку
docker --version

После установки выполните тестовый запуск контейнера для проверки работы всей системы:

docker run hello-world

Эта команда скачает небольшой тестовый образ из Docker Hub и запустит его. Если вы увидите сообщение "Hello from Docker!", значит установка успешна.

Решение частых проблем после установки:

  • Если команда docker не работает без sudo, убедитесь, что вы выполнили sudo usermod -aG docker $USER и перезапустили сессию (выйдите и войдите в систему).
  • Если демон не запускается, проверьте статус службы: sudo systemctl status docker.

Базовые команды для управления контейнером: запуск, просмотр, остановка

Минимально необходимый набор команд для ежедневной работы:

  • docker pull [image]: Скачивает образ из реестра (например, docker pull nginx).
  • docker run: Создает и запускает контейнер из образa. Ключевые флаги:
    • -d: Запустить контейнер в detached mode (в фоне).
    • -p [host_port]:[container_port]: Публикация порта контейнера на порт хоста (например, -p 8080:80 для веб-сервера).
    • --name [name]: Дать контейнеру имя для удобного управления.
    Пример: docker run -d --name my-nginx -p 8080:80 nginx запустит Nginx в фоне и сделает его доступным на порту 8080 вашего сервера.
  • docker ps: Показывает запущенные контейнеры.
    • -a: Показать все контейнеры, включая остановленные.
  • docker stop [container_name/id]: Останавливает запущенный контейнер (например, docker stop my-nginx).
  • docker rm [container_name/id]: Удаляет остановленный контейнер. Для удаления всех остановленных контейнеров: docker container prune.
  • docker logs [container_name/id]: Показывает логи (вывод) контейнера. Ключ -f позволяет следить за логами в реальном времени.

Практический пример с реальным образом PostgreSQL:

# Запуск базы данных PostgreSQL с заданием пароля и именем контейнера
docker run -d --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 postgres
# Проверка, что контейнер запущен
docker ps
# Подключение к контейнеру для проверки (используя клиент внутри контейнера)
docker exec -it my-postgres psql -U postgres

Dockerfile и образы: создание воспроизводимой среды

Готовые образы из реестра удобны, но для собственных приложений необходимо создавать свои образы. Dockerfile — это текстовый файл с инструкциями для сборки такого образa.

Структура Dockerfile: от базового образа до конечного приложения

Рассмотрим каждую ключевую инструкцию Dockerfile:

  • FROM: Определяет базовый образ, от которого строится ваш. Это основа, например, минимальная ОС или язык программирования.
    FROM ubuntu:22.04  # Используем Ubuntu как базовую ОС
    FROM python:3.9-slim  # Используем легкий образ Python
    
  • RUN: Выполняет команды внутри контейнера во время сборки образa (например, установка пакетов).
    RUN apt update && apt install -y python3 python3-pip  # Установка Python в Ubuntu
    
  • COPY: Копирует файлы и директории из локальной системы (контекста сборки) внутрь образa.
    COPY ./app /usr/src/app  # Копируем код приложения в контейнер
    
  • WORKDIR: Устанавливает рабочую директорию внутри контейнера для всех следующих команд.
    WORKDIR /usr/src/app  # Теперь все команды будут выполняться из этой папки
    
  • CMD или ENTRYPOINT: Определяет команду, которая будет выполнена при запуске контейнера из этого образa.
    CMD ["python", "app.py"]  # Запускаем наш Python скрипт при старте контейнера
    

Пример рабочего Dockerfile для простого веб-приложения на Python (Flask):

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Сборка, тегирование и оптимизация образов

Создание образa из Dockerfile:

docker build -t my-app:latest .

Флаг -t задает имя и тег образa (например, my-app:v1.0). Тегирование важно для версионирования.

Образы Docker состоят из слоев (layers). Каждая инструкция в Dockerfile создает новый слой. Это позволяет эффективно использовать кэш при повторной сборке.

Методы оптимизации образов:

  • Использование .dockerignore: Файл, аналогичный .gitignore, исключает ненужные файлы (например, логи, временные файлы) из контекста сборки, уменьшая размер образa.
  • Объединение RUN команд: Соединение нескольких команд RUN в одну с помощью && уменьшает количество слоев.
    RUN apt update && apt install -y \
        package1 \
        package2 \
        && rm -rf /var/lib/apt/lists/*  # Удаляем кэш apt для уменьшения размера
    
  • Мульти-стейд сборка (Multi-stage build): Позволяет использовать разные базовые образы для сборки и финального результата. Например, использовать большой образ для компиляции приложения, а маленький — для финального запуска.
    # Первый стейд: сборка
    FROM golang:1.19 AS builder
    WORKDIR /app
    COPY . .
    RUN go build -o myapp
    # Второй стейд: финальный легкий образ
    FROM alpine:latest
    WORKDIR /root/
    COPY --from=builder /app/myapp .
    CMD ["./myapp"]
    

Работа с Docker Hub:

  • Для публикации образa: docker push yourusername/my-app:latest
  • Для скачивания образa другого пользователя: docker pull yourusername/my-app

Docker Compose: развертывание многоконтейнерных приложений

Для приложений, состоящих из нескольких компонентов (например, веб-сервер, база данных, кэш), удобно использовать Docker Compose. Он позволяет описывать и управлять набором контейнеров одним файлом docker-compose.yml.

Структура docker-compose.yml: сервисы, сети и тома

Основные секции файла:

  • services: Определяет каждый контейнер (сервис) вашего приложения.
    • image: Используемый образ.
    • ports: Публикация портов.
    • environment: Передача переменных окружения.
    • depends_on: Указание зависимостей между сервисами (например, веб-сервер зависит от базы данных).
  • networks: Создает изолированные сети для сервисов, чтобы они могли общаться друг с другом, но не с внешним миром напрямую.
  • volumes: Определяет точки монтирования для сохранения постоянных данных (например, данные базы данных).

Практический пример: развертывание веб-приложения с базой данных

Рассмотрим пример развертывания приложения на Node.js (Express) с PostgreSQL.

version: '3.8'
services:
  db:
    image: postgres:15
    restart: always
    environment:
      POSTGRES_DB: myappdb
      POSTGRES_USER: myappuser
      POSTGRES_PASSWORD: mysecretpassword
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network

  web:
    build: .  # Собирает образ из Dockerfile в текущей директории
    restart: always
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://myappuser:mysecretpassword@db:5432/myappdb
    depends_on:
      - db
    networks:
      - app-network

volumes:
  postgres_data:

networks:
  app-network:
    driver: bridge

Пошаговое объяснение:

  • Сервис db использует официальный образ PostgreSQL, задает переменные окружения для создания базы данных и пользователя, и сохраняет данные в именованном томе postgres_data.
  • Сервис web строит образ из Dockerfile в текущей папке, публикует порт 3000, получает переменную DATABASE_URL для подключения к базе (используя имя сервиса db как hostname внутри сети), и зависит от сервиса db (запустится после него).
  • Сервисы объединены в приватную сеть app-network.

Команды для управления:

  • Запуск всех сервисов в фоне: docker-compose up -d
  • Просмотр статуса сервисов: docker-compose ps
  • Просмотр логов конкретного сервиса: docker-compose logs web
  • Остановка и удаление всех сервисов, сетей и томов (определенных в compose): docker-compose down
  • Остановка и удаление с удалением данных (volumes): docker-compose down -v

Этот пример можно адаптировать для любого стека: замените postgres на mysql или redis, а build: . на image: nginx для готового веб-сервера.

Безопасность и оптимизация для production-среды

При использовании Docker в продакшене критически важно соблюдать рекомендации по безопасности и управлению ресурсами.

Best practices для безопасной конфигурации контейнеров

  • Избегайте запуска контейнеров с root: В Dockerfile задавайте пользователя без привилегий.
    FROM alpine:latest
    RUN adduser -D myuser
    USER myuser
    CMD ["myapp"]
    
  • Ограничивайте capabilities: По умолчанию контейнеры имеют ограниченный набор возможностей. Не добавляйте дополнительные без необходимости.
  • Используйте read-only корневую файловую систему: Запускайте контейнеры с флагом --read-only, если приложение не требует записи в корневой раздел. Для данных используйте тома.
  • Принцип минимального привилегированного образа: Используйте минимальные базовые образы (например, alpine вместо полноценного ubuntu), чтобы уменьшить поверхность для потенциальных атак.
  • Пример безопасной конфигурации в docker-compose.yml:
    services:
      app:
        image: my-secure-app
        read_only: true
        user: "1000:1000"  # Запуск под конкретным UID:GID
        cap_drop:
          - ALL
        cap_add:
          - NET_BIND_SERVICE  # Добавляем только необходимую capability
    

Управление ресурсами и очистка системы

Контейнеры могут потреблять много ресурсов, если их не ограничивать.

  • Ограничение CPU и памяти: Используйте флаги при запуске или параметры в compose.
    docker run --cpus="1.5" --memory="512m" my-app
    # В docker-compose.yml
    services:
      app:
        deploy:
          resources:
            limits:
              cpus: '1.5'
              memory: 512M
    
  • Мониторинг использования диска: Команда docker system df показывает общее использование диска образов, контейнеров и томов.
  • Регулярная очистка:
    • Удаление всех остановленных контейнеров: docker container prune
    • Удаление всех неиспользуемых образов (без тегов): docker image prune
    • Удаление всех неиспользуемых объектов: docker system prune -a (будьте осторожны, удаляет все, кроме используемых).
  • Автоматизация очистки: Добавьте регулярную задачу в cron для очистки старых контейнеров и образов.
    # Пример cron задачи (выполнять каждую неделю)
    0 2 * * 0 docker system prune -f
    

Интеграция Docker в рабочие процессы и CI/CD

Docker идеально встраивается в автоматизированные процессы сборки и деплоя, обеспечивая идентичность среды на всех этапах.

В CI/CD пайплайне (например, GitHub Actions, Jenkins, GitLab CI) Docker используется следующим образом:

  • Автоматическая сборка образов по коммиту: При каждом push в репозиторий запускается job, который выполняет docker build для создания нового образa с тегом, соответствующим версии или коммиту.
  • Тестирование в контейнерах: Тесты запускаются внутри временных контейнеров, созданных из собранного образa, что гарантирует тестирование в той же среде, которая будет использоваться в продакшене.
  • Публикация в реестр: После успешного тестирования образ публикуется в приватный или публичный реестр (Docker Hub, AWS ECR, Google Container Registry) с помощью docker push.
  • Деплой на production: Серверы в production-среде просто скачивают (docker pull) и запускают (docker run) опубликованный образ из реестра.

Концепция "образ как артефакт" означает, что Docker образ становится единым, версионируемым артефактом, который проходит через весь цикл от разработки до продакшена без изменений. Это устраняет расхождения между средами.

Пример простого пайплайна GitHub Actions для проекта с Docker:

name: Build and Push Docker Image
on:
  push:
    branches: [ main ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build Docker image
        run: docker build -t my-app:${{ github.sha }} .
      - name: Push to Docker Hub
        run: docker push my-app:${{ github.sha }}

Таким образом, Docker становится не просто инструментом для разработчиков, но и ключевым компонентом инфраструктуры, обеспечивающим надежность, скорость и стандартизацию процессов развертывания.

Поделиться:
Сохранить гайд? В закладки браузера