Када одлучите да напишете сопствени бицикл за хватање удица из доцкер чворишта или из регистра за аутоматско ажурирање/покретање контејнера на серверу, можда ће вам бити користан Доцкер Цли, који ће вам помоћи да управљате Доцкер демоном на вашем систему.
Да бисте радили, биће вам потребна Го верзија која није нижа од 1.9.4
Ако још увек нисте прешли на модуле, инсталирајте Цли следећом командом:
go get github.com/docker/docker/client
Покретање контејнера
Следећи пример показује како да покренете контејнер користећи Доцкер АПИ. На командној линији бисте користили команду 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
, са аутентификацијом.
Подаци за аутентификацију се шаљу у чистом тексту. Званични доцкер регистар користи ХТТПС,
приватни регистри такође морају бити конфигурисани за пренос података користећи ХТТПС.
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)
}
Извор: ввв.хабр.цом