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