Sunucudaki kapsayıcıları otomatik olarak güncellemek/çalıştırmak için docker hub'ından veya kayıt defterinden kancaları yakalamak için kendi bisikletinizi yazmaya karar verdiğinizde, sisteminizdeki Docker arka plan programını yönetmenize yardımcı olacak Docker Cli'yi yararlı bulabilirsiniz.
Çalışmak için 1.9.4'ten düşük olmayan Go sürümüne ihtiyacınız olacak
Hala modüllere geçmediyseniz aşağıdaki komutla Cli'yi yükleyin:
go get github.com/docker/docker/client
Konteyner çalıştırma
Aşağıdaki örnek, Docker API'sini kullanarak bir konteynerin nasıl çalıştırılacağını gösterir. Komut satırında şu komutu kullanırsınız: docker run
, ancak hizmetimizde bu görevin üstesinden kolaylıkla gelebiliriz.
Bu örnek, komutu çalıştırmaya eşdeğerdir 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)
}
Çalışan konteynerlerin listesini alma
Bu örnek, komutu çalıştırmaya eşdeğerdir 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)
}
}
Çalışan tüm konteynerlerin durdurulması
Container'ları nasıl oluşturup çalıştıracağınızı öğrendikten sonra, onları nasıl yöneteceğinizi öğrenmenin zamanı geldi. Aşağıdaki örnek, çalışan tüm kapsayıcıları durduracaktır.
Bu kodu bir üretim sunucusunda çalıştırmayın!
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")
}
}
Tek bir kapsayıcıya ilişkin günlükleri görüntüleme
Bireysel kaplarla çalışabilirsiniz. Aşağıdaki örnek, belirtilen tanımlayıcıya sahip konteyner günlüklerini görüntüler. Başlamadan önce loglarını almak istediğiniz konteynerin ID’sini değiştirmeniz gerekmektedir.
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)
}
Resimlerin bir listesini alma
Bu örnek, komutu çalıştırmaya eşdeğerdir 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)
}
}
Çekme
Bu örnek, komutu çalıştırmaya eşdeğerdir 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)
}
Kullanıcı kimlik doğrulamasıyla bir görüntüyü indirme
Bu örnek, komutu çalıştırmaya eşdeğerdir docker pull
, kimlik doğrulama ile.
Kimlik doğrulama verileri açık metin olarak gönderilir. Resmi liman işçisi kayıt defteri HTTPS'yi kullanır,
özel kayıtların da verileri HTTPS kullanarak aktaracak şekilde yapılandırılması gerekir.
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)
}
Kaynak: habr.com