Kad nolemjat rakstīt savu velosipēdu, lai noķertu āķus no Docker centrmezgla vai no reģistra, lai automātiski atjauninātu/startētu konteinerus serverī, Docker Cli var noderēt, lai palīdzētu pārvaldīt Docker dēmonu jūsu sistēmā.
Lai strādātu, ir nepieciešama Go versija vismaz 1.9.4
Ja joprojām neesat pārslēdzies uz moduļiem, instalējiet Cli ar šādu komandu:
go get github.com/docker/docker/client
Konteinera palaišana
Šajā piemērā parādīts, kā palaist konteineru, izmantojot Docker API. Komandrindā jūs izmantotu komandu docker run
, taču mēs varam viegli tikt galā ar šo uzdevumu mūsu pakalpojumā.
Šis piemērs ir līdzvērtīgs komandas palaišanai 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)
}
Darbojošo konteineru saraksta iegūšana
Šis piemērs ir līdzvērtīgs komandas palaišanai 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)
}
}
Apturiet visus darbojošos konteinerus
Tagad, kad esat iemācījies izveidot un palaist konteinerus, ir pienācis laiks uzzināt, kā tos pārvaldīt. Šis piemērs apturēs visus darbojošos konteinerus.
Nepalaidiet šo kodu ražošanas serverī!
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")
}
}
Viena konteinera izvades žurnāli
Jūs varat strādāt ar atsevišķiem konteineriem. Nākamajā piemērā tiek izvadīti konteinera žurnāli ar norādīto ID. Pirms darba sākšanas ir jāmaina konteinera ID, kura žurnālus vēlaties iegūt.
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)
}
Attēlu saraksta iegūšana
Šis piemērs ir līdzvērtīgs komandas palaišanai 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)
}
}
Vilkt
Šis piemērs ir līdzvērtīgs komandas palaišanai 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)
}
Attēla lejupielāde ar lietotāja autentifikāciju
Šis piemērs ir līdzvērtīgs komandas palaišanai docker pull
, ar autentifikāciju.
Autentifikācijas dati tiek nosūtīti skaidrā tekstā. Oficiālie dokeru reģistri izmanto HTTPS,
privātie reģistri ir arī jākonfigurē, lai sazinātos, izmantojot 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)
}
Avots: www.habr.com