αα
αααα’ααααααααα
α
α·αααααααααααααααΆαααααα½αααααα’ααααααααΆααααΆαα
αΆαααααααααΈααααααααα docker α¬ααΈαααααΈαααααααΎααααΈααααΎαα
αα
α»ααααααααΆα/ααααΎαααΆααα»αααΊααααααααααααααααααα·αα
ααΎαααΆαααΈααα α’αααα’αΆα
ααααΎα Docker Cli ααΆααααααααα αααααΉααα½αααααααααα Docker daemon αα
ααΎααααααααααααα’αααα
ααΎααααΈααααΎαααΆαα’αααααΉαααααΌαααΆααααα 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
ααΆαα½αααΉαααΆααααααααααΆααα
αα·αααααααααααααααΆααααααΌαααΆαααααΎααΆα’αααααα αααΆααααΆααα ααΆαα α»ααααααΈ docker ααααΌαααΆαααααΎ 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)
}
ααααα: www.habr.com