Kai nuspręsite sukurti savo dviratį, skirtą gaudyti kabliukus iš dokerio šakotuvo arba iš registro, kad automatiškai atnaujintumėte / paleistumėte konteinerius serveryje, jums gali būti naudinga „Docker Cli“, kuri padės valdyti „Docker“ demoną jūsų sistemoje.
Norėdami dirbti, jums reikės „Go“ versijos, ne žemesnės nei 1.9.4
Jei vis dar neperjungėte prie modulių, įdiekite Cli naudodami šią komandą:
go get github.com/docker/docker/client
Paleisti konteinerį
Šiame pavyzdyje parodyta, kaip paleisti konteinerį naudojant Docker API. Komandinėje eilutėje turėtumėte naudoti komandą docker run
, bet mes galime lengvai susidoroti su šia užduotimi savo tarnyboje.
Šis pavyzdys prilygsta komandos vykdymui 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)
}
Gaunamas veikiančių konteinerių sąrašas
Šis pavyzdys prilygsta komandos vykdymui 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)
}
}
Visų veikiančių konteinerių sustabdymas
Kai išmoksite kurti ir paleisti konteinerius, laikas išmokti juos tvarkyti. Šis pavyzdys sustabdys visus veikiančius konteinerius.
Neleiskite šio kodo gamybos serveryje!
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")
}
}
Rodomi vieno konteinerio žurnalai
Galite dirbti su atskirais konteineriais. Šiame pavyzdyje rodomi konteinerių žurnalai su nurodytu identifikatoriumi. Prieš pradėdami, turite pakeisti konteinerio, kurio žurnalus norite gauti, ID.
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)
}
Gauti vaizdų sąrašą
Šis pavyzdys prilygsta komandos vykdymui 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)
}
}
Traukti
Šis pavyzdys prilygsta komandos vykdymui 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)
}
Vaizdo atsisiuntimas su vartotojo autentifikavimu
Šis pavyzdys prilygsta komandos vykdymui docker pull
, su autentifikavimu.
Autentifikavimo duomenys siunčiami aiškiu tekstu. Oficialus dokų registras naudoja HTTPS,
privatūs registrai taip pat turi būti sukonfigūruoti taip, kad perduotų duomenis naudojant 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)
}
Šaltinis: www.habr.com