As jo beslute om jo eigen fyts te skriuwen foar it fangen fan heakken fan 'e docker-hub of fan' e registraasje om konteners op 'e tsjinner automatysk te aktualisearjen / út te fieren, kinne jo de Docker Cli nuttich fine, wat sil helpe om de Docker-daemon op jo systeem te behearjen.
Om te wurkjen sille jo Go-ferzje net leger as 1.9.4 nedich wêze
As jo noch net oerskeakele binne nei modules, ynstallearje Cli mei it folgjende kommando:
go get github.com/docker/docker/client
It útfieren fan in kontener
It folgjende foarbyld lit sjen hoe't jo in kontener útfiere mei de Docker API. Op de kommandorigel soene jo it kommando brûke docker run
, mar wy kinne maklik omgean mei dizze taak yn ús tsjinst.
Dit foarbyld is lykweardich oan it útfieren fan it kommando docker run alpine echo hello world
package main {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// Делаем 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("Unable to get the port")
}
portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}}
// Создаем контейнер с заданной конфигурацией
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)
}
// Запускаем контейнер
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
// Получаем логи контейнера
out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out)
}
In list krije mei rinnende konteners
Dit foarbyld is lykweardich oan it útfieren fan it kommando 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)
}
// Получение списка запуцщенных контейнеров(docker ps)
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
panic(err)
}
// Вывод всех идентификаторов контейнеров
for _, container := range containers {
fmt.Println(container.ID)
}
}
Stopje alle rinnende konteners
As jo ienris leard hawwe hoe't jo konteners kinne oanmeitsje en útfiere, is it tiid om te learen hoe't jo se kinne beheare. It folgjende foarbyld sil alle rinnende konteners stopje.
Rinne dizze koade net op in produksjetsjinner!
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)
}
// Получение списка запуцщенных контейнеров(docker ps)
containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
if err != nil {
panic(err)
}
for _, c := range containers {
fmt.Print("Stopping container ", c.ID[:10], "... ")
if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
panic(err)
}
fmt.Println("Success")
}
}
Logboeken werjaan foar ien kontener
Jo kinne wurkje mei yndividuele konteners. It folgjende foarbyld toant container logs mei de oantsjutte identifier. Foardat jo begjinne, moatte jo de ID feroarje fan 'e kontener waans logs jo wolle ûntfange.
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}
// Измените id контейнера здесь
out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out)
}
In list mei ôfbyldings krije
Dit foarbyld is lykweardich oan it útfieren fan it kommando 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)
}
// Получение списка образов
images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
if err != nil {
panic(err)
}
for _, image := range images {
fmt.Println(image.ID)
}
}
Lûke
Dit foarbyld is lykweardich oan it útfieren fan it kommando 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)
}
It downloaden fan in ôfbylding mei brûkersautentikaasje
Dit foarbyld is lykweardich oan it útfieren fan it kommando docker pull
, mei autentikaasje.
Autentikaasjegegevens wurde ferstjoerd yn dúdlike tekst. It offisjele docker-register brûkt HTTPS,
privee registers moatte ek konfigurearre wurde om gegevens oer te dragen mei 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)
}
// Создание конфига с данными для аутентификации
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)
}
Boarne: www.habr.com