Docker Engine 29: Переход на containerd и решение проблемы дублирования образов

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

Продвинутый

Понимание перехода на 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