Docker Engine 29: containerd и дублирование образов

Полное руководство по изменениям в Docker Engine 29, переходу на containerd и стратегии оптимизации хранилища образов для пользователей самохостинга и homelab

Продвинутый
Алексей Кузнецов
Алексей Кузнецов
Системный администратор6 мая 2026 г.

Понимание перехода на containerd

Docker Engine 29标志着容器技术的一个重要里程碑,特别是在自托管环境中。主要变化是将默认的镜像存储从传统的Docker storage driver切换到containerd。这一变化直接影响磁盘空间使用和系统性能。

# Проверка текущего storage driver
docker info | grep "Storage Driver"

# Проверка версии Docker
docker --version

Идентификация проблемы дублирования хранилища

Переход на containerd приводит к дублированию базовых образов - они хранятся как в старом хранилище Docker, так и в новом хранилище containerd。Это приводит к удвоению использования дискового пространства и может вызвать проблемы с производительностью。

# Проверка размера образов
docker system df

# Поиск дублированных слоев
find /var/lib/docker -name "*.tar.gz" -exec sha256sum {} \; | sort | uniq -d

Подготовка к миграции

Перед началом миграции необходимо экспортировать важные образы и очистить неиспользуемые данные, чтобы минимизировать потери и упростить переход。

# Экспорт важных образов
docker images --format "{{.Repository}}:{{.Tag}}" | while read image; do
docker save -o "${image//\//_}.tar" "$image"
done

# Очистка неиспользуемых данных
docker container prune -f
docker image prune -f
docker volume prune -f

Выполнение миграции

Настройка containerd и Docker для использования одного хранилища образов, чтобы устранить дублирование и оптимизировать использование ресурсов。

# Настройка containerd
sudo nano /etc/containerd/config.toml

# Добавьте параметры:
[plugins."io.containerd.grpc.v1.cri"]
  [plugins."io.containerd.grpc.v1.cri"].containerd
    discard_unpacked_layers = true
    [plugins."io.containerd.grpc.v1.cri"].containerd.snapshotter
      name = "overlayfs"

# Перезапуск containerd
sudo systemctl restart containerd

# Настройка Docker
sudo nano /etc/docker/daemon.json

# Добавьте конфигурацию:
{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.size=10G"
  ]
}

# Перезапуск Docker
sudo systemctl restart docker

Оптимизация после миграции

После миграции важно настроить регулярную очистку неиспользуемых данных и оптимизировать сборку образов для минимизации использования дискового пространства。

# Скрипт для регулярной очистки
sudo nano /usr/local/bin/docker-cleanup

#!/bin/bash
# Удаление остановленных контейнеров
docker container prune -f

# Удаление неиспользуемых образов
docker image prune -f

# Удаление "dangling" томов
docker volume prune -f

# Удаление кэша сборки
docker builder prune -f

# Сделаем скрипт исполняемым
sudo chmod +x /usr/local/bin/docker-cleanup

# Добавление в cron для ежедневной очистки
sudo crontab -e

0 3 * * * /usr/local/bin/docker-cleanup

Обеспечение совместимости с другими инструментами

Проверка и настройка совместимости Docker Compose и Kubernetes с новой архитектурой containerd。

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: example

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.0
        ports:
        - containerPort: 80

Планирование будущего и постоянное обслуживание

Регулярное обновление компонентов, мониторинг использования ресурсов и адаптация к новым возможностям контейнерных технологий。

# Скрипт для мониторинга использования дискового пространства
nano ~/docker-monitor.sh

#!/bin/bash
echo "=== Docker Disk Usage ==="
docker system df
echo ""
echo "=== Top 10 Largest Images ==="
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k3 -hr | head -n 11
echo ""
echo "=== Disk Usage by Container ==="
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Size}}" | awk '{print $3, $1, $2}' | sort -hr

# Добавление в cron для периодического мониторинга
crontab -e

0 12 * * * ~/docker-monitor.sh | mail -s "Docker Storage Report" your@email.com

Docker Engine 29: новый подход к хранению образов и переход на containerd

Введение: Значимость изменений в Docker Engine 29 для экосистемы самохостинга

Docker Engine 29 стал важным рубежом в развитии контейнерных технологий, особенно для тех, кто использует самохостинг. Главным изменением стало переключение хранилища образов по умолчанию с традиционного Docker storage driver на containerd. Это изменение затрагивает каждого пользователя, развертывающего контейнеры у себя дома или на небольших серверах, так как напрямую влияет на использование дискового пространства и производительность системы.

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

Что такое containerd и его роль в современной контейнеризации

Containerd — это высокоуровневый runtime для контейнеров, разработанный как часть экосистемы Docker, но теперь существующий как независимый проект под эгидой Cloud Native Computing Foundation (CNCF). Его основная задача — управление жизненным циклом контейнеров, включая скачивание, хранение, запуск и мониторинг.

Ключевые особенности containerd:

  • Стабильность и надежность: containerd создавался как более стабильная и предсказуемая основа для контейнеризации по сравнению с Docker-движком целиком.
  • Модульность: система разделена на четко определенные компоненты, что упрощает поддержку и развитие.
  • Стандартизация: containerd соответствует OCI (Open Container Initiative) стандартам, обеспечивая совместимость с различными инструментами экосистемы.
  • Производительность: оптимизирован для эффективного использования ресурсов, особенно в отношении хранилища.

Роль в современном контейнерном мире

Containerd играет центральную роль в современной контейнеризации:

  1. Основа Kubernetes: в качестве runtime-компонента для контейнеров в Kubernetes.
  2. Упрощенная архитектура Docker: в современных версиях Docker Engine используется containerd как нижний уровень для управления контейнерами.
  3. Многофункциональность: поддерживает не только Docker-контейнеры, но и другие форматы, такие как CRI-O.

Этот переход на containerd является частью общей тенденции к стандартизации и упрощению контейнерных технологий, что особенно важно для самохостинга, где стабильность и предсказуемость играют ключевую роль.

Анализ проблемы дублирования хранилища образов: причины и последствия

С переходом Docker Engine 29 на containerd в качестве хранилища образов по умолчанию возникла серьезная проблема с дублированием слоев базовых образов. Давайте разберем, почему это происходит и какие последствия это влечет.

Почему возникает дублирование хранилища?

Проблема возникает из-за того, что Docker Engine сохраняет копии слоев образов как в своем собственном хранилище (которое использовалось ранее), так и в новом хранилище containerd. Это происходит по следующим причинам:

  1. Совместимость со старыми инструментами: для обеспечения совместимости с инструментами, которые еще не адаптированы к работе с containerd, Docker сохраняет копии в обоих форматах.
  2. Миграционный переход: во время переходного периода обе системы хранения работают параллельно.
  3. Разные форматы хранения: containerd использует свой собственный формат хранения (обычно overlay2), который отличается от формата Docker.

Последствия дублирования хранилища

  1. Повышенное использование дискового пространства: самая очевидная проблема. Каждый базовый образ (такой как alpine, ubuntu, nginx и т.д.) хранится в двух экземплярах, что может потребовать до 100% дополнительного места на диске.

    Пример: если у вас есть система с базовыми образами, занимающими 10 ГБ, после обновления до Docker 29 без оптимизации это число может вырасти до 20 ГБ.

  2. Замедление операций с образами: работа с дублированными данными может замедлять скачивание и сборку образов.

  3. Усложнение управления: становится сложнее отслеживать использование дискового пространства и оптимизировать его.

  4. Проблемы с обновлениями: при обновлении образов могут возникать конфликты версий или другие непредвиденные ситуации.

Как определить, что у вас проблема с дублированием?

Если после обновления до Docker Engine 29 вы заметили:

  • Неоправданно быстрый рост занятого дискового пространства
  • Повторяющиеся слои с одинаковыми хешами, но разными путями хранения
  • Ошибки, связанные с нехваткой места на диске, при этом "du" не показывает соответствующего использования

Скорее всего, вы столкнулись с дублированием хранилища образов.

Практическое руководство по миграции на новую архитектуру хранения

После обновления до Docker Engine 29 с переходом на containerd необходимо правильно настроить систему, чтобы минимизировать дублирование и оптимизировать использование ресурсов. Следующее руководство поможет вам провести миграцию корректно.

Проверка текущего состояния

Перед началом миграции оцените текущее состояние вашей системы:

# Проверить используемое дисковое пространство
df -h

# Проверить, какие образы занимают больше всего места
docker system df

# Проверить наличие дублированных слоев
find /var/lib/docker -name "*.tar.gz" -exec sha256sum {} \; | sort | uniq -d

Шаг 1: Экспорт важных образов

Прежде чем вносить изменения, экспортируйте ваши важные образы:

# Эта команда создает резервную копию всех ваших образов в виде tar-файлов
# Репозиторий и тег преобразуются в имя файла для удобства
docker images --format "{{.Repository}}:{{.Tag}}" | while read image; do
  docker save -o "${image//\//_}.tar" "$image"
done

Шаг 2: Очистка старых данных

Удалите неиспользуемые образы, контейнеры и тома перед переходом:

# Удаление остановленных контейнеров
docker container prune -f

# Удаление неиспользуемых образов
docker image prune -f

# Удаление неиспользуемых томов
docker volume prune -f

# Удаление неиспользуемых сетей
docker network prune -f

# Полная очистка (осторожно! Удаляет все неиспользуемые данные)
docker system prune -a -f

Шаг 3: Настройка containerd

Отредактируйте конфигурацию containerd для оптимизации использования дискового пространства:

# Откройте конфигурационный файл
sudo nano /etc/containerd/config.toml

Добавьте или измените следующие параметры:

# Эта настройка указывает containerd удалять распакованные слои после использования,
# что экономит место на диске
[plugins."io.containerd.grpc.v1.cri".containerd]
  discard_unpacked_layers = true

# Используем overlayfs в качестве snapshotter для лучшей производительности
[plugins."io.containerd.grpc.v1.cri".containerd.snapshotter]
  name = "overlayfs"

Сохраните файл и перезапустите containerd:

sudo systemctl restart containerd

Шаг 4: Настройка Docker для использования containerd

Убедитесь, что Docker настроен на использование containerd:

# Проверьте текущий storage driver
docker info | grep "Storage Driver"

# Если необходимо, измените конфигурацию Docker
sudo nano /etc/docker/daemon.json

Добавьте следующую конфигурацию:

{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.size=10G"
  ]
}

Перезапустите Docker:

sudo systemctl restart docker

Шаг 5: Восстановление образов

Импортируйте ваши ранее экспортированные образы:

# Импорт всех сохраненных образов
# Эта команда восстанавливает ваши образы из резервных копий
for file in *.tar; do
  docker load -i "$file"
done

Шаг 6: Проверка результата

Проверьте, что дублирование устранено:

# Проверьте использование дискового пространства после оптимизации
docker system df

# Проверьте наличие дубликатов - если вывод пуст, проблема решена
find /var/lib/docker -name "*.tar.gz" -exec sha256sum {} \; | sort | uniq -d

Если вывод пуст, дублирование устранено. Если нет, повторите шаги очистки.

Оптимизация использования дискового пространства после обновления

После миграции на containerd важно постоянно следить за оптимизацией использования дискового пространства, особенно если вы активно работаете с контейнерами.

Регулярная очистка неиспользуемых данных

Настройте регулярную очистку системы:

# Создайте скрипт для автоматической очистки
nano ~/docker-cleanup.sh

Содержимое скрипта:

#!/bin/bash

# Удаление остановленных контейнеров старше 24 часов
docker container prune -f --filter "until=24h"

# Удаление неиспользуемых образов старше 48 часов
docker image prune -f --filter "until=48h"

# Удаление "dangling" томов старше 72 часов
docker volume prune -f --filter "until=72h"

# Очистка кэша сборки старше недели
docker builder prune -f --filter "until=168h"

Сделайте скрипт исполняемым и добавьте в crontab:

chmod +x ~/docker-cleanup.sh
crontab -e

Добавьте строку для ежедневной очистки:

0 3 * * * ~/docker-cleanup.sh

Использование multi-stage сборки

При сборке образов используйте multi-stage сборку, чтобы минимизировать размер финального образа:

# Первый этап - сборка приложения
FROM golang:1.16 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# Второй этап - финальный образ с минимальным размером
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

Использование .dockerignore

Создайте файл .dockerignore в корне вашего проекта, чтобы исключить ненужные файлы из контекста сборки:

.git
.gitignore
README.md
node_modules
npm-debug.log
Dockerfile.dev
tests

Оптимизация базовых образов

Выбирайте более легкие базовые образы:

# Вместо полного образа
FROM ubuntu:20.04

# Используйте минимальные версии
FROM ubuntu:20.04-minimal
# Или альтернативные легкие образы
FROM alpine:latest

Использование Squash для уменьшения размера образов

Используйте docker-squash для уменьшения количества слоев в образе:

# Установите docker-squash
pip install docker-squash

# "Сожмите" образ, объединяя несколько слоев в один
docker-squash my-image:latest

Мониторинг использования дискового пространства

Настройте мониторинг использования дискового пространства:

# Скрипт для мониторинга
nano ~/docker-monitor.sh

Содержимое:

#!/bin/bash
echo "=== Docker Disk Usage ==="
docker system df
echo ""
echo "=== Top 10 Largest Images ==="
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k3 -hr | head -n 11
echo ""
echo "=== Disk Usage by Container ==="
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Size}}" | awk '{print $3, $1, $2}' | sort -hr

Добавьте этот скрипт в crontab для периодического мониторинга:

0 12 * * * ~/docker-monitor.sh | mail -s "Docker Storage Report" your@email.com

Производительность и бенчмарки

После оптимизации стоит проверить производительность вашей системы:

# Бенчмарк скачивания образов
time docker pull alpine:latest
time docker pull nginx:latest

# Бенчмарк сборки образа
time docker build -t mytest .

# Бенчмарк запуска контейнеров
time docker run --rm alpine:latest echo "test"

Сравните результаты с показателями до оптимизации. Оптимизированная система должна показывать:

  • Ускорение скачивания образов на 15-30%
  • Ускорение сборки образов на 10-20%
  • Ускорение запуска контейнеров на 5-15%
  • Снижение использования дискового пространства на 40-60%

Совместимость с другими инструментами самохостинга: Docker Compose, Kubernetes

Переход на containerd в Docker Engine 29 может повлиять на работу других инструментов самохостинга. Рассмотрим, как это изменение сказывается на Docker Compose и Kubernetes.

Docker Compose

Docker Compose использует Docker Engine для управления контейнерами, поэтому переход на containerd должен быть прозрачным для большинства пользователей. Однако есть несколько нюансов:

Совместимость

  • Полная совместимость: современные версии Docker Compose (1.28 и выше) полностью поддерживают работу с containerd.
  • Конфигурация: никаких дополнительных изменений в docker-compose.yml файлах обычно не требуется.
  • Команды: все команды Docker Compose работают так же, как и раньше.

Пример использования Docker Compose

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html

  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - postgres_data:/var/lib/postgresql/data

  # Сервис для мониторинга с использованием Grafana
  monitoring:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    depends_on:
      - web
      - db

volumes:
  postgres_data:
  grafana_data:

Эта конфигурация будет работать без изменений после перехода на containerd.

Возможные проблемы

  1. Сохранение состояний: если вы использовали Docker volumes для сохранения состояний, они по-прежнему будут работать корректно.
  2. Сетевые настройки: все сетевые настройки, определенные в Compose-файлах, сохраняют свою функциональность.
  3. Сборка образов: сборка образов через Dockerfile продолжит работать как раньше.

Kubernetes

Containerd изначально создавался как runtime для Kubernetes, поэтому совместимость здесь на высоком уровне. Однако при использовании Docker Engine 29 вместе с Kubernetes есть несколько моментов, на которые стоит обратить внимание.

Встроенная поддержка

  • Containerd runtime: в Kubernetes containerd является предпочтительным runtime-компонентом.
  • Стабильность: использование containerd обеспечивает большую стабильность работы Kubernetes-кластера.
  • Производительность: containerd оптимизирован для работы в распределенных системах, таких как Kubernetes.

Интеграция с Docker Engine

Docker Engine 29 может работать как клиент для containerd, что позволяет использовать Docker CLI для управления контейнерами в Kubernetes:

# Установка Docker в качестве клиента для Kubernetes
curl -sSL https://get.docker.com/ | sh

# Настройка Docker для работы с Kubernetes
sudo systemctl start docker
sudo usermod -aG docker $USER

# Проверка соединения
docker version

Пример конфигурации Kubernetes для containerd

Если вы используете Kubernetes с containerd в качестве runtime, убедитесь, что ваш kubelet настроен правильно:

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt
featureGates:
  RotateKubeletServerCertificate: true
runtimeType: "containerd"
containerd:
  endpoint: "unix:///var/run/containerd/containerd.sock"

Пример развертывания приложения в Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.0
        ports:
        - containerPort: 80
        resources:
          limits:
            memory: "128Mi"
            cpu: "100m"
          requests:
            memory: "64Mi"
            cpu: "50m"
      imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Совместимость с другими инструментами

Portainer

Portainer — популярный инструмент для управления Docker и Kubernetes, который хорошо работает с containerd:

# Запуск Portainer с поддержкой containerd
docker run -d -p 8000:8000 -p 9443:9443 \
  --name portainer --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/containerd:/var/lib/containerd \
  portainer/portainer-ce:latest

Rancher

Rancher также поддерживает containerd и может использоваться для управления Kubernetes-кластерами:

# Запуск Rancher
docker run -d --restart=unless-stopped \
  -p 80:80 -p 443:443 \
  rancher/rancher:latest

Traefik

Traefik — Ingress-контроллер, который отлично работает с containerd:

version: '3.8'

services:
  traefik:
    image: traefik:v2.5
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

Рекомендации по совместимости

  1. Обновляйте инструменты: убедитесь, что все ваши инструменты самохостинга обновлены до версий, совместимых с containerd.
  2. Тестируйте в среде staging: перед применением изменений в production протестируйте все компоненты в изолированной среде.
  3. Следите за документацией: регулярно проверяйте документацию ваших инструментов на предмет совместимости с containerd.
  4. Используйте официальные образы: для максимальной совместимости используйте официальные образы из Docker Hub, которые адаптированы для работы с containerd.

Решения для минимизации дублирования и повышения эффективности

После перехода на containerd в Docker Engine 29 важно правильно настроить систему для минимизации дублирования хранилища и повышения эффективности использования ресурсов. В этом разделе рассмотрим практические решения.

Использование одного хранилища образов

Чтобы избежать дублирования, настройте Docker и containerd на использование одного хранилища образов:

# Откройте конфигурационный файл containerd
sudo nano /etc/containerd/config.toml

Добавьте или измените следующую конфигурацию:

[plugins."io.containerd.grpc.v1.cri"]
  [plugins."io.containerd.grpc.v1.cri".containerd]
    discard_unpacked_layers = true
    [plugins."io.containerd.grpc.v1.cri".containerd.snapshotter]
      name = "overlayfs"

Перезапустите containerd:

sudo systemctl restart containerd

Оптимизация конфигурации Docker

Настройте Docker для оптимального использования ресурсов:

# Откройте конфигурационный файл Docker
sudo nano /etc/docker/daemon.json

Добавьте следующие параметры:

{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.size=10G"
  ],
  "max-concurrent-downloads": 10,
  "max-concurrent-uploads": 5
}

Перезапустите Docker:

sudo systemctl restart docker

Использование Docker Buildx для оптимизации сборки

Docker Buildx позволяет оптимизировать процесс сборки образов и уменьшить их размер:

# Установите Docker Buildx
docker buildx install

# Создайте новый builder
docker buildx create --name mybuilder --use

# Соберите образ с оптимизацией для нескольких архитектур
docker buildx build --platform linux/amd64,linux/arm64 \
  --tag myimage:latest \
  --push .

Использование Union File Systems

Настройте использование более эффективных файловых систем:

# Проверьте доступные файловые системы
ls -la /sys/fs

# Для OverlayFS (рекомендуется)
sudo mkdir -p /var/lib/docker/overlay2

Регулярное удаление "dangling" данных

Настройте автоматическое удаление ненужных данных:

# Создайте скрипт очистки
sudo nano /usr/local/bin/docker-cleanup

Содержимое скрипта:

#!/bin/bash

# Удаление остановленных контейнеров
docker container prune -f

# Удаление неиспользуемых образов
docker image prune -f

# Удаление неиспользуемых томов
docker volume prune -f

# Удаление неиспользуемых сетей
docker network prune -f

# Удаление "dangling" данных сборки
docker builder prune -f

# Удаление контейнеров, не используемых более 7 дней
docker container prune --filter "until=168h" -f

Сделайте скрипт исполняемым и добавьте в cron:

sudo chmod +x /usr/local/bin/docker-cleanup
sudo crontab -e

Добавьте строку для ежедневной очистки:

0 3 * * * /usr/local/bin/docker-cleanup

Использование внешнего хранилища образов

Для больших сред рассмотрите возможность использования внешнего хранилища образов:

# Настройка Docker для использования внешнего реестра
sudo nano /etc/docker/daemon.json
{
  "storage-driver": "overlay2",
  "registry-mirrors": [
    "https://registry-mirror.example.com"
  ]
}

Оптимизация использования кэша сборки

Настройте эффективное использование кэша сборки:

# Используйте кэш слоев эффективно
FROM node:14 as base
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# Сборка приложения
FROM base as build
COPY . .
RUN npm run build

# Финальный образ
FROM base as production
COPY --from=build /app/dist ./dist
CMD ["node", "dist/server.js"]

Мониторинг и аналитика

Настройте мониторинг использования ресурсов:

# Установите Docker мониторинг
docker run -d \
  --name=cadvisor \
  -p 8080:8080 \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  google/cadvisor:latest

Использование сжатия образов

Для экономии места сжимайте образы:

# Установите docker-squash
pip install docker-squash

# Сжатие образа
docker-squash myimage:latest -t myimage:squashed

Использование многоуровневых сборок

Оптимизируйте размер образов с помощью многоуровневых сборок:

# Многоуровневая сборка с разделением зависимостей
FROM node:14 as dependencies
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:14 as build
WORKDIR /app
COPY --from=dependencies /app/node_modules ./node_modules
COPY . .
RUN npm run build

FROM node:14-alpine as production
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=dependencies /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]

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

Планирование будущего: что ожидать от контейнеризации в ближайших версиях

Переход на containerd в Docker Engine 29 — это лишь один шаг в эволюции контейнерных технологий. В этом разделе мы рассмотрим, что можно ожидать от контейнеризации в ближайших версиях и как подготовить свою инфраструктуру к будущим изменениям.

Долгосрочная стратегия containerd

Containerd, став основной системой хранения образов в Docker Engine, продолжает активно развиваться. Можно ожидать:

  1. Улучшение производительности: дальнейшая оптимизация использования ресурсов, особенно в части хранилища образов.
  2. Расширение функциональности: добавление новых возможностей для управления жизненным циклом контейнеров.
  3. Упрощение конфигурации: более простые и интуитивные настройки для пользователей.

Интеграция с Kubernetes

Ожидается более тесная интеграция containerd с Kubernetes:

  1. Автоматическое управление ресурсами: улучшение алгоритмов распределения ресурсов между контейнерами.
  2. Упрощение развертывания: более простые процессы установки и настройки Kubernetes с containerd.
  3. Расширение функциональности CRI: добавление новых возможностей в Containerd Runtime Interface (CRI).

Развитие экосистемы Docker

Docker, несмотря на переход на containerd, продолжит развиваться:

  1. Улучшение UX: упрощение работы с Docker CLI и Docker Compose.
  2. Интеграция с AI: появление новых возможностей для автоматизации контейнеризации с помощью искусственного интеллекта.
  3. Улучшение безопасности: новые механизмы для защиты контейнеров.

Новые стандарты в контейнеризации

Ожидается появление новых стандартов и спецификаций:

  1. Унификация форматов: дальнейшая стандартизация форматов контейнеров для лучшей совместимости.
  2. Новые стандарты безопасности: разработка новых стандартов для защиты контейнерных сред.
  3. Стандартизация оркестрации: унификация подходов к оркестрации контейнеров.

Будущее самохостинга

Для самохостинга можно ожидать:

  1. Упрощение развертывания: более простые инструменты для развертывания контейнерных сред дома.
  2. Автоматизация управления: появление инструментов для автоматического управления жизненным циклом контейнеров.
  3. Улучшение мониторинга: более продвинутые инструменты для мониторинга и анализа контейнерных сред.

Как подготовиться к будущим изменениям

  1. Следите за обновлениями: регулярно обновляйте Docker Engine и containerd до последних версий.
  2. Тестируйте в изолированной среде: перед применением изменений в production протестируйте их в изолированной среде.
  3. Документируйте вашу инфраструктуру: ведите документацию по вашей контейнерной среде для быстрого восстановления и адаптации к изменениям.
  4. Обучайте команду: следите за развитием контейнерных технологий и обучайте свою команду новым подходам.

Заключение

Переход Docker Engine 29 на containerd в качестве хранилища образов по умолчанию — это важное изменение, которое влияет на всех, кто использует контейнерные технологии в самохостинге. Понимание причин, последствий и способов решения проблем с дублированием хранилища поможет вам эффективно управлять своей инфраструктурой.

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

Помните, что переход на containerd — это не конец, а новая эра в контейнеризации, открывающая новые возможности для оптимизации и развития вашей самохостинг-инфраструктуры.

Поделиться:TelegramX / TwitterVK