మీరు డాకర్ హబ్ నుండి లేదా రిజిస్ట్రీ నుండి హుక్స్ పట్టుకోవడం కోసం మీ స్వంత బైక్ను వ్రాయాలని నిర్ణయించుకున్నప్పుడు, సర్వర్లో కంటైనర్లను ఆటోమేటిక్గా అప్డేట్ చేయడానికి/రన్ చేయడానికి, మీరు మీ సిస్టమ్లో డాకర్ డెమోన్ను నిర్వహించడంలో సహాయపడే డాకర్ క్లి ఉపయోగకరంగా ఉండవచ్చు.
పని చేయడానికి మీకు 1.9.4 కంటే తక్కువ కాకుండా గో వెర్షన్ అవసరం
మీరు ఇప్పటికీ మాడ్యూల్లకు మారకపోతే, కింది ఆదేశంతో Cliని ఇన్స్టాల్ చేయండి:
go get github.com/docker/docker/client
కంటైనర్ను నడుపుతోంది
కింది ఉదాహరణ డాకర్ 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")
}
}
ఒకే కంటైనర్ కోసం లాగ్లను ప్రదర్శిస్తోంది
మీరు వ్యక్తిగత కంటైనర్లతో పని చేయవచ్చు. కింది ఉదాహరణ పేర్కొన్న ఐడెంటిఫైయర్తో కంటైనర్ లాగ్లను ప్రదర్శిస్తుంది. ప్రారంభించడానికి ముందు, మీరు లాగ్లను స్వీకరించాలనుకుంటున్న కంటైనర్ 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)
}
చిత్రాల జాబితాను పొందడం
ఈ ఉదాహరణ ఆదేశాన్ని అమలు చేయడానికి సమానం 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
, ప్రమాణీకరణతో.
ప్రామాణీకరణ డేటా స్పష్టమైన వచనంలో పంపబడుతుంది. అధికారిక డాకర్ రిజిస్ట్రీ 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