Mengelola Kontainer Docker di Go

Dokumentasi!


Ketika Anda memutuskan untuk menulis sepeda sendiri dengan menghubungkan dari hub docker atau dari registri untuk secara otomatis memperbarui / meluncurkan kontainer di server, Anda mungkin perlu Docker Cli, yang akan membantu mengelola daemon Docker pada sistem Anda.
gambar


Agar berfungsi, Anda membutuhkan versi Go tidak lebih rendah dari 1.9.4


Jika Anda masih belum beralih ke modul, instal Cli dengan perintah berikut:


go get github.com/docker/docker/client 

Peluncuran kontainer


Contoh berikut menunjukkan cara memulai wadah menggunakan Docker API. Di baris perintah Anda akan menggunakan docker run , tetapi kami dapat dengan mudah mengatasi tugas ini di layanan kami.
Contoh ini setara dengan menjalankan 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) } 

Mendapatkan daftar wadah yang sedang berjalan


Contoh ini setara dengan menjalankan perintah 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) } } 

Hentikan semua wadah yang berjalan


Setelah Anda belajar cara membuat dan menjalankan kontainer, sekarang saatnya untuk belajar cara mengelolanya. Contoh berikut akan menghentikan semua wadah yang berjalan.


Jangan jalankan kode ini di server produksi!

 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") } } 

Logging satu wadah


Anda dapat bekerja dengan wadah individual. Contoh berikut menampilkan log kontainer dengan pengidentifikasi yang ditentukan. Sebelum memulai, Anda perlu mengubah pengidentifikasi wadah yang lognya ingin Anda terima.


 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) } 

Mendapatkan daftar gambar


Contoh ini setara dengan menjalankan 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) } } 

Tarik


Contoh ini setara dengan menjalankan 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) } 

Unduh Gambar dengan Otentikasi Pengguna


Contoh ini setara dengan menjalankan docker pull dengan otentikasi.


Data otentikasi dikirim dalam bentuk teks. Registri buruh pelabuhan resmi menggunakan HTTPS,
Registrasi pribadi juga harus dikonfigurasi untuk mengirimkan data menggunakan 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) } 

Source: https://habr.com/ru/post/id449038/


All Articles