NÀr du bestÀmmer dig för att skriva din egen cykel för att hÀmta hooks frÄn Docker Hub eller frÄn registry för automatisk uppdatering/start av containrar pÄ servern kan Docker CLI vara till hjÀlp, vilket gör att du kan hantera Docker-demonen i ditt system.

För att arbeta behövs Go-version inte lÀgre Àn 1.9.4
Om du fortfarande inte har övergÄtt till moduler, installera CLI med följande kommando:
go get github.com/docker/docker/clientStarta containern
Följande exempel visar hur man startar en container med hjÀlp av Docker API. I kommandoraden skulle du anvÀnda kommandot docker run, men vi klarar lÀtt av denna uppgift i vÄr tjÀnst.
Detta exempel Àr ekvivalent med att köra kommandot docker run alpine echo hello world
package main {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// Gör 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("Kunde inte fÄ porten")
}
portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}}
// Skapa en container med angiven 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)
}
// Starta containern
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
// FĂ„ containerns loggar
out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out)
}HÀmtning av listan över aktiva containrar
Detta exempel Àr ekvivalent med att köra kommandot 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)
}
// HÀmta listan över aktiva containrar (docker ps)
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
panic(err)
}
// Skriv ut alla container-ID:n
for _, container := range containers {
fmt.Println(container.ID)
}
}
Stoppa alla aktiva containrar
Efter att du har lÀrt dig att skapa och starta containrar Àr det dags att lÀra sig att hantera dem. NÀsta exempel stoppar alla aktiva containrar.
Kör inte denna kod i produktion servern!
paket huvud
import (
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
funktion huvud() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// HÀmtning av lista över körande containrar (docker ps)
containrar, err := cli.ContainerList(ctx, types.ContainerListOptions{})
if err != nil {
panic(err)
}
för _, c := range containrar {
fmt.Print("Stoppar container ", c.ID[:10], "... ")
if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
panic(err)
}
fmt.Println("Lyckades")
}
}Utskrift av loggar för enskild container
Du kan arbeta med enskilda containrar. I följande exempel skrivs loggarna för containern med det angivna ID:t ut. Innan du kör det mÄste du Àndra containerns ID vars loggar du vill hÀmta.
paket huvud
import (
"context"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
funktion huvud() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
options := types.ContainerLogsOptions{ShowStdout: true}
// Ăndra ID för containern hĂ€r
out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out)
}HÀmtning av lista över bilder
Detta exempel Àr ekvivalent med att köra kommandot docker image ls
paket huvud
import (
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
funktion huvud() {
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// HÀmtning av lista över bilder
bilder, err := cli.ImageList(context.Background(), types.ImageListOptions{})
if err != nil {
panic(err)
}
för _, bild := range bilder {
fmt.Println(bild.ID)
}
}
Pull
Detta exempel Àr ekvivalent med att köra kommandot docker pull
paket huvud
import (
"context"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
funktion huvud() {
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)
}
Nedladdning av bild med anvÀndarauthentisering
Detta exempel Àr ekvivalent med att köra kommandot docker pull, med autentisering.
Autentiseringsuppgifterna skickas i klartext. Officiella docker-registry anvÀnder HTTPS,
privata registry bör ocksÄ konfigureras för att överföra data med hjÀlp av 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)
}
// Skapa en konfiguration för autentiseringsdata
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)
}KĂ€lla: habr.com
