Вақте ки шумо қарор медиҳед, ки велосипеди шахсии худро барои гирифтани қалмоқҳо аз маркази докер ё реестр барои ба таври худкор навсозӣ/кор кардани контейнерҳо дар сервер нависед, шумо метавонед Docker Cli-ро муфид ёбед, ки он ба идоракунии демони Docker дар системаи шумо кӯмак мекунад.
Барои кор ба шумо версияи Go лозим аст, ки на камтар аз 1.9.4
Агар шумо то ҳол ба модулҳо нагузашта бошед, Cli-ро бо фармони зерин насб кунед:
go get github.com/docker/docker/client
Кори контейнер
Мисоли зерин нишон медиҳад, ки чӣ гуна контейнерро бо истифодаи API Docker иҷро кардан мумкин аст. Дар сатри фармон шумо фармонро истифода мебаред 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)
}
Манбаъ: will.com