Όταν αποφασίζετε να γράψετε το ποδήλατό σας για να πιάσει γάντζους από το docker hub ή από το μητρώο για αυτόματη ενημέρωση/εκκίνηση των κοντέινερ στον διακομιστή, ένα 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")
}
}
κούτσουρα εξόδου ενός μόνο κοντέινερ
Μπορείτε να εργαστείτε με μεμονωμένα δοχεία. Το ακόλουθο παράδειγμα εκτυπώνει τα αρχεία καταγραφής του κοντέινερ με το καθορισμένο αναγνωριστικό. Πριν ξεκινήσετε, πρέπει να αλλάξετε το αναγνωριστικό του κοντέινερ του οποίου τα αρχεία καταγραφής θέλετε να λάβετε.
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