Gava ku hûn biryar didin ku hûn bisîklêta xwe ji bo girtina çengelan ji navenda dockerê an ji qeydê binivîsin da ku bixweber konteynerên li ser serverê nûve bikin/rêvebirin, dibe ku hûn Docker Cli kêrhatî bibînin, ku dê ji we re bibe alîkar ku daemonê Docker-ê li ser pergala we birêve bibe.
Ji bo xebatê hûn ê hewceyê guhertoya Go ne ji 1.9.4 kêmtir bin
Ger we hîn jî neguherî modulan, Cli bi fermana jêrîn saz bikin:
go get github.com/docker/docker/client
Konteynir dimeşîne
Mînaka jêrîn destnîşan dike ka meriv çawa konteynir bi karanîna Docker API-ê dimeşîne. Li ser rêza fermanê hûn ê fermanê bikar bînin docker run
, lê em dikarin di xizmeta xwe de bi hêsanî bi vî karî rabin.
Ev nimûne bi xebitandina fermanê re wekhev e 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)
}
Danîna navnîşek konteynerên xebitandinê
Ev nimûne bi xebitandina fermanê re wekhev e 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)
}
}
Rawestandina hemî konteynerên ku diçin
Gava ku we fêr kir ku meriv çawa konteyneran biafirîne û bi rê ve bibe, wextê wê ye ku hûn fêr bibin ka meriv wan çawa çawa birêve dibe. Mînaka jêrîn dê hemî konteynerên xebitandinê rawestîne.
Vê kodê li ser serverek hilberandinê nemeşînin!
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")
}
}
Nîşandana têketinên ji bo konteynirek yekane
Hûn dikarin bi konteynerên kesane re bixebitin. Mînaka jêrîn têketinên konteynerê bi nasnavê diyarkirî nîşan dide. Berî ku hûn dest pê bikin, hûn hewce ne ku nasnameya konteynera ku têketinên ku hûn dixwazin bistînin biguhezînin.
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)
}
Danîna navnîşek wêneyan
Ev nimûne bi xebitandina fermanê re wekhev e 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)
}
}
Kişandin
Ev nimûne bi xebitandina fermanê re wekhev e 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)
}
Daxistina wêneyek bi piştrastkirina bikarhêner
Ev nimûne bi xebitandina fermanê re wekhev e docker pull
, bi erêkirinê.
Daneyên erêkirinê bi nivîsek zelal têne şandin. Registry docker ya fermî HTTPS bikar tîne,
divê qeydên taybet jî werin mîheng kirin ku daneyan bi karanîna HTTPS veguhezînin.
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