Кога ќе одлучите да го напишете велосипедот за да фаќа куки од докерскиот центар или од регистарот за автоматско ажурирање/стартување на контејнерите на серверот, Docker Cli може да ви помогне да управувате со демонот на Docker на вашиот систем.
За да работите, потребна ви е верзијата Go најмалку 1.9.4
Ако сè уште не сте се префрлиле на модули, инсталирајте го 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. Пред да започнете, треба да го промените 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