Основы Docker

Виртуализация #

Типы виртуализации:

  • эмуляция железа - использует ВИ для симуляции требуемого железа
    • pros: теоретически можно запустить любой софт на любом виртуальном железе
    • cons: очень медленно

    +----------+----------+----------+----------+
    |   Apps   |   Apps   |   Apps   |   Apps   |
    +----------+----------+----------+----------+
    | Guest OS | Guest OS | Guest OS | Guest OS |
    +----------+----------+----------+----------+
    |    Hardware VM A    |    Hardware VM B    |
    +---------------------+---------------------+
    |                  Hardware                 |
    +---------------------+---------------------+

  • полная виртуализация

    • использует гипервизор для предоставления ВМ нижележащего физического железа
    • в этом случае запускаемая на ВМ ОС должна иметь ту же архитектуру
    • гипервизор может быть:
      • приложением
      • частью ядра ОС
      • самостоятельной ОС
    • примеры:
      • KVM+QEMU
      • Xen
      • VirtualBox
      • VMware
      • Parallels
      • MS HyperV
  • пара-виртуализация

    • разделение процессов с гостевой ОС
    • могут использоваться различные ядра
    • у ядра гостевой ОС есть модуль, который позволяет часть системный вызовов выполнять на хостовой ОС
  • изоляция/контейнеризация

    • запуск некоторых процессов в изолированной среде на той же самой ОС
    • мнение: просто новый способ запуска задач (процессов) в ОС
    • примеры:
      • Docker
      • Sandbox
      • OpenVZ
      • LXC
      • Singularity (для использования не нужны root права)

    +------------------------------------------------------------+
    | Private Zone |  Private Zone |      ...     | Private Zone |
    +------------------------------------------------------------+
    |                    Operating System (host)                 |
    +------------------------------------------------------------+
    |                            Hardware                        |
    +------------------------------------------------------------+

LXC - одна из первых реализаций контейнеров под Linux (вроде как родом из Google, проверить).

Технологии, на которых основана контейнеризация #

CGroups #

Механизм ядра, позволяющий:

  • изолировать
  • приоритизировать
  • управлять
  • рассчитывать

ресурсы, доступные системе.

Основные ресурсы:

  • CPU
    • ядра
    • процессорное время
  • memory
  • disk I/O
  • network I/O

Задачи, выполняемые CGroup:

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

Namespaces #

Позволяет ограничить возможность взаимодействия процессов с процессами и иными ресурсами, принадлежащими другой группе (другому пространству имен).

  • PID (процесс в таком NS имеет 2 PID - один из хостовой системы, второй из самого NS; при этом другие процессы того же NS могут узнать только второй)
  • FS (mount; прародителем этого типа изоляции был chroot)
  • UTS
  • network
  • SysV IPC

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

ФС самого контейнера, именно на этом уровне реализуется многослойность. Каждый слой образа - RO.

При запуске контейнера из этого образа добавляется еще один слой, который уже доступен RW. Этот слой существует только в момент жизни контейнера, как только контейнер удаляется, все данные из внешнего слоя так же удаляются.

Docker image #

Схема имени образа:

[host][:port]/[repository]/<image-name>[:tag]

Если:

  • host не указан, то по умолчанию подразумевается hub.docker.com, однако это можно изменить в настройках Docker демона.
  • на hub.docker.com в адресе образа отсутствует repository (username в случае именно этого ресурса), это значит, что образ официальный.
  • tag не указан, но подразумевается latest.

Полезные команды #

# Последовательность, позволяющая отключиться от контейнера, не прерывая его работу
^p^q

# Запуск остановленного контейнера
docker start ${CONTAINER_ID}

# Подключение к запущенному контейнеру
docker attach ${CONTAINER_ID}

# Добавление таймштампов к логу
docker logs -t ${CONTAINER_ID}

# Сравнение текущего RW слоя контейнера с образом
docker diff ${CONTAINER_ID}

# Показывает системные PID`ы процессов, запущенных в контейнере
docker top

# Показывает все контейнеры в системе и ресурсы, которые они потребляют
docker stats

# Создает tar-архив из ФС контейнера и подает его на stdout
docker export

# Создает образ из tar-архива
docker import

# Показывает историю изменений образа
docker history

Сборка образа #

На каждую строчку Dockerfile запускается контейнер и в нем выполняется инструкция. Если при этом был изменен верхний (RW) слой контейнера, происходит docker commit, тем самым, создаётся новый слой образа.

Директива ADD умеет распаковывать tar-архивы и копировать в образ удаленные файлы (при этом не поддерживается распаковка).

Работа с локальным реджистри #

Для отправки контейнера в локальный (кастомный) реджистри, нужно добавить ему тег с именем реджистри, после чего выполнить docker push.

Docker Machine #

Средство оркестрации, позволяющее управлять Docker-демонами на удаленных машинах с использованием REST API.