Назад к статьям

Что такое Docker

AdminGuide ·
Что такое Docker

Docker - это технология, позволяющая поставлять программные решения, упакованные в специальные образы (имиджи) вместе со всеми необходимыми для их работы локальными зависимостями. В рамках одного каноничного имиджа может быть упакован 1 процесс (например nginx, который поднимает 1 сайт) и в этот же имидж могут быть установлены все необходимые для его запуска библиотеки. Когда же сайту для работы необходима, например база данных, то эта база данных поставляется уже отдельным имиджем. Таким образом на основе нескольких имиджей формируется гибкое решение, не зависящее от библиотек и ПО, уже установленного на сервере (докерноде), на котором эти имиджи запускаются.

Решаемая проблема

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

  • Docker Node (докернода) - Это виниловый проигрыватель, сервер на котором установлен Docker и запускаются докер-имиджи

  • Docker Image (докеримидж) - это виниловая пластинка

  • Docker Container - это музыка, которая звучит, когда мы проигрываем пластинку

  • Docker Hub - полка, где лежат пластинки, пока их не сунут в проигрыватель

  • Dockerfile - это инструкция по созданию пластинки

Docker - стандарт для разработки ПО
Docker - стандарт для разработки ПО

В наши дни Docker является одним из стандартов для разработки ПО и развёртывания инфраструктуры. Docker можно установить как на Linux, так и на Mac, а также Windows. Но тут стоит помнить, что под Windows докера не бывает, и по факту на венду заезжает просто вмка с убунтой, внутри которой и бегает докер. Потому в случае венды я бы рекомендовал установить полноценную виртуальную машину с той же самой Ubuntu Server и работать там с докером по SSH.

Плюсы

Одним из самых больших плюсов докера, является то, что внутрь имиджа можно установить все необходимые локальные зависимости - приложения, запущенные в докере, не засоряют основную хостовую машину кучей библиотек, которые туда так же нужно установить для того, чтобы приложение заработало. А когда приложение уже не нужно, просто удаляется контейнер, volume, что для него создавался и куда он мог сохранять результаты своей жизнедеятельности и его имидж, если он больше не нужен. После этого на докерноде не остаётся никаких следов присутствия приложения. У вас одновременно может работать несколько контейнеров, развёрнутых из разных имиджей, в каждом из которых будут вшиты одинаковые библиотеки, но разных версий, и это не будет вызывать конфликтов.

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

А самое главное, с докером можно работать через Docker Compose - инструмент для развёртывания и управления мультиконтейнерными приложениями, который идеально подходит даже когда развернуть нужно всего-навсего 1 контейнер. Достаточно описать 1 файл, compose.yaml, с манифестом описывающим какой имидж использовать, какие параметры использовать, какие вольюмы, сети, суммарно на 10-25 строк и сервис взлетит. Если же в ходе запуска сервиса необходимо предварительно использовать Dockerfile для сборки имиджа, Docker Compose сделает и это.

Docker - основа для Docker Compose
Docker - основа для Docker Compose

Отличие от виртуальных машин

В то время, когда виртуальная машина имеет свою собственную ОС и потребляет ресурсов столько же, как и полноценная ОС, Docker использует ресурсы той ОС, на которой был установлен. Изоляция контейнеров в Docker хоть и уступает изоляции между ОС виртуальных машин, но она даёт огромную экономию ресурсов.

Docker vs vm
Docker или VM?

Например для того чтобы запустить 10 изолированных Nginx в контейнерах на одной докерноде - необходимый объём ресурсов составит ресурсы для работы ОС и для работы 10 nginx + небольшой оверхед для контейнеризации. Для того чтобы запустить 10 изолированных Nginx на виртмашинах - необходимый объём ресурсов составит ресурсы для работы 10 ОС и 10 Nginx. 10 Nginx на 10 VM потребуют в 10 раз больше ресурсов чем 10 Nginx в 10 контейнерах на одной VM. Но да, виртмашины дадут нам беспрецедентную изоляцию, что в определённых ситуациях гораздо важнее, чем экономия ресурсов.

Как работает Docker

Чтобы понять что такое докер, нужно понять что разработчики Docker ничего не изобретали. Они построили своё решение на основе механизмов встроенных в ядро Linux испокон веков.

  • Namespaces (пространства имён) — изолируют видимость для каждого контейнера. Контейнер видит свои процессы (PID namespace), свою файловую систему (Mount namespace), свои сетевые интерфейсы (Network namespace), своего пользователя (User namespace). Один контейнер не видит процессы другого контейнера.

  • CGroups (Control Groups) — ограничивают ресурсы, которые контейнер может использовать. Можно сказать: «этому контейнеру не больше 512 МБ оперативной памяти и не больше одного ядра процессора».

  • Union Filesystems (OverlayFS, AUFS) — позволяют собирать файловую систему контейнера из нескольких слоёв. Базовый слой (например Ubuntu), слой с Nginx, слой с приложением — всё это объединяется в одну файловую систему без дублирования файлов.

Докер - это обёртка вокруг ядра Linux которая позволяет изолированно запускать приложения внутри контейнеров, опираясь на ресурсы хостовой ОС.В отличие от виртуальных машин, Docker не эмулирует железо и не запускает гостевую операционную систему — каждый контейнер использует ядро хоста напрямую, а изоляция достигается за счёт namespaces и cgroups. Именно поэтому контейнеры запускаются за секунды, весят мегабайты вместо гигабайт и позволяют упаковывать на одном сервере в разы больше полезной нагрузки, чем при использовании виртуальных машин.

Docker - это скорость и экономия
Docker - это скорость и экономия

Установка Docker

Устанавливать Docker и многое другое, всегда стоит по официальной документации. В случае с Docker ссылка на официальную справку по установке на Ubuntu будет следующей: https://docs.docker.com/engine/install/ubuntu/

1. Сначала добавляем репозиторий Docker

bash
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

2. Устанавливаем пакеты Docker

bash
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3. Проверяем что докер взлетел

bash
sudo systemctl status docker

4. Пытаемся запустить тестовый имидж

bash
sudo docker run hello-world

Если что-то не сработало, бежим в официальную справку, вдруг в процессе установки что-то изменилось

Если же всё взлетело без ошибок и вы следовали инструкции, у вас установятся актуальные версии и Docker и Docker Compose

Выводы

Docker или нет? Зависит от ситуации
Docker или нет? Зависит от ситуации

Важно понимать, что нет идеальных решений и всё зависит от контекста. Но в общем и целом, в ситуации, когда нужна экономия ресурсов и нужно запихать максимум полезной нагрузки на единственный VPS с двумя vCPU и 8GB RAM. И перед нами стоит вопрос "Устанавливать всё ПО непосредственно на ОС, решать проблемы с конфликтами и зависимостями" или "Использовать докер". Я бы настоятельно рекомендовал использовать докер, потому что это позволит вам управлять вашим решением как гроздью винограда, когда нужно и где нужно отрывая виноградину или наоборот её там наращивая. В случае с описанным выше впсом, гроздью винограда и 15 сервисами, с докером это была бы гроздь на 15 виноградин. Если бы мы отказались от использования докера в сторону установки всего и вся непосредственно на ОС, это была бы сложно управляемая и неотделяемая друг от друга, взрывоопасная мешанина, на которую спустя какое-то время было бы страшно даже дышать.