The book of Magnus

IT-заметки и знания

Docker. Начало

Tags = [ DevSecOps, Docker ]

Читаю книгу "Docker. Вводный курс" за авторством Шона Кейна и Карла Маттиаса и узнаю много нового и интересного о Docker. Система, вроде бы, интуитивна и проста, но возможностей в ей скрывается столько, что без заметок и шпаргалок не упомнить, а значит астрологи объявили серию статей о Docker.

Точнее это будут не полноценные статьи, а скорее краткие заметки, объединённые по смыслу.

И так, в путь по океану наполненному синими китами!

Важно понять, контейнер - это НЕ виртуальная машина. Это лишь обёртка для одного процесса, который может порождать другие процессы. Он использует ядро и память той системы на которой запущен. Он "эфeмерен" и должен создаваться и уничтожаться без боязни и жалости. Контейнер занимает меньше места и ресурсов, чем виртуальная машина, но не может хранить состояния (по умолчанию)

Где Docker поможет, а где нет.

Docker имеет много преимуществ по сравнению со стандартным способом использования ПО.

  • Принятие решения об используемой архитектуре в проекте становится проще, так как приложению теперь без разницы где запускаться;
  • Все приложения упаковываются по стандарту Open Container Initiative;
  • В одном образе находятся нужные файловые системы, зависимости, директории, код;
  • ПО отделяется от "железа";
  • Накладные расходы за использование технологии невелики.

Но не стоит думать, что Docker станет "серебряной пулей", которая решит все проблемы и задачи. Docker не заменит и не старается заменить:

  • Виртуальные машины;
  • Облака;
  • ПО для развёртынвания хостов или конфигураций;
  • Среды разработки.

Терминология

Для успешного освоения docker нужно понимать как он устроен, а значит важно не путаться в терминологии.

  1. Клиент Docker - это то, с помощью чего мы можем управлять сервером Docker, вызывается командой docker
  2. Сервер Docker - это команда dockerd для запуска серверного процесса, который собирает и запускает контейнеры через клиент.
  3. Образы Docker - это любые образы, соответствующие стандарту OSI. Они состоят из нескольких слоёв файловой системы и метаданных. В них собраны все файлы, необходимые для выполнения приложения в контейнере.
  4. Контейнер Docker - это контейнер созданный из образа Docker. Один контейнер может существовать только один раз, но из одного образа может быть созданно любое количество контейнеров. Сам термин Docker-контейнер не является точным, так как Docker просто использует функционал операционной системы
  5. Минимальный хост - небольшой образ ОС, который поддерживает хостинг контейнеров.

Среда выполнения

Основной средой выполнения с сертификацией OSI является containerd - высокоуровневая среда по умолчанию в Docker и Kubernetis.

Сама же containerd использует несколько низкоуровневых сред для администрирования и создания контейнеров:

  • runc - используется чаще всего;
  • crun - написана на С;
  • Kata Containers - от Intel, Hyper и OpenStack. Может работать и с контейнерами, и с виртуальными машинами;
  • gVisor - изолированная среда выполнения, реализованная в пространстве пользователя;
  • Nabla Containers - ещё одна изолированная среда выполнения.

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

Docker очень сложно устроен. Очень. Но нам, обычным пользователям, бояться этого не стоит, так как вся сложность спрятана под капотом, а мы видим лишь стандартную модель "клиент-сервер".

Под капотом используются:

  • Различные механизмы ядра ОС, включая iptables;
  • Виртуальные сетевые мосты;
  • Cgroups;
  • Capabilities (привелегии);
  • Secure compututing mode (безопасный режим вычислений);
  • и многое другое.

Что видит пользователь:

  • Клиент;
  • Сервер;
  • Registry (хранит образы и их метаданные).

Сетевые порты

По умолчанию Docker использует три порта:

  • 2375 TCP - для нешифрованного трафика;
  • 2376 TCP - для зашифрованный SSL-соединений;
  • 2377 для режима Swarm.

Настроить другие порты для данных целей можно без труда, но использовать порты не рекомендуется в целом, так как у демона нет механизмов аутентификации. А рекомендуется осуществлять коммуникацию через сокет, которая и настроена по умолчанию.

Сокет Unix может располагаться по разным путям, но обычно он находится в /var/run/docker.sock.

В более новых версиях docker.sock создаётся в корневом каталоге пользователся, внутри .docker/run/, а на /var/run/docker.sock делается ссылка.

Сеть для контейнеров

Все контейнеры по умлочанию создаются с сетью в режиме bridge, где шлюзом является хостовая машина. Сетевым трафиком в основном упарвляет библиотека vpnkit.

Docker выделяет частные подсети из неиспользуемого блока согласно RFC 1918. Сеть соединяется мостом с локальной сетью хоста через интерфейс docker0.

Можно настроить контейнер так, чтобы он работал с сетью напрямую, не используя bridge-режим, для этого нужно при запуске контейнера указать --net=host. А можно и совсем отключить сеть, указав --net=none.

Контроль изменений

Из коробки у Docker есть два способа контроля изменений. Один отслеживает слои файловой системы, второй - теги этих образов.

Каждый слой в контейнере обладает уникальным хэшем для идентификации и все наборы изменений накладываются поверх предыдущих.

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