![](/user_photo/_userpic.png)
книги хакеры / журнал хакер / 205_Optimized
.pdf![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT301x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
По умолчанию интервал обнаружения установлен в 1440 минут, для тестирова- |
|
. |
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
ния лучше его уменьшить, иначе информацию ждать будем долго:
PS> $conig.DiscoveryIntervalInMinutes = “10”
Подсети, в которых будет производиться обнаружение устройств:
PS> $conig.DiscoveryScopes = “10.0.0.0/24,192.168.0.0/24”
Получаем учетные данные, созданные ранее. Если создано несколько пользователей, то задаем их здесь, а при опросе устройств они будут перебираться до совпадения.
PS> $credential = Get-NetworkControllerCredential
–ConnectionUri https://example.org –ResourceId Сred1
PS> $conig.Credentials = $credential
IP-адрес устройства, которое будет использовано в качестве отправной точки для поиска в сети:
PS> $conig.DiscoverySeedDevices = “192.168.0.1”
Ограничение по глубине поиска устройств:
PS> $conig.HopLimit = “3”
PS> $conig.ActiveDirectoryDomains = “example.org”
Применяем установки:
PS> Set-NetworkControllerTopologyConiguration
–ConnectionUri https://example.org –Properties $conig
Проверяем настройки:
PS> $topology = Get-NetworkControllerDiscoveredTopology
-ConnectionUri https://example.org
PS> $topology.Properties
![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT302x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
|
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
Запускаем процесс поиска и идентификации сетевых устройств: |
||
|
|
p |
|
|
|
|
g |
|
|
||
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
PS> $discovery = New-Object Microsoft.Windows.NetworkController.
NetworkDiscoveryActionProperties
PS> $discovery.Action = “start”
PS> Invoke-NetworkControllerTopologyDiscovery
–ConnectionUri https://example.org –Properties $disсovery
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
X |
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
m |
||||||
|
|
|
|
|
|||||||
|
|
|
|
|
|
||||||
w |
|
|
|
|
|
|
|
|
|
||
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
-x cha |
|
|
|
|
Настраиваем процесс обнаружения
Некоторое время ждем, чтобы просмотреть результат. По каждому узлу собираются данные об имени, ОС, типе, модели, состоянии и прочему. В Windows для возможности обнаружения систем следует включить DCB, установив соответствующий компонент:
PS> Install-WindowsFeature Data-Center-Bridging
Послеэтогонужнопроверитьвсвойствахсетевыхустройств,чтобыбылустановлен флажок в параметрах Microsoft LLDP Protocol Driver и QoS Packet Scheduler. Включить также можно при помощи командлета:
PS> Enable-NetAdapterQoS “Ethernet0”
Состояние DCB выводится при помощи Get-NetQoSDCBxSetting. Статистика по обнаружению устройств и времени последнего запуска просматривается при помощи командлета Get-NetworkControllerTopologyDiscoveryStatistics:
PS> Get-NetworkControllerTopologyDiscoveryStatistics
-ConnectionUri https://example.org
![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT303x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
|
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
Теперь смотрим информацию о топологии, обнаруженных узлах и связях: |
||
|
|
p |
|
|
|
|
g |
|
|
||
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
X |
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
m |
||||||
|
|
|
|
|
|||||||
|
|
|
|
|
|
||||||
w |
|
|
|
|
|
|
|
|
|
||
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
-x cha |
|
|
|
|
PS> $topology = Get-NetworkControllerDiscoveredTopology
-ConnectionUri https://example.org
Получим массив узлов.
PS> $topology.Properties
Свойства одного узла:
PS> $topology.Properties.TopologyNodes[0].Properties
Просмотр связей:
PS> $topology.Properties.TopologyLinks[0].Properties
Есть и специальные командлеты, позволяющие получить те же данные более просто: Get-NetworkControllerDiscoveredTopologyLink, Get-NetworkControllerDiscover edTopologyNode и Get-NetworkControllerDiscoveredTopologyTerminationPoint.
В зависимости от ситуации некоторые узлы будут отмечены как недоступные, это может значить, что узел найден, но получена не вся необходимая информация. После нескольких проверок статус может измениться. Вполне возможно, что потребуется вручную указать или убрать узлы и настроить связи между узлами. Для этого используется несколько NetworkControllerDiscoveredTopology командлетов с префиксом New- и Remove-.
Добавить данные о сетях и IP-пуле позволяют командлеты New-NetworkController LogicalNetwork, New-NetworkControllerLogicalSubnet и New-NetworkControllerIpPool.
ВЫВОД
Появление новой роли явно показывает перспективы развития сетей в будущем. Очевидно, ставка делается на гибридные сети и облачные сервисы. Конфигурирование при помощи PowerShell нельзя назвать простым и в больших сетях наглядным, но зато каждое действие полностью контролируется, а возможности использования скриптов позволяют легко автоматизировать процесс.
![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT304x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
SYNACK |
|
|
|
|
df-xchan |
|
|
|
|||||
w Click |
to |
|
|
|
|
|
m |
|
|||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
ЖОНГЛИРУЕМ
КОНТЕЙНЕРАМИ
РАЗНЫЕ ПОЛЕЗНЫЕ ПЛЮШКИ ДЛЯ DOCKER
Мартин
«urban.prankster»
Пранкевич martin@synack.ru
![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT305x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
Появившись, Docker практически сразу стал интере- |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
g |
.c |
|
||||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
сен IT-шникам, которые получили в руки удобный инструмент для безопасного и быстрого развертывания приложений. Но, немного поигравшись, понимаешь, что базового набора недостаточно. Большая популярность проекта привела к тому, что он мгновенно оброс сопутствующими субпроектами и хаками, предлагающими улучшения и устранения известных недостатков.
МОНИТОРИНГ
Запуск ПО в продакшене без мониторинга в чем-то похож на вождение с завязанными глазами: когда-нибудь точно врежешься. Традиционные решения для мониторинга покрывают две проблемы: сбор метрик хоста и мониторинг конкретного приложения. Но контейнеры Docker находятся по положению где-то между ними, это не хост и не приложение, а значит, оба эти способа неэффективны. Кроме того, контейнеры постоянно появляются и исчезают, следить за каждым обычным способом нельзя. То есть без специальных средств не обойтись.
Docker предоставляется со встроенными функциями мониторинга, позволяющими контролировать все важные показатели CPU, Mem, I/O и сеть. Причем предлагает для их считывания аж три способа: при помощи sysfs (расположены в /sys/fs/cgroup), команды stat и API.
$ cat /sys/fs/cgroup/cpuacct/docker/CONTAINER_ID/cpuacct.stat
$ docker stats CONTAINER_ID
Доступ к API также получить очень просто, достаточно прочитать данные из сокета.
$ echo -e “GET /containers/[CONTAINER_ID]/stats HTTP/1.0\r\n” |
nc -U /var/run/docker.sock
Кроме этого, часть stdout/stderr информации Docker выводит в файл журнала. В Ubuntu это /var/lib/docker.log.
Статистикаработыконтейнера
![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT306x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
Штатные инструменты дают общие сведения по нагрузке в конкретный момент |
|
. |
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
времени, но не ведут статистику и не выдают предупреждения, а поэтому не предоставляют возможности полноценно контролировать использование ресурсов и характеристики контейнеров. Наглядностью данные тоже не отличаются. Наличие API позволило сторонним разработчикам создать свои приложения.
Одно из самых популярных, cAdvisor, представляет собой специальный демон, который собирает статистику об общем использовании ресурсов, сетевом трафике и установленных пределах и отображает информацию в графическом виде. Новый контейнер автоматически подхватывается cAdvisor, и по нему выводится временной ряд. В отдельной вкладке предоставляются данные по конкретному контейнеру. Поддерживает потоки событий — создание, удаление, аномальные события. По умолчанию данные на графиках в скользящем окне показываются только за одну минуту. Нет возможности посмотреть более долгосрочные тенденции и получить предупреждение о достижении лимита. Хотя, вероятно, для разработки этого вполне и достаточно. Для хранения долгосрочных метрик cAdvisor интегрируется с InfluxDB и планируется с Google BigQuery. Для интеграции с InfluxDB достаточно указать в строке запуска -storage_driver=influxdb.
cAdvisor реализован и как контейнер Docker, поэтому его получить проще простого (есть возможность запуска вне Docker).
$ docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw
--volume=/sys:/sys:ro
--volume=/var/lib/docker/:/var/lib/docker:ro
--publish=8080:8080 --detach=true
--name=cadvisor google/cadvisor
Теперь, чтобы подключиться, достаточно набрать http://localhost:8080. Кроме ограничения в периоде выводимой информации, у cAdvisor есть еще один недостаток — он может контролировать только один хост Docker. Поэтому он не совсем подходит для использования в кластере из нескольких установок Docker.
Axibase Time-Series Database — решение, использующее метрики производительности, снятые cAdvisor (собственной доработанной версии), но умеющее их хранить, анализировать и визуализировать. Один экземпляр ATSD может собрать метрики нескольких хостов Docker и cAdvisor. Статистика отправляется по протоколу TCP, по умолчанию это локальный адрес, но удаленную систему можно указать при запуске с помощью параметров --atsd_storage_url и --atsd_storage_write_host. Также ATSD может собирать данные с демонов collectd, tcollector или Nmon, запущенных внутри контейнеров. Это позволит получать и анализировать в последующем еще большую информацию.
![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT307x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
Среди open source решений следует вспомнить о системе мониторинга |
|
. |
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
Prometheus, описанной в сентябрьском номере. Она полностью ориентирована на микросервисную архитектуру и поддерживает Docker из коробки.
Если развернута система мониторинга Zabbix, можно использовать специальный модуль, показывающий общую информацию о нагрузке системы и данные об отдельных контейнерах.
Вывод статистики в cAdvisor
ЖУРНАЛЫ
Без журналов приложений тяжело понять суть возникшей ошибки, появившейся при работе сервиса. В Docker, чтобы получить журнал, требуется решить две проблемы: нужные данные надо собрать и доставить наружу, полученные данные — сохранить.
По умолчанию наружу контейнера доступен вывод STDOUT, а поэтому достаточно в него направить логи приложения и затем просматривать при помощи docker logs -f <название_контейнера>. Но в этом случае нужно быть точно уверенным, что в STDOUT попадает все необходимое. О сохранении и анали-
![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT308x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
зе в |
дальнейшем придется позаботиться отдельно. Правда, нужно помнить, |
|
. |
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
что при запуске контейнера с опцией -t STDOUT будет уходить в открытый псевдоTTY.
Теперь как собрать. Используя параметр --log-driver в команде запуска контейнера docker run, можно журнал контейнера направлять в syslog, journald, fluentd, файл JSON и так далее.
$ docker run ubuntu --log-driver=syslog
--log-opt syslog-address=udp://192.168.0.1:514
--log-opt labels=ubuntu
В репозитории легко найти контейнер, реализующий syslog, поэтому развернуть такую схему достаточно легко. К сообщению можно добавлять метки, чтобы легче было найти нужные данные в общем файле. При этом предусмотрено использование подстановок. Например, тег {{.Name}} выведет имя контейнера, а {{.ID}} — его идентификатор.
Другой вариант — смонтировать каталог с журналами, добавив -v /var/ log/:/var/log/, и таким образом получить доступ к ним. Но при большом количестве контейнеров такой вариант не всегда удобен. В ответ на проблемы появились и сторонние разработки, их решающие.
Проект logspout реализует простую функцию — собирает логи со всех запущенных контейнеров (STDOUT, STDERR и пока частично syslog) и отправляет на удаленный хост.
$ docker run –name=”logspout”
--volume=/var/run/docker.sock:/tmp/docker.sock
gliderlabs/logspout syslog://example.org:514
Модульная конструкция позволяет расширять возможности. Например, модуль httpstream выводит поток логов в реальном времени. Для тех контейнеров, журналы которых нужно игнорировать при запуске, следует добавлять
-e ‘LOGSPOUT=ignore’.
Logjam умеет собирать журналы с локального UDP-сокета или файла и отправлять на удаленный адрес. В качестве агрегатора журналов для Docker часто используют logstash — специальное приложение, умеющее собирать, фильтровать, нормализовать и хранить любые данные в любом формате.
![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT309x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
ИНТЕРФЕЙС |
|
|
. |
|
|
|
|
|
|
.c |
|
||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
Управлять большим количеством контейнеров и образов без наглядного интерфейса не очень удобно, особенно если запускать контейнеры должны малоподготовленные пользователи. Официальный проект предоставляет только GUI Docker Kitematic, который доступен для OS X 10.9+ и Windows 7+ 64-bit, позволяющий быстро развернуть, сконфигурировать среду Docker, управлять ею и запускать контейнеры (через VirtualBox). Но в нашем случае он не подходит.
Хотя это не проблема, так как на сегодня доступно уже несколько десятков реализаций сторонних разработчиков. Проекты опираются на Docker Remote API, позволяющий производить все манипуляции, доступные в командной строке. Shipyard, наверное, самый продвинутый и идеальный интерфейс для удобной работы со всеми функциями Docker. С его помощью удобно запускать, перезапускать, уничтожать, создавать, получать подробную информацию о контейнерах (статус, использование, время создания, порты, процессы
ипрочее), просматривать журналы контейнеров. Также он выводит статистику по использованию CPU, памяти и сети, выводит логи. Реализован просмотр доступных образов и работа с тегами, просмотр узлов и IP. Есть возможность запуска команд при помощи docker exec. Поддерживается работа в многопользовательской среде, интеграция с OpenLDAP и Active Directory. Пользователям назначаются роли, дающие разные права. Список ролей фиксированный
исодержит одиннадцать вариантов, то есть его вполне достаточно для большинства задач. Для хранения данных используется RethinkDB. Поддерживается кластер Docker Swarm, позволяющий объединить несколько Docker-хостов в один виртуальный. Получить его просто:
$ curl -sSL https://shipyard-project.com/deploy | ACTION=deploy bash -s
Все параметры, которые можно использовать для сборки и сборки в качестве ноды в Swarm, расписаны в документации. По умолчанию используется 8080- й порт, логин/пароль — admin/shipyard. Остальные параметры (подключение к LDAP, внешней RethinkDB, сертификаты и прочее) можно узнать при помощи команды
$ docker run shipyard/shipyard server -h
![](/html/77786/195/html_yvILJ72Pp0.lzbb/htmlconvd-QvhHeT310x1.jpg)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
X |
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
m |
||||||
|
|
|
|
|
|||||||
|
|
|
|
|
|
||||||
w |
|
|
|
|
|
|
|
|
|
||
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
-x cha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
Управление контейнером в Shipyard
Если нужен инструмент попроще, то можно порекомендовать Dockerding, позволяющий управлять контейнерами, получать информацию по каждому (ID, образ, команда, статус, сетевые настройки, переменные и так далее), запускать, останавливать, перезапускать и удалять, просматривать журналы работы, создавать новый контейнер, для чего нужно просто заполнить предложенные поля. Все функции доступны в двух пунктах меню, запутаться в которых просто невозможно. По работе с образами пока реализована общая информация и возможность удаления. Простой и понятный инструмент, позволяющий не вспоминать названия команд и контейнеров, а сразу получать все данные.
$ docker pull evolutio/dockerding
$ docker run -d -p 3000:3000 --privileged --name dockerding
-v /var/run/docker.sock:/var/run/docker.sock evolutio/dockerding