Kun päätät kirjoittaa pyöräsi kiinnittääksesi koukut Docker-keskittimestä tai rekisteristä päivittääksesi/käynnistääksesi kontteja automaattisesti palvelimella, Docker Cli voi olla hyödyllinen auttamaan järjestelmäsi Docker-daemonin hallinnassa.
Toimiaksesi tarvitset Go-version vähintään 1.9.4
Jos et vieläkään ole vaihtanut moduuleihin, asenna Cli seuraavalla komennolla:
go get github.com/docker/docker/client
Säiliön pyörittäminen
Seuraava esimerkki näyttää, kuinka säilö suoritetaan Docker API:n avulla. Komentorivillä käyttäisit komentoa docker run
, mutta selviämme tästä tehtävästä helposti palvelussamme.
Tämä esimerkki vastaa komennon suorittamista 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)
}
Haetaan luettelo käynnissä olevista säilöistä
Tämä esimerkki vastaa komennon suorittamista 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)
}
}
Pysäytä kaikki käynnissä olevat säiliöt
Kun olet oppinut luomaan ja suorittamaan säilöjä, on aika oppia hallitsemaan niitä. Seuraava esimerkki pysäyttää kaikki käynnissä olevat säilöt.
Älä suorita tätä koodia tuotantopalvelimella!
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")
}
}
Tulosta lokit yksittäisestä säiliöstä
Voit työskennellä yksittäisten säiliöiden kanssa. Seuraava esimerkki tulostaa määritetyn tunnuksen sisältävän säilön lokit. Ennen käynnistämistä sinun on vaihdettava sen säilön tunnus, jonka lokit haluat saada.
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)
}
Kuvaluettelon saaminen
Tämä esimerkki vastaa komennon suorittamista 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)
}
}
Vedä
Tämä esimerkki vastaa komennon suorittamista 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)
}
Kuvan lataaminen käyttäjän todennuksella
Tämä esimerkki vastaa komennon suorittamista docker pull
, todennuksella.
Todennustiedot lähetetään selkeänä tekstinä. Viralliset telakointirekisterit käyttävät HTTPS:ää,
yksityiset rekisterit on myös määritettävä kommunikoimaan HTTPS:n avulla.
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)
}
Lähde: will.com