golang

Создание простого HTTP-сервера для мониторинга контейнеров Docker на Golang

  • вторник, 3 октября 2023 г. в 00:00:17
https://habr.com/ru/articles/764756/

В этой статье мы рассмотрим пример простого HTTP-сервера, написанного на языке программирования Golang, который предоставляет информацию о контейнерах Docker.

Ссылка на Github

Импорты

Мы начинаем с импорта нескольких пакетов которые нам понадобятся, чтобы работать с Docker и HTTP. Это подобно тому, как вы берете инструменты для ремонта, прежде чем начать работу.

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/client"
	"net/http"
)

Структура 'DContainer'

Мы определяем специальную структуру (как шаблон), которая будет хранить информацию о контейнерах. В данном случае, эта структура содержит ID контейнера и имя образа.

type DContainer struct {
	ID    string `json:"id"`
	Image string `json:"image"`
}

Функция 'getContainers'

Эта функция ответственна за обработку запросов, которые мы получаем от пользователей. Она использует специальные инструменты, чтобы связаться с Docker, получить список контейнеров и вернуть этот список в формате JSON.

func getContainers(w http.ResponseWriter, r *http.Request) {
    // Создание клиента Docker через переменную 'cli'.
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // Получение списка контейнеров с использованием Docker API.
    containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // Создание среза 'containersList' для хранения информации о контейнерах.
    containersList := make([]DContainer, len(containers))

    // Проход по списку контейнеров и заполнение 'containersList'.
    for i, container := range containers {
        containersList[i] = DContainer{
            ID:    container.ID[:10], // Обрезаем ID контейнера до 10 символов.
            Image: container.Image,
        }
    }

    // Установка заголовка HTTP-ответа для указания формата JSON.
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)

    // Кодирование 'containersList' в формат JSON и отправка его в HTTP-ответе.
    if err := json.NewEncoder(w).Encode(containersList); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

Функция main

Это место, где начинается выполнение программы. Мы говорим программе, что делать при запуске. В данном случае, мы говорим ей создать сервер, который будет слушать запросы на порту 3600, и мы также указываем, какой код должен выполняться при получении запросов.

func main() {
	http.HandleFunc("/containers", getContainers)

	port := ":3600"
	fmt.Printf("Server listening on %s\n", port)
	if err := http.ListenAndServe(port, nil); err != nil {
		panic(err)
	}
}

Запуск сервера

  • Убедитесть, что у вас установлены Docker и Go

  • Скопировать код в файл с расширением .go

  • Запустить сервер выполнив go run main.go

После запуска сервер будет доступен по адресу http://localhost:3600/containers и предоставит информацию о контейнерах в формате JSON.

Этот сервер - простой пример исключительно для обучения. Вы можете его расширить и добавить больше функций, чтобы сделать его более полезным для мониторинга контейнеров Docker.