Når du beslutter dig for at skrive din cykel til at hente hooks fra Docker Hub eller fra registry til automatisk opdatering/start af containerne på serveren, kan Docker CLI være nyttigt til at styre Docker-dæmonen på dit system.

Du skal bruge Go version 1.9.4 eller nyere.
Hvis du stadig ikke har skiftet til moduler, skal du installere CLI med følgende kommando:
go get github.com/docker/docker/clientStart af container
Det følgende eksempel viser, hvordan man starter en container ved hjælp af Docker API. I kommandoprompten ville du bruge kommandoen docker run, men vi klarer nemt denne opgave i vores service.
Dette eksempel er ækvivalent med at køre kommandoen docker run alpine echo hello world
package main {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// Henter docker image
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("Kunne ikke få porten")
}
portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}}
// Opretter en container med den givne konfiguration
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)
}
// Starter containeren
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
// Henter container loggene
out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out)
}Hente liste over kørende containere
Dette eksempel er ækvivalent med at køre kommandoen 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)
}
// Henter liste over kørende containere (docker ps)
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
panic(err)
}
// Udskriver alle container ID'er
for _, container := range containers {
fmt.Println(container.ID)
}
}
Stop alle kørende containere
Når du har lært at oprette og starte containere, er det tid til at lære at administrere dem. Det næste eksempel stopper alle kørende containere.
Kør ikke denne kode i produktion serveren!
pakke 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)
}
// Henter listen af kørende containere (docker ps)
containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
if err != nil {
panic(err)
}
for _, c := range containers {
fmt.Print("Stopper container ", c.ID[:10], "... ")
if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
panic(err)
}
fmt.Println("Succes")
}
}Visning af logfiler for en enkelt container
Du kan arbejde med en enkelt container. I det følgende eksempel vises logfilerne for containeren med det angivne ID. Før du kører, skal du ændre container-ID'et for den container, hvis logfiler du ønsker at hente.
pakke 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}
// Ændre container ID her
out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out)
}Hentning af liste over billeder
Dette eksempel er ækvivalent med at køre kommandoen docker image ls
pakke 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)
}
// Hentning af liste over billeder
images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
if err != nil {
panic(err)
}
for _, image := range images {
fmt.Println(image.ID)
}
}
Pull
Dette eksempel er ækvivalent med at køre kommandoen docker pull
pakke 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)
}
Hentning af billede med brugergodkendelse
Dette eksempel er ækvivalent med at køre kommandoen docker pull, med godkendelse.
Godkendelsesdata sendes i klar tekst. Officielle Docker-registre bruger HTTPS,
private registre skal også være konfigureret til at overføre data ved hjælp af HTTPS.
pakke 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)
}
// Oprettelse af en konfiguration med legitimationsoplysninger
authConfig := types.AuthConfig{
Username: "brugernavn",
Password: "adgangskode",
}
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)
}Kilde: habr.com
