Сервердегі контейнерлерді автоматты түрде жаңарту/іске қосу үшін докер хабынан немесе тізілімнен ілмектерді ұстау үшін өзіңіздің велосипедіңізді жазуды шешкен кезде, жүйеңіздегі Docker демонын басқаруға көмектесетін Docker Cli пайдалы болуы мүмкін.
Жұмыс істеу үшін 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")
}
}
Бір контейнерге арналған журналдарды көрсету
Сіз жеке контейнерлермен жұмыс істей аласыз. Келесі мысал контейнер журналдарын көрсетілген идентификатормен көрсетеді. Бастамас бұрын журналдарын алғыңыз келетін контейнердің идентификаторын өзгертуіңіз керек.
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