Serverdəki konteynerləri avtomatik yeniləmək/çalışdırmaq üçün docker hub-dan və ya reyestrdən qarmaqları tutmaq üçün öz velosipedinizi yazmağa qərar verdiyiniz zaman sisteminizdə Docker demonunu idarə etməyə kömək edəcək Docker Cli-ni faydalı tapa bilərsiniz.
İşləmək üçün sizə 1.9.4-dən aşağı olmayan Go versiyası lazımdır
Əgər hələ də modullara keçməmisinizsə, Cli-ni aşağıdakı əmrlə quraşdırın:
go get github.com/docker/docker/client
Konteyneri idarə etmək
Aşağıdakı nümunə Docker API istifadə edərək konteynerin necə işlədiləcəyini göstərir. Komanda xəttində əmrdən istifadə edərdiniz docker run
, lakin xidmətimizdə bu işin öhdəsindən asanlıqla gələ bilərik.
Bu nümunə əmri yerinə yetirməyə bərabərdir 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)
}
Çalışan konteynerlərin siyahısını əldə etmək
Bu nümunə əmri yerinə yetirməyə bərabərdir 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)
}
}
Bütün işləyən konteynerlərin dayandırılması
Konteynerləri necə yaratmağı və idarə etməyi öyrəndikdən sonra onları necə idarə etməyi öyrənməyin vaxtı gəldi. Aşağıdakı nümunə bütün işləyən konteynerləri dayandıracaq.
Bu kodu istehsal serverində işlətməyin!
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")
}
}
Tək konteyner üçün qeydlər göstərilir
Fərdi qablarla işləyə bilərsiniz. Aşağıdakı nümunə müəyyən identifikatorla konteyner qeydlərini göstərir. Başlamazdan əvvəl qeydlərini almaq istədiyiniz konteynerin identifikatorunu dəyişdirməlisiniz.
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)
}
Şəkillərin siyahısının alınması
Bu nümunə əmri yerinə yetirməyə bərabərdir 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)
}
}
Çəkmək
Bu nümunə əmri yerinə yetirməyə bərabərdir 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)
}
İstifadəçi identifikasiyası ilə şəkil endirilir
Bu nümunə əmri yerinə yetirməyə bərabərdir docker pull
, autentifikasiya ilə.
Doğrulama məlumatları aydın mətnlə göndərilir. Rəsmi docker reyestri HTTPS-dən istifadə edir,
şəxsi registrlər də HTTPS istifadə edərək məlumat ötürmək üçün konfiqurasiya edilməlidir.
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)
}
Mənbə: www.habr.com