Создание простого HTTP-сервера для мониторинга контейнеров Docker на Golang
- вторник, 3 октября 2023 г. в 00:00:17
В этой статье мы рассмотрим пример простого HTTP-сервера, написанного на языке программирования Golang, который предоставляет информацию о контейнерах Docker.
Мы начинаем с импорта нескольких пакетов которые нам понадобятся, чтобы работать с Docker и HTTP. Это подобно тому, как вы берете инструменты для ремонта, прежде чем начать работу.
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"net/http"
)
Мы определяем специальную структуру (как шаблон), которая будет хранить информацию о контейнерах. В данном случае, эта структура содержит ID контейнера и имя образа.
type DContainer struct {
ID string `json:"id"`
Image string `json:"image"`
}
Эта функция ответственна за обработку запросов, которые мы получаем от пользователей. Она использует специальные инструменты, чтобы связаться с 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
}
}
Это место, где начинается выполнение программы. Мы говорим программе, что делать при запуске. В данном случае, мы говорим ей создать сервер, который будет слушать запросы на порту 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.