Когато решите да напишете своя велосипед по ловене на хукове от docker hub или от registry за автоматично обновление/стартиране на контейнери на сървъра, може да ви е полезен 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("Неуспех при получаването на порта")
}
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("Спиране на контейнер ", c.ID[:10], "... ")
if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
panic(err)
}
fmt.Println("Успех")
}
}Извеждане на логовете на отделен контейнер
Можете да работите с отделни контейнери. В следващия пример се извеждат логовете на контейнера с посочения идентификатор. Преди стартиране, трябва да промените идентификатора на контейнера, чийто логове искате да получите.
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)
}
}
Pull
Този пример е еквивалентен на стартирането на командата 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, с удостоверяване.
Данните за удостоверяване се изпращат в открит вид. Официалнитеdocker registry използват HTTPS,
частните registry също трябва да бъдат настроени за предаване на данни с използване на HTTPS.
пакет основен
импорт (
"контекст"
"кодиране/base64"
"кодиране/json"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
функция основна() {
ctx := контекст.Фон()
cli, err := client.NewEnvClient()
ако err != nil {
паника(err)
}
// Създаване на конфиг с данни за удостоверяване
authConfig := types.AuthConfig{
Потребителско име: "username",
Парола: "password",
}
encodedJSON, err := json.Marshal(authConfig)
ако err != nil {
паника(err)
}
authStr := base64.URLEncoding.EncodeToString(encodedJSON)
out, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{RegistryAuth: authStr})
ако err != nil {
паника(err)
}
отложи out.Close()
io.Copy(os.Stdout, out)
}Източник: habr.com
