ΠΠ°Π΄Π° ΠΎΠ΄Π»ΡΡΠΈΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈ Π±ΠΈΡΠΈΠΊΠ» Π·Π° Ρ
Π²Π°ΡΠ°ΡΠ΅ ΡΠ΄ΠΈΡΠ° ΠΈΠ· Π΄ΠΎΡΠΊΠ΅Ρ ΡΠ²ΠΎΡΠΈΡΡΠ° ΠΈΠ»ΠΈ ΠΈΠ· ΡΠ΅Π³ΠΈΡΡΡΠ° Π·Π° Π°ΡΡΠΎΠΌΠ°ΡΡΠΊΠΎ Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅/ΠΏΠΎΠΊΡΠ΅ΡΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡ, ΠΌΠΎΠΆΠ΄Π° ΡΠ΅ Π²Π°ΠΌ Π±ΠΈΡΠΈ ΠΊΠΎΡΠΈΡΡΠ°Π½ ΠΠΎΡΠΊΠ΅Ρ Π¦Π»ΠΈ, ΠΊΠΎΡΠΈ ΡΠ΅ Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΡΠΈ Π΄Π° ΡΠΏΡΠ°Π²ΡΠ°ΡΠ΅ ΠΠΎΡΠΊΠ΅Ρ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ Π½Π° Π²Π°ΡΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠ° Π±ΠΈΡΡΠ΅ ΡΠ°Π΄ΠΈΠ»ΠΈ, Π±ΠΈΡΠ΅ Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±Π½Π° ΠΠΎ Π²Π΅ΡΠ·ΠΈΡΠ° ΠΊΠΎΡΠ° Π½ΠΈΡΠ΅ Π½ΠΈΠΆΠ° ΠΎΠ΄ 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)
}
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ Π°Π±Ρ.ΡΠΎΠΌ