هنگامی که تصمیم می گیرید دوچرخه خود را برای گرفتن قلاب از داکر هاب یا از رجیستری بنویسید تا به طور خودکار کانتینرها را روی سرور به روز کنید/اجرا کنید، ممکن است Docker Cli برای شما مفید باشد که به مدیریت شبح داکر در سیستم شما کمک می کند.
برای کار به نسخه 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")
}
}
نمایش سیاهههای مربوط به یک ظرف
می توانید با ظروف جداگانه کار کنید. مثال زیر گزارش های کانتینر را با شناسه مشخص شده نمایش می دهد. قبل از شروع، باید شناسه محفظهای را که میخواهید گزارشهای آن را دریافت کنید، تغییر دهید.
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
، با احراز هویت
داده های احراز هویت به صورت متن واضح ارسال می شود. رجیستری رسمی docker از 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