DockerCluster
- це клас, що представляє кластер серверів Docker. Він дозволяє керувати набором вузлів Docker, групувати їх за допомогою тегів та виконувати операції як на окремих вузлах, так і на групах вузлів.
Sangezar\DockerClient\Cluster
// Регулярний вираз для валідації імен вузлів
private const NODE_NAME_PATTERN = '/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/';
// Регулярний вираз для валідації імен тегів
private const TAG_NAME_PATTERN = '/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/';
public function addNode(string $name, DockerClient $client, array $tags = []): self
Додає новий вузол до кластера.
$name
- Унікальне ім’я вузла$client
- Клієнт Docker API$tags
- Масив тегів для категоризації вузла (за замовчуванням порожній масив)DockerCluster
(для ланцюжкових викликів)ValidationException
- якщо ім’я вузла неприпустиме або вже існуєpublic function node(string $name): DockerClient
Повертає клієнт вузла за його іменем.
$name
- Ім’я вузлаDockerClient
для вказаного вузлаNodeNotFoundException
- якщо вузол не знайденоValidationException
- якщо ім’я вузла порожнєpublic function hasNode(string $name): bool
Перевіряє, чи існує вузол з вказаним іменем.
$name
- Ім’я вузлаtrue
, якщо вузол існує, false
- якщо ніpublic function removeNode(string $name): self
Видаляє вузол з кластера.
$name
- Ім’я вузлаDockerCluster
(для ланцюжкових викликів)ValidationException
- якщо ім’я вузла порожнєpublic function getNodesByTag(string $tag): array
Повертає всі вузли з вказаним тегом.
$tag
- Тег для фільтраціїValidationException
- якщо тег неприпустимийpublic function addTagToNode(string $nodeName, string $tag): self
Додає тег до існуючого вузла.
$nodeName
- Ім’я вузла$tag
- Тег для додаванняDockerCluster
(для ланцюжкових викликів)NodeNotFoundException
- якщо вузол не знайденоValidationException
- якщо тег неприпустимий або ім’я вузла порожнєpublic function removeTagFromNode(string $nodeName, string $tag): self
Видаляє тег з вузла.
$nodeName
- Ім’я вузла$tag
- Тег для видаленняDockerCluster
(для ланцюжкових викликів)NodeNotFoundException
- якщо вузол не знайденоValidationException
- якщо ім’я вузла порожнєpublic function getNodesByAllTags(array $tags): array
Повертає всі вузли, які мають всі вказані теги (операція І).
$tags
- Масив тегівValidationException
- якщо будь-який тег неприпустимийpublic function getNodesByAnyTag(array $tags): array
Повертає всі вузли, які мають хоча б один з вказаних тегів (операція АБО).
$tags
- Масив тегівValidationException
- якщо будь-який тег неприпустимийpublic function filter(callable $callback): NodeCollection
Повертає колекцію вузлів, відфільтровану за допомогою функції зворотного виклику.
$callback
- Функція-колбек для фільтрації, яка приймає вузол як аргумент і повертає булеве значенняNodeCollection
з відфільтрованими вузламиpublic function all(): NodeCollection
Повертає колекцію всіх вузлів кластера.
NodeCollection
з усіма вузламиpublic function byTag(string $tag): NodeCollection
Повертає колекцію вузлів з вказаним тегом.
$tag
- Тег для фільтраціїNodeCollection
з вузлами, які мають вказаний тегpublic function byAllTags(array $tags): NodeCollection
Повертає колекцію вузлів, які мають всі вказані теги.
$tags
- Масив тегівNodeCollection
з вузлами, які мають всі вказані тегиpublic function byAnyTag(array $tags): NodeCollection
Повертає колекцію вузлів, які мають хоча б один з вказаних тегів.
$tags
- Масив тегівNodeCollection
з вузлами, які мають хоча б один з вказаних тегівpublic function addNodes(array $nodes): self
Додає кілька вузлів до кластера.
$nodes
- Масив вузлів для додавання, де ключі:
name
(string) - Ім’я вузлаclient
(DockerClient) - Клієнт Docker APItags
(array, необов’язковий) - Масив тегівDockerCluster
(для ланцюжкових викликів)addNode
public function getNodes(): array
Повертає всі вузли кластера.
DockerClient
public function getTags(): array
Повертає всі теги кластера.
public function isEmpty(): bool
Перевіряє, чи кластер порожній.
true
, якщо в кластері немає вузлів, false
- якщо єpublic function count(): int
Підраховує кількість вузлів у кластері.
use Sangezar\DockerClient\DockerClient;
use Sangezar\DockerClient\Cluster\DockerCluster;
// Створення кластера
$cluster = new DockerCluster();
// Додавання вузлів з тегами
$cluster->addNode(
'node1',
DockerClient::createTcp('tcp://192.168.1.10:2375'),
['production', 'web']
);
$cluster->addNode(
'node2',
DockerClient::createTcp('tcp://192.168.1.11:2375'),
['production', 'database']
);
$cluster->addNode(
'node3',
DockerClient::createTcp('tcp://192.168.1.12:2375'),
['staging', 'web']
);
// Перевірка кількості вузлів
echo "Загальна кількість вузлів: " . $cluster->count() . "\n";
// Отримання всіх вузлів з тегом 'production'
$productionNodes = $cluster->getNodesByTag('production');
echo "Вузли з тегом 'production': " . implode(', ', array_keys($productionNodes)) . "\n";
// Отримання вузлів, які мають обидва теги: 'production' та 'web'
$productionWebNodes = $cluster->getNodesByAllTags(['production', 'web']);
echo "Вузли з тегами 'production' та 'web': " . implode(', ', array_keys($productionWebNodes)) . "\n";
// Отримання вузлів, які мають тег 'production' або 'staging'
$allEnvNodes = $cluster->getNodesByAnyTag(['production', 'staging']);
echo "Вузли з тегами 'production' або 'staging': " . implode(', ', array_keys($allEnvNodes)) . "\n";
// Отримання колекції вузлів за тегом і виконання операцій
$webNodesCollection = $cluster->byTag('web');
// Отримання списку всіх контейнерів на веб-вузлах
$containersMap = $webNodesCollection->containers()->list(['all' => true]);
foreach ($containersMap as $nodeName => $containers) {
echo "Вузол: $nodeName\n";
foreach ($containers as $container) {
echo " Контейнер: {$container['Names'][0]}\n";
}
}
// Додавання тегу до вузла
$cluster->addTagToNode('node3', 'monitoring');
// Видалення тегу з вузла
$cluster->removeTagFromNode('node2', 'production');
// Перевірка наявності вузла
if ($cluster->hasNode('node1')) {
echo "Вузол 'node1' існує\n";
// Виконання операцій на окремому вузлі
$node1Client = $cluster->node('node1');
$containers = $node1Client->container()->list(['all' => true]);
echo "Кількість контейнерів на вузлі 'node1': " . count($containers) . "\n";
}