Π£ΠΏΡ€Π°Π²Ρ™Π°ΡšΠ΅ Π”ΠΎΡ†ΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΠΌΠ° Ρƒ Π“ΠΎ

Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°!

Када ΠΎΠ΄Π»ΡƒΡ‡ΠΈΡ‚Π΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ сопствСни Π±ΠΈΡ†ΠΈΠΊΠ» Π·Π° Ρ…Π²Π°Ρ‚Π°ΡšΠ΅ ΡƒΠ΄ΠΈΡ†Π° ΠΈΠ· Π΄ΠΎΡ†ΠΊΠ΅Ρ€ Ρ‡Π²ΠΎΡ€ΠΈΡˆΡ‚Π° ΠΈΠ»ΠΈ ΠΈΠ· рСгистра Π·Π° аутоматско Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅/ΠΏΠΎΠΊΡ€Π΅Ρ‚Π°ΡšΠ΅ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€Π° Π½Π° сСрвСру, ΠΌΠΎΠΆΠ΄Π° Ρ›Π΅ Π²Π°ΠΌ Π±ΠΈΡ‚ΠΈ користан Π”ΠΎΡ†ΠΊΠ΅Ρ€ Π¦Π»ΠΈ, који Ρ›Π΅ Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΡ›ΠΈ Π΄Π° ΡƒΠΏΡ€Π°Π²Ρ™Π°Ρ‚Π΅ Π”ΠΎΡ†ΠΊΠ΅Ρ€ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ Π½Π° вашСм систСму.
Π£ΠΏΡ€Π°Π²Ρ™Π°ΡšΠ΅ Π”ΠΎΡ†ΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΠΌΠ° Ρƒ Π“ΠΎ

Π”Π° бистС Ρ€Π°Π΄ΠΈΠ»ΠΈ, Π±ΠΈΡ›Π΅ Π²Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° Π“ΠΎ Π²Π΅Ρ€Π·ΠΈΡ˜Π° која нијС Π½ΠΈΠΆΠ° ΠΎΠ΄ 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)
}

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€