Сервердеги контейнерлерди автоматтык түрдө жаңыртуу/иштетүү үчүн докер хабынан же реестрден илгичтерди кармоо үчүн өз велосипедиңизди жазууну чечкениңизде, сиз 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
, аутентификация менен.
Аутентификация маалыматтары ачык текстте жөнөтүлөт. Расмий докер реестри 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)
}
Source: www.habr.com