Сервер дээрх контейнеруудыг автоматаар шинэчлэх/ажиллуулахын тулд та докерын төвөөс эсвэл бүртгэлийн газраас дэгээ барих дугуйгаа бичихээр шийдсэн бол Docker Cli нь таны систем дээрх Docker демоныг удирдахад тустай байх болно.
Ажиллахын тулд танд 1.9.4-ээс доошгүй Go хувилбар хэрэгтэй болно
Хэрэв та модуль руу шилжиж амжаагүй бол Cli-г дараах тушаалаар суулгана уу.
go get github.com/docker/docker/client
Контейнер ажиллуулж байна
Дараах жишээ нь Docker API ашиглан контейнерийг хэрхэн ажиллуулахыг харуулж байна. Тушаалын мөрөнд та тушаалыг ашиглах болно docker run
, гэхдээ бид үйлчилгээндээ энэ ажлыг хялбархан даван туулж чадна.
Энэ жишээ нь тушаалыг ажиллуулахтай тэнцүү юм 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)
}
Ажиллаж байгаа савны жагсаалтыг авч байна
Энэ жишээ нь тушаалыг ажиллуулахтай тэнцүү юм 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)
}
}
Ажиллаж байгаа бүх савыг зогсоож байна
Контейнер хэрхэн үүсгэж, ажиллуулж сурсан бол тэдгээрийг хэрхэн удирдах талаар суралцах цаг болжээ. Дараах жишээ нь ажиллаж байгаа бүх контейнерийг зогсоох болно.
Энэ кодыг үйлдвэрлэлийн сервер дээр ажиллуулж болохгүй!
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")
}
}
Нэг контейнерт зориулсан логуудыг харуулж байна
Та бие даасан савтай ажиллах боломжтой. Дараах жишээнд заасан танигчтай контейнерийн бүртгэлийг харуулав. Эхлэхээсээ өмнө бүртгэлийг хүлээн авахыг хүсч буй контейнерийн ID-г өөрчлөх шаардлагатай.
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)
}
Зургийн жагсаалтыг авч байна
Энэ жишээ нь тушаалыг ажиллуулахтай тэнцүү юм 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)
}
}
Татах
Энэ жишээ нь тушаалыг ажиллуулахтай тэнцүү юм 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)
}
Хэрэглэгчийн баталгаажуулалт бүхий зургийг татаж авч байна
Энэ жишээ нь тушаалыг ажиллуулахтай тэнцүү юм docker pull
, баталгаажуулалттай.
Баталгаажуулалтын өгөгдлийг тодорхой текстээр илгээдэг. Албан ёсны докерын бүртгэл нь HTTPS ашигладаг.
хувийн бүртгэлийг 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)
}
Эх сурвалж: www.habr.com