← Назад к вопросам

Почему Docker, работающий на Linux, требует меньше места, чем Docker, работающий на Windows?

1.7 Middle🔥 141 комментариев
#Инструменты разработки#Облачные платформы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему Docker на Linux требует меньше места, чем на Windows

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

Сущность Docker

Docker — это контейнеризация, а не виртуализация. Контейнер не содержит полную операционную систему, а использует ядро хост-системы.

Виртуальная машина:
Приложение
↓
ОС (Windows/Linux)
↓
Hypervisor
↓
Хост ОС

Контейнер Docker:
Приложение + минимум утилит
↓
Общее ядро хост-ОС (Linux kernel)
↓
Хост ОС (Linux)

Docker на Linux: нативная архитектура

на Linux Docker работает напрямую с ядром системы:

# На Linux контейнеры используют:
# 1. Linux kernel namespaces (изоляция процессов)
# 2. Control groups (ограничение ресурсов)
# 3. Union filesystem (наслоение файлов)

docker run ubuntu:22.04
# Результат: контейнер весит ~77MB

Структура контейнера на Linux:

ubuntu:22.04
├── /bin (утилиты)
├── /lib (библиотеки)
├── /usr (программы)
└── /etc (конфигурация)
Общее ядро системы → используется из хост-системы

Итого: ~77MB для контейнера

Docker на Windows: эмуляция через Hyper-V

Windows не имеет Linux kernel. Поэтому Docker запускает миниатюрную Linux VM:

windows:
Docker Desktop
↓
Hyper-V (гипервизор)
↓
MiniLinux VM (Linux kernel + утилиты)
↓
Контейнер Docker (еще один слой)

Что получается:

  • Сама виртуальная машина: 1-2GB (Linux kernel + минимальная ОС)
  • Образ контейнера: +77MB
  • Служебные файлы Docker Desktop: +500MB-1GB

Итого на Windows: 2-4GB минимум для работы Docker

Детальное сравнение хранилища

Linux:

$ docker system df
IMAGES          SPACE
ubuntu:22.04    77MB
nginx:latest    187MB
python:3.11     920MB

Контейнеры: используют copy-on-write слой (несколько MB)
Общее ядро: не учитывается (уже в системе)

Итого: ~1.2GB для нескольких образов

Windows:

$ docker system df
IMAGES          SPACE
ubuntu:22.04    77MB (в VM)
nginx:latest    187MB (в VM)
python:3.11     920MB (в VM)

VIRTUAL MACHINE: 2GB (minilinux vm)
DOCKER DESKTOP: 1GB (приложение + сервис)
YSInternal drivers, WSL2 overhead: 500MB

Итого: 4.5GB+ минимум

WSL2 (Windows Subsystem for Linux 2) — немного лучше

С Docker Desktop на WSL2 ситуация улучшилась, но полностью не решилась:

# WSL2 подход:
Windows
↓
Hyper-V с Linux VM
↓
Контейнеры Docker (используют Linux kernel из WSL2)

Преимущества WSL2:

  • Одна виртуальная машина на все (меньше overhead)
  • Файловая система более интегрирована
  • Суммарно: 1.5-2.5GB вместо 4-5GB

Недостатки:

  • Всё равно требует виртуализации
  • Медленнее на файловых операциях
  • Интеграция с Windows файловой системой даёт оверхед

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

# На Linux
$ docker images
REPOSITORY      TAG         SIZE
alpine:latest   3.18        7.8MB   ← Минимальный Linux образ
ubuntu:22.04    latest      77MB
nginx:latest    latest      187MB
python:3.11     slim        163MB
postgres:15     latest      374MB

# На Windows все те же образы, но + 2-4GB базовой инфраструктуры

Почему Linux ядро не учитывается в размере

Механизм copy-on-write (CoW):

Уровень 1: Образ Python 3.11 (920MB)
Уровень 2: Ваше приложение (50MB)
Уровень 3: Запущенный контейнер (читает из 1 и 2, пишет в 3)

На Linux:
Общее ядро не копируется, разделяется между всеми контейнерами

На Windows:
Вм с ядром (2GB) + слои контейнера

Числовой пример

Запуск 10 контейнеров python:3.11 на Linux:

Образ: 920MB × 1 = 920MB (один образ на диске)
Контейнеры: 10 × 10MB (только дельта) = 100MB
Общее ядро: 0MB (уже в системе)

ИТОГО: ~1GB дискового пространства

Запуск 10 контейнеров python:3.11 на Windows:

Virtual Machine с Linux: 2GB × 1 = 2GB
Образ внутри VM: 920MB × 1 = 920MB
Контейнеры: 10 × 10MB = 100MB
DOCKER DESKTOP: 1GB

ИТОГО: ~4GB дискового пространства

Оптимизация на Windows

Если вы работаете на Windows:

  1. Используйте WSL2 вместо Hyper-V (экономит ~1-1.5GB)
  2. Alpine вместо Ubuntu в образах (3.8MB вместо 77MB)
  3. Multi-stage builds:
# Stage 1: Build
FROM python:3.11 as builder
RUN pip install -r requirements.txt

# Stage 2: Runtime
FROM python:3.11-slim
COPY --from=builder /app /app
# Результат: образ 200MB вместо 920MB
  1. Очищайте неиспользуемые образы:
docker system prune -a  # Удалить все неиспользуемые образы

Заключение

Linux требует меньше места потому, что:

  • Разделяет ядро ОС между контейнерами (дополнительно не требуется)
  • Windows создаёт отдельную Linux VM (2GB+ overhead)
  • Docker Desktop на Windows добавляет свой сервис и драйверы (1GB+)
  • WSL2 немного оптимальнее, но всё равно требует виртуализации

Это фундаментальное различие в архитектуре, которое нельзя обойти без полной переходе на Linux для критичных по ресурсам систем.