Читаю книгу "Docker. Вводный курс" за авторством Шона Кейна и Карла Маттиаса и узнаю много нового и интересного о Docker. Система, вроде бы, интуитивна и проста, но возможностей в ей скрывается столько, что без заметок и шпаргалок не упомнить, а значит астрологи объявили серию статей о Docker.
Точнее это будут не полноценные статьи, а скорее краткие заметки, объединённые по смыслу.
И так, в путь по океану наполненному синими китами!
Важно понять, контейнер - это НЕ виртуальная машина. Это лишь обёртка для одного процесса, который может порождать другие процессы. Он использует ядро и память той системы на которой запущен. Он "эфeмерен" и должен создаваться и уничтожаться без боязни и жалости. Контейнер занимает меньше места и ресурсов, чем виртуальная машина, но не может хранить состояния (по умолчанию)
Где Docker поможет, а где нет.
Docker имеет много преимуществ по сравнению со стандартным способом использования ПО.
- Принятие решения об используемой архитектуре в проекте становится проще, так как приложению теперь без разницы где запускаться;
- Все приложения упаковываются по стандарту Open Container Initiative;
- В одном образе находятся нужные файловые системы, зависимости, директории, код;
- ПО отделяется от "железа";
- Накладные расходы за использование технологии невелики.
Но не стоит думать, что Docker станет "серебряной пулей", которая решит все проблемы и задачи. Docker не заменит и не старается заменить:
- Виртуальные машины;
- Облака;
- ПО для развёртынвания хостов или конфигураций;
- Среды разработки.
Терминология
Для успешного освоения docker нужно понимать как он устроен, а значит важно не путаться в терминологии.
- Клиент Docker - это то, с помощью чего мы можем управлять сервером Docker, вызывается командой
docker - Сервер Docker - это команда
dockerdдля запуска серверного процесса, который собирает и запускает контейнеры через клиент. - Образы Docker - это любые образы, соответствующие стандарту OSI. Они состоят из нескольких слоёв файловой системы и метаданных. В них собраны все файлы, необходимые для выполнения приложения в контейнере.
- Контейнер Docker - это контейнер созданный из образа Docker. Один контейнер может существовать только один раз, но из одного образа может быть созданно любое количество контейнеров. Сам термин Docker-контейнер не является точным, так как Docker просто использует функционал операционной системы
- Минимальный хост - небольшой образ ОС, который поддерживает хостинг контейнеров.
Среда выполнения
Основной средой выполнения с сертификацией 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, которым обычно помечается последняя доступная версия. Для продакшена же этот путь не подойдёт и там нужно укзывать конкретную версию приложения.