Gestione dei contenitori Docker in Go

Documentazione!

Quando deciderai di scrivere il tuo container per il recupero di hook da docker hub o da registry per l'aggiornamento automatico/avvio di container sul server, Docker CLI potrebbe esserti utile per gestire il demone Docker nel tuo sistema.
Gestione dei contenitori Docker in Go

Per lavorare avrai bisogno di Go versione non inferiore a 1.9.4

Se non hai ancora abilitato i moduli, installa CLI con il seguente comando:

go get github.com/docker/docker/client

Avvio del contenitore

Il seguente esempio mostra come avviare un container utilizzando l'API Docker. Nella riga di comando utilizzeresti il comando docker run, ma noi gestiremo facilmente questo compito nel nostro servizio.
Questo esempio è equivalente all'esecuzione del comando docker run alpine echo hello world

package main {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // Eseguiamo docker pull
    reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, reader)

    hostBinding := nat.PortBinding{
        HostIP:   "0.0.0.0",
        HostPort: "8000",
    }
    containerPort, err := nat.NewPort("tcp", "80")
    if err != nil {
        panic("Impossibile ottenere la porta")
    }
    portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}}

    // Creiamo un container con la configurazione specificata
    resp, err := cli.ContainerCreate(ctx, &container.Config{
        Image: "alpine",
        Cmd:   []string{"echo", "hello world"},
        Tty:   true,
    }, &container.HostConfig{
        PortBindings: portBinding,
    }, nil, "")
    if err != nil {
        panic(err)
    }

    // Avviamo il container
    if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
        panic(err)
    }

    // Otteniamo i log del container
    out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

Recupero dell'elenco dei container in esecuzione

Questo esempio è equivalente all'esecuzione del comando docker ps

package main

import (
    "context"
    "fmt"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // Recupero dell'elenco dei container in esecuzione (docker ps)
    containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    // Stampa di tutti gli ID dei container
    for _, container := range containers {
        fmt.Println(container.ID)
    }
}

Arresto di tutti i container in esecuzione

Dopo aver imparato a creare e avviare container, è tempo di imparare a gestirli. Il seguente esempio fermerà tutti i container in esecuzione.

Non eseguire questo codice in produzione server!

package main

import (
    "context"
    "fmt"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // Recupero dell'elenco dei container in esecuzione (docker ps)
    containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    for _, c := range containers {
        fmt.Print("Arrestando il container ", c.ID[:10], "... ")
        if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
            panic(err)
        }
        fmt.Println("Successo")
    }
}

Visualizzazione dei log di un singolo container

Puoi lavorare con singoli container. Nel seguente esempio vengono visualizzati i log per il container con l'ID specificato. Prima di eseguirlo, dovrai modificare l'ID del container i cui log desideri ottenere.

package main

import (
    "context"
    "io"
    "os"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    options := types.ContainerLogsOptions{ShowStdout: true}
    // Modifica qui l'ID del container
    out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

Recupero dell'elenco delle immagini

Questo esempio è equivalente all'esecuzione del comando docker image ls

package main

import (
    "context"
    "fmt"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // Recupero dell'elenco delle immagini
    images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
    if err != nil {
        panic(err)
    }

    for _, image := range images {
        fmt.Println(image.ID)
    }
}

Pull

Questo esempio è equivalente all'esecuzione del comando docker pull

package main

import (
    "context"
    "io"
    "os"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // docker pull alpine
    out, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
    if err != nil {
        panic(err)
    }
    defer out.Close()
    io.Copy(os.Stdout, out)
}

Scaricamento di un'immagine con autenticazione utente

Questo esempio è equivalente all'esecuzione del comando docker pull, con autenticazione.

I dati di autenticazione vengono inviati in chiaro. Le registrazioni ufficiali di Docker utilizzano HTTPS,
le registrazioni private devono essere configurate per trasmettere dati utilizzando HTTPS.

package main

import (
    "context"
    "encoding/base64"
    "encoding/json"
    "io"
    "os"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // Creazione di una configurazione con i dati di autenticazione
    authConfig := types.AuthConfig{
        Username: "username",
        Password: "password",
    }
    encodedJSON, err := json.Marshal(authConfig)
    if err != nil {
        panic(err)
    }
    authStr := base64.URLEncoding.EncodeToString(encodedJSON)

    out, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{RegistryAuth: authStr})
    if err != nil {
        panic(err)
    }

    defer out.Close()
    io.Copy(os.Stdout, out)
}

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster