# Docker

> Платформа для сборки, доставки и запуска приложений в контейнерах — изолированных процессах с собственной файловой системой.

Источник: https://llmdocs.ru/wiki/docker/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: платформа контейнеризации
- **Разработчик**: Docker, Inc.
- **Первый выпуск**: март 2013
- **Написан на**: Go
- **ОС**: Linux; Windows и macOS через Docker Desktop
- **Компоненты**: dockerd, containerd, runc, BuildKit, CLI
- **Лицензия**: Apache 2.0 (Docker Engine); Docker Desktop — проприетарная
- **Сайт**: [docker.com](https://www.docker.com/)
**Docker** — платформа для упаковки приложения вместе со всеми зависимостями в стандартный образ и запуска его в виде изолированного контейнера. Контейнер использует ядро хост-системы, поэтому стартует за доли секунды и расходует меньше ресурсов, чем виртуальная машина. Docker сделал [контейнеризацию](https://llmdocs.ru/wiki/containerization.md) массовой технологией и стал стандартным способом доставки серверного ПО, а его формат образов лёг в основу спецификаций OCI и экосистемы [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md).

## История

Docker вырос из внутреннего инструмента PaaS-компании dotCloud. Соломон Хайкс представил его публике в марте 2013 года на конференции PyCon, после чего компания сменила название на Docker, Inc.

Первые версии опирались на LXC, но уже в 2014 году Docker перешёл на собственную библиотеку libcontainer. В 2015 году вместе с другими компаниями была создана Open Container Initiative (OCI), которой передали формат образа и среду исполнения **runc**.[4] В 2017 году демон управления контейнерами **containerd** был передан фонду CNCF,[5] а открытая часть кода выделена в проект Moby.

В 2021 году изменились условия Docker Desktop: для компаний с более чем 250 сотрудниками или выручкой свыше 10 млн долларов в год он стал платным; Docker Engine на Linux остался открытым.[3]

## Архитектура

Docker построен по клиент-серверной схеме:[1]

- **CLI** (`docker`) отправляет команды через REST API;
- **dockerd** — демон, управляющий образами, сетями и томами;
- **containerd** — среда, управляющая жизненным циклом контейнеров;
- **runc** — низкоуровневый исполнитель, который создаёт процесс с нужной изоляцией;
- **BuildKit** — движок сборки образов, используемый по умолчанию с Docker Engine 23.0.[6]

Изоляция обеспечивается механизмами ядра Linux: пространства имён ограничивают видимость процессов, сети и файловой системы, а контрольные группы — потребление CPU и памяти (см. [Namespaces и cgroups](https://llmdocs.ru/wiki/namespaces-cgroups.md)). На macOS и Windows Docker Desktop запускает лёгкую виртуальную машину с Linux.

## Образы и контейнеры

**Образ** — неизменяемый набор слоёв файловой системы плюс метаданные (команда запуска, переменные окружения, порты). Каждый слой хранит изменения относительно предыдущего, одинаковые слои разделяются между образами и кешируются. Формат описан спецификацией OCI (см. [Образ контейнера и OCI](https://llmdocs.ru/wiki/oci-image.md)).

**Контейнер** — запущенный экземпляр образа с тонким записываемым слоем поверх. После удаления контейнера этот слой пропадает, поэтому долговременные данные хранят в **томах** (volumes).

Образы хранятся в реестрах: публичном Docker Hub или частных ([Container registry](https://llmdocs.ru/wiki/container-registry.md)).

## Dockerfile

Образ описывается текстовым файлом [Dockerfile](https://llmdocs.ru/wiki/dockerfile.md) — последовательностью инструкций, каждая из которых обычно создаёт слой:[2]

```dockerfile
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
```

Зависимости копируются раньше исходного кода, чтобы при правке кода не пересобирать слой с установкой пакетов. Для уменьшения размера применяют [многоэтапную сборку](https://llmdocs.ru/wiki/multi-stage-build.md) и минимальные базовые образы.

## Основные команды

| Команда | Действие |
|---|---|
| `docker build -t app:1.0 .` | собрать образ из Dockerfile |
| `docker run -d -p 8000:8000 app:1.0` | запустить контейнер в фоне с пробросом порта |
| `docker ps` | список запущенных контейнеров |
| `docker logs -f <id>` | поток логов контейнера |
| `docker exec -it <id> sh` | оболочка внутри контейнера |
| `docker pull` / `docker push` | скачать или опубликовать образ |
| `docker compose up -d` | поднять набор сервисов из `compose.yaml` |

Для описания многоконтейнерных приложений (сервис + база данных + кеш) используется [Docker Compose](https://llmdocs.ru/wiki/docker-compose.md).

## Безопасность

Контейнер — не виртуальная машина: все контейнеры делят одно ядро, и уязвимость ядра или неверная настройка может дать выход на хост. Базовые меры: не запускать процессы от root внутри контейнера, не монтировать сокет Docker в контейнеры без необходимости, не использовать флаг `--privileged`, регулярно обновлять базовые образы и сканировать их на уязвимости. Членство в группе `docker` фактически равно правам root на хосте.

## Альтернативы

- [Podman](https://llmdocs.ru/wiki/podman.md) — совместимый по командам инструмент без постоянного демона, с упором на работу без root;
- containerd с утилитой `nerdctl` — прямое использование среды без dockerd;
- в [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md) с 2022 года Docker как среда исполнения (dockershim) удалён, кластеры используют containerd или CRI-O, но образы, собранные Docker, работают без изменений.

## См. также

- [Контейнеризация](https://llmdocs.ru/wiki/containerization.md)
- [Dockerfile](https://llmdocs.ru/wiki/dockerfile.md)
- [Docker Compose](https://llmdocs.ru/wiki/docker-compose.md)
- [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md)

## Источники

1. [Docker overview — Docker Docs](https://docs.docker.com/get-started/docker-overview/)
2. [Dockerfile reference](https://docs.docker.com/reference/dockerfile/)
3. [Docker Desktop license agreement](https://docs.docker.com/subscription/desktop-license/)
4. [Open Container Initiative — About](https://opencontainers.org/about/overview/)
5. [containerd — CNCF project page](https://www.cncf.io/projects/containerd/)
6. [BuildKit — Docker Docs](https://docs.docker.com/build/buildkit/)
